我使用以下函数绘制多边形:
void DrawFigure(tNo *iniList)
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_LINE_LOOP);
// Run through a linked list and create the points.
for(tNo *p = iniList->prox; p != NULL; p = p->prox)
glVertex2f(p->x, p->y);
glEnd();
glFlush();
}
我知道glRotatef(angle, 0.0f, 0.0f, 1.0f)
并且它确实有效,但由于我有一个链接列表来存储坐标,我希望逐点旋转,然后重新显示图。
目前,我尝试使用
围绕z轴旋转它们void RotateFigure(tNo *iniList, float angle)
{
/* Rotation (assuming origin as reference):
* x' = x.cos(Θ) - y.sin(Θ)
* y' = x.sin(Θ) + y.cos(Θ)
*/
for(tNo *p = iniList->prox; p != NULL; p = p->prox)
{
float oldX = p->x, oldY = p->y;
p->x = oldX * cos(angle) - oldY * sin(angle);
p->y = oldX * sin(angle) + oldY * cos(angle);
}
glutPostRedisplay();
}
但glRotatef
&#39}旋转与此旋转之间存在巨大差异(不仅仅是由于浮点不精确)。
我错过了什么吗?难道没有更好的手动旋转点的方法吗?
答案 0 :(得分:0)
glRotatef
假设角度以度为单位。 sin
和cos
假设它是弧度。您可以按如下方式调整您的功能:
void RotateFigure(tNo *iniList, float angle)
{
float radians = angle * 3.1415926f / 180.0f;
float sine = sin(radians);
float cosine = cos(radians);
for(tNo *p = iniList->prox; p != NULL; p = p->prox)
{
float oldX = p->x, oldY = p->y;
p->x = oldX * cosine - oldY * sine;
p->y = oldX * sine + oldY * cosine;
}
glutPostRedisplay();
}