簡體   English   中英

如何“手動”旋轉點?

[英]How to rotate a point “manually”?

我正在使用以下函數來繪制多邊形:

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的旋轉和此旋轉之間有很大的差異(不僅是由於浮點的不精確性)。

我有什么想念的嗎? 有沒有更好的手動旋轉點的方法?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM