如何用freeglut画菱形?

How to draw a rhombus with freeglut?

我正在尝试使用 OpenGL 绘制类似目标输出图像的图像。我正在使用 freeglut。我可以画三个多边形,但我不知道如何给这三个多边形正确的定位。下面我附上了目标输出和我的正确输出。

The target output

My output

#include <GL/glut.h>

void init(void)
{
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(-5.0, 5.0, -5.0, 5.0);
    glMatrixMode(GL_MODELVIEW);
}

void drawSquare(void)
{
    glBegin(GL_POLYGON);
    glVertex2f(0.0f, -1.0f);
    glVertex2f(2.0f, 0.0f);
    glVertex2f(0.0f, 1.0f);
    glVertex2f(-2.0f, 0.0f);
    glEnd();
}

void myDraw1(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    glColor3f(1.0, 0.0, 0.0);
    drawSquare();
    glTranslatef(2.0, 3.0, 0.0);
    glRotatef(30, 0.0, 0.0, 1.0);
    glColor3f(0.0, 1.0, 0.0);
    drawSquare();
    glLoadIdentity();
    glTranslatef(-2.0, -3.0, 0.0);
    glRotatef(-30, 0.0, 0.0, 1.0);
    glColor3f(0.0, 0.0, 1.0);
    drawSquare();
    glFlush();
}

void myDraw2(void)
{
    glClear(GL_COLOR_BUFFER_BIT);    
    glLoadIdentity();
    glColor3f(1.0, 0.0, 0.0);
    drawSquare();
    glPushMatrix();
    glTranslatef(2.0, 3.0, 0.0);
    glRotatef(30, 0.0, 0.0, 1.0);
    glColor3f(0.0, 1.0, 0.0);
    drawSquare();
    glPopMatrix();
    glTranslatef(-2.0, -3.0, 0.0);
    glRotatef(-30, 0.0, 0.0, 1.0);
    glColor3f(0.0, 0.0, 1.0);
    drawSquare();
    glFlush();
}

void main(int argc, char** argv)

{

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowPosition(0, 0);
    glutInitWindowSize(600, 600);
    glutCreateWindow("Rotate");
    init();
    glutDisplayFunc(myDraw1);
    glutMainLoop();
}

多边形之间的夹角为120°。多边形的中心是 (0, 0)。您必须围绕点 (-2, 0) 旋转。以将 (-2, 0) 移动到 (0, 0) 的方式平移多边形并旋转多边形:

glRotatef(120.0, 0.0, 0.0, 1.0);
glTranslatef(2.0, 0.0, 0.0);

注意,像 glTranslatef and glRotatef, specify a matrix and multiply the current matrix by the new specified matrix. Use glPushMatrix/glPopMatrix 这样的操作可以保存和恢复矩阵(推入和弹出矩阵堆栈)。

例如:

void myDraw1(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();

    glColor3f(1.0, 0.0, 0.0);
    glPushMatrix();
    glRotatef(90.0, 0.0, 0.0, 1.0);
    glTranslatef(2.0, 0.0, 0.0);
    drawSquare();
    glPopMatrix();

    glColor3f(0.0, 1.0, 0.0);
    glPushMatrix();
    glRotatef(210.0, 0.0, 0.0, 1.0);
    glTranslatef(2.0, 0.0, 0.0);
    drawSquare();
    glPopMatrix();

    glColor3f(0.0, 0.0, 1.0);
    glPushMatrix();
    glRotatef(330.0, 0.0, 0.0, 1.0);
    glTranslatef(2.0, 0.0, 0.0);
    drawSquare();
    glPopMatrix();

    glFlush();
}