如何“手动”旋转一个点?

时间:2014-05-12 20:36:38

标签: c++ opengl glut

我使用以下函数绘制多边形:

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}旋转与此旋转之间存在巨大差异(不仅仅是由于浮点不精确)。

我错过了什么吗?难道没有更好的手动旋转点的方法吗?

1 个答案:

答案 0 :(得分:0)

glRotatef假设角度以度为单位。 sincos假设它是弧度。您可以按如下方式调整您的功能:

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();
}