|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Запутался в формулах :(
Всем привет.
Пытаюсь реализовать автоматический поворот фигуры "лицом" к заданной точке А(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. |
#2
|
|||
|
|||
Ну, давай подумаем.
а). Пусть у нас фигура расположена в точке C(x0,y0) и изначально смотрит "вверх" (угол поворота = 0). б). Дана точка A(x1,y1), "лицом" к которой надо повернуть фигуру. Что нам надо посчитать: 1. На какой угол от центра фигуры "повернута" точка A. 2. На какой относительный угол надо повернуть фигуру. 3. В зависимости от значения угла - в какую сторону надо поворачиваться. 4. Сохранить итоговый угол поворота как текущий угол поворота фигуры. Смотрим. 1. AlphaA := arcsin(abs(x0-x)/sqrt(sqr(x0-x) + sqr(y0-y)); Тут еще надо полусферу добавлять или отнимать (3.14), если y > y0. 2. AlphaR := AlphaA - AlphaC; 3. тут тоже сам сообразишь. лень думать.. 4. AlphaC := AlphaA; ЗЫ. И не забываем, что все тригонометрические функции работают в радианах, а не в грвдусах. ЗЗЫ. А еще проще, наверное, попробовать это сделать на FMX, там, вроде, все эти приколы уже встроенные есть. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Lothlorien (18.05.2016)
|
#3
|
||||
|
||||
Да, лучше перейду на XE2 и не буду изобретать велосипеды
Ne timeas obscurum. |
#4
|
|||
|
|||
В зависимости от того, что тебе надо. Если надо именно самому считать и поворачивать (ну, типа, лаба), то придется по старинке. А если это просто демонстрашка какая, то можно и на FMX. Просто в FMX программирования в данном случае не будет. Просто изменение настроек у комопнентов.
|