Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #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.
Ответить с цитированием
  #2  
Старый 18.05.2016, 07:24
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, давай подумаем.
а). Пусть у нас фигура расположена в точке 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  
Старый 18.05.2016, 11:22
Аватар для Lothlorien
Lothlorien Lothlorien вне форума
Новичок
 
Регистрация: 06.04.2011
Адрес: Солнечная система
Сообщения: 69
Версия Delphi: 7.0
Репутация: 12
По умолчанию

Да, лучше перейду на XE2 и не буду изобретать велосипеды
__________________
Ne timeas obscurum.
Ответить с цитированием
  #4  
Старый 19.05.2016, 16:56
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

В зависимости от того, что тебе надо. Если надо именно самому считать и поворачивать (ну, типа, лаба), то придется по старинке. А если это просто демонстрашка какая, то можно и на FMX. Просто в FMX программирования в данном случае не будет. Просто изменение настроек у комопнентов.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:24.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter