Угол поворота зависит от вектора направления вдоль синусоидальной волны.
Вектор направления можно рассчитать путем вычитания из 2 положений.Вычтите позицию перед текущей позицией из позиций после текущей позиции, чтобы вычислить вектор направления.Далее i
- текущая позиция объекта:
dx = sinex[i+1] - sinex[i-1];
dy = siney[i+1] - siney[i-1];
. Угол поворота можно рассчитать по арк-тангенсу , используя atan2
, который возвращает угол в радианах:
float ang_rad = atan2( dy, dx );
Поскольку угол должен быть равен glRotatef
в градусах, угол необходимо преобразовать из радианов в градусы, прежде чемвращение вокруг оси z может быть выполнено.Полный круг имеет 360 градусов или 2 * Пи радиан.Таким образом, масштаб от радианов до градусов 180 / Pi :
float ang_deg = ang_rad * 180.0f / M_PI;
glRotatef( ang_deg, 0, 0, 1 );
В следующем фрагменте кода cde показано, как применять код.Имейте в виду, что нет проверки границ.Это означает, что i
должно быть больше или равно 1 и меньше количества баллов - 1 (1 <= i < 110
):
#define _USE_MATH_DEFINES
#include <math.h>
{
// [...]
drawsine();
x = sinex[i];
y = siney[i];
dx = sinex[i+1] - sinex[i-1];
dy = siney[i+1] - siney[i-1];
object();
// [...]
}
void object()
{
glPushMatrix();
glTranslatef(x, y, 0);
float ang_rad = atan2( dy, dx );
float ang_deg = ang_rad * 180.0f / M_PI;
glRotatef( ang_deg, 0, 0, 1 );
glColor3f(0.0f, 0.0f, 0.0f);
glBegin(GL_QUADS);
glVertex2f(-0.3, 0.1);
glVertex2f(0.3, 0.1);
glVertex2f(0.3, -0.1);
glVertex2f(-0.3, -0.1);
glEnd();
glPopMatrix();
}