Я пытаюсь создать функцию 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)
Что вы хотите получить? Не могли бы вы описать цель этих манипуляций? Расчеты с offsetAngle выглядят странно. – MBo
Я добавил фотографию, чтобы понять, что мне нужно найти. Спасибо за комментарий. – mickaelb91
Да, теперь все ясно. – MBo