Тригонометрия в Delphi
Достала меня тригонометрия в Дельфи, пишу все правильно - зависимости между углами и длиннами сторон треугольника, теорема Пифагора и т.д...результат - "кривой"...в общем неверно все работает.
К делу: заготовка у меня для игры (вроде 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).
Проверять формулы лень, но меня всегда настораживала функция SQR - с ней бывали непонятные проблемы, потому рекомендую пользоваться умножением аргумента на самого себя.
Проще так.
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 - лишее
А еще возможно тут виноват поворот с переносом.
dx:=speed*cos((angle+90)*pi/2)
gltranslated(f)(x,y,z);
glrotated(f)(angle,0,1,0);