2016-11-07 3 views
0

Я пытаюсь создать функцию lookAt в 2 измерениях с помощью Python, так что вот мой код прямо сейчас.Рассчитать функцию LookAt как в двух измерениях

from math import * 

def lookAt(segment, originPoint): 
    segmentCenterPoint = getSegmentCenter(segment) 
    for i in range(2): 
     vtx = getVertex(segment, i) 
     x, y = getVertexCoord(vtx) 
     # Calculate the rotation angle already applied on the polygon 
     offsetAngle = atan2(y - segmentCenterPoint.y, x - segmentCenterPoint.x) 
     # Calculate the rotation angle to orient the polygon to an origin point 
     orientAngle = atan2(segmentCenterPoint.y - originPoint.y, segmentCenterPoint.x - originPoint.x) 
     # Get the final angle 
     finalAngle = orientAngle - (pi/2) 
     if offsetAngle >= pi: 
      offsetAngle -= pi 
     elif offsetAngle < 0: 
      offsetAngle += pi 
     finalAngle += offsetAngle 
     # Temporary move the point to have its rotation pivot to (0,0) 
     tempX = x - segmentCenterPoint.x 
     tempY = y - segmentCenterPoint.y 
     # Calculate coords of the point with the rotation applied 
     s = sin(finalAngle) 
     c = cos(finalAngle) 
     newX = tempX * c - tempY * s 
     newY = tempX * s + tempY * c 
     # Move the point to the initial pivot 
     x = newX + segmentCenterPoint.x 
     y = newY + segmentCenterPoint.y 
     # Apply new coords to the vertex 
     setVertexCoord(vtx, x, y) 

Я попробовал несколько примеров вручную и работали хорошо, но когда я попытался применить функцию на тысячи сегментов, кажется, какой-то сегмент не очень хорошо ориентированным.

Возможно, я что-то пропустил, но не знаю, что это. Кроме того, может быть, есть более быстрый способ рассчитать его?

Благодарим за помощь.

EDIT

Вот визуализация, чтобы лучше понять цель LookAt. Цель состоит в том, чтобы найти координаты A и B, если мы уже знаем O, A и B. ([AB] является сегментом, мы должны ориентироваться перпендикулярно к точке O)

visualization of lookAt

+0

Что вы хотите получить? Не могли бы вы описать цель этих манипуляций? Расчеты с offsetAngle выглядят странно. – MBo

+0

Я добавил фотографию, чтобы понять, что мне нужно найти. Спасибо за комментарий. – mickaelb91

+0

Да, теперь все ясно. – MBo

ответ

0

Чтобы найти позиции A «и B», вам не нужны ротация точек (и дело с углами на все).

Find vector OC = segmentCenterPoint - originPoint 
Make normalized (unit) vector oc = OC/Length(OC) 
Make perpendicular vector P = (-oc.Y, oc.X) 
Find CB length lCB 
Find A' = C + lCB * P 
     B' = C - lCB * P 
+0

Спасибо, что он работает, но я не понимаю, почему координата Y перед X одна в вашем перпендикулярном векторе? – mickaelb91

+1

Это результат умножения на матрицу вращения pi/2 - как ваши новые, новые вычисления – MBo

Смежные вопросы