Показать сообщение отдельно
  #1  
Старый 17.05.2016, 19:02
Аватар для Lothlorien
Lothlorien Lothlorien вне форума
Новичок
 
Регистрация: 06.04.2011
Адрес: Солнечная система
Сообщения: 69
Версия Delphi: 7.0
Репутация: 12
По умолчанию Запутался в формулах :(

Всем привет.

Пытаюсь реализовать автоматический поворот фигуры "лицом" к заданной точке А(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).
Чувствую, что это можно решить более элегантно (и корректно ), но идей никаких. Пользоваться векторной алгеброй? Тогда придется мудрить с превращением численного значения угла в векторное. Говорила мне мама математику учить... :с
__________________
Ne timeas obscurum.
Ответить с цитированием