Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Тригонометрия в Delphi

32K
27 октября 2008 года
Nick0241
8 / / 21.01.2008
Приветствие!
Достала меня тригонометрия в Дельфи, пишу все правильно - зависимости между углами и длиннами сторон треугольника, теорема Пифагора и т.д...результат - "кривой"...в общем неверно все работает.
К делу: заготовка у меня для игры (вроде Crimson Land). Есть стрелочка (пока стрелочка), поворачиваться она должна в сторону указателя мыши, при нажатии стрелок - бежать вперед-назад и стрейфиться. Использовал такой код:

Для вычисления угла поворота стрелочки:

if (cmx-pos.x)>=0 then
phi:=arccos((cmy-pos.y)/(sqrt(sqr(cmx-pos.x)+sqr(cmy-pos.y))))
else
phi:=-arccos((cmy-pos.y)/(sqrt(sqr(cmx-pos.x)+sqr(cmy-pos.y)))) ;

где phi - угол поворота, cmy и cmx - координаты мыши в игровом мире, pos(.x .y) - позиция стрелки в игровом мире. Считается не по-людски, это я понимаю, но иные варианты почему-то не работают.

для движения вперед:

dx:=speed*cos(phi-pi/2);
dy:=speed*sin(phi+pi/2);
pos.x:=pos.x+dx;
pos.y:=pos.y+dy;

dx и dy - приращение по осям для движения, speed - скорость, остальное выше описал.

при отрисовки используется функция поворота из OpenGL:

glRotated(-phi*180/pi,0,0,1);

где угол поворота - первый параметр.

Как итог - чушь полнейшая. Может кто уже с подобным разбирался и знает где искать ошибки. Поиск исходников результатов не дал, может конечно искал плохо...

P.S. четыре часа парился с тригонометрией, кошмар какой-то, ничего не получилось, надоело. Обидно было бы бросить, до этого всего за два часа сделал более менее приемлимый редактор 2д ландшафта методом смешивания (blending).
5
27 октября 2008 года
hardcase
4.5K / / 09.08.2005
Проверять формулы лень, но меня всегда настораживала функция SQR - с ней бывали непонятные проблемы, потому рекомендую пользоваться умножением аргумента на самого себя.
551
27 октября 2008 года
Pavia
357 / / 22.04.2004
(cmy-pos.y)/(sqrt(sqr(cmx-pos.x)+sqr(cmy-pos.y))) - это синус
Проще так.
uses Math;
phi:=arctan2(cmy-pos.y,cmx-pos.x);

dx:=speed*cos(phi-pi/2);
dy:=speed*sin(phi+pi/2);
мда
dx:=speed*cos(phi+Pi);
dy:=speed*sin(phi+Pi);

glRotated(-phi*180/pi,0,0,1);
-180/pi - лишее

А еще возможно тут виноват поворот с переносом.
76K
24 января 2016 года
apanaev_dmitriy
11 / / 04.11.2015
dx:=speed*cos((angle+90)*pi/2)
76K
24 января 2016 года
apanaev_dmitriy
11 / / 04.11.2015
dx:=dx+speed*cos((angle+90)*pi/180)
gltranslated(f)(x,y,z);
glrotated(f)(angle,0,1,0);
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог