Всем привет.
Пытаюсь реализовать автоматический поворот фигуры "лицом" к заданной точке А(x0, y0), центр фигуры в точке В(x, y). Используя формулы для определения конца отрезка
Код:
x:=x0 + cos(Angle) * Length;
y:=y0 - sin(Angle) * Length;
где Length - расстояние между точками А и В, определил необходимый угол поворота:
Код:
Angle:=Math.ArcCos((x - x0) / Length);
Angle:=Math.ArcSin((y0 - y) / Length);
Потом в коде определяю, которой формулой пользоваться в зависимости от взаимного положения точек (если по иксах между ними слишком маленькое расстояние, то пользуемся формулой для игреков):
Код:
if (abs(X - X0) > Eps) then
dAngle:=Math.ArcCos((X - X0) / D)
else
dAngle:=Math.ArcSin((Y0 - Y) / D);
Потом определяю более рациональное направление поворота и поворачиваю фигуру (её методы RotateLeft, RotateRight отвечают за соответствующий поворот, Angle - её текущий угол поворота):
Код:
if Angle - dAngle > RotationSpeed then
RotateLeft
else
if dAngle - Angle > RotationSpeed then
RotateRight;
Вроде алгебраически правильно, но фигура при выполнении однократно проворачивается кругом своей оси и неподвижно "уставляется" куда-то в угол экрана, независимо от координат точки (x0, y0).
Чувствую, что это можно решить более элегантно (и корректно

), но идей никаких. Пользоваться векторной алгеброй? Тогда придется мудрить с превращением численного значения угла в векторное. Говорила мне мама математику учить... :с