![](/img/trans.png)
[英]How to rotate a QGraphicsPixmap around a point according to mouseMoveEvent?
[英]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
假定角度為度。 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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.