Как нарисовать ромб с фриглутом? - PullRequest
1 голос
/ 14 марта 2020

Я пытаюсь нарисовать что-то вроде этого изображения целевого вывода, используя OpenGL. Я использую freeglut. Я мог бы нарисовать три полигона, но я не знаю, как правильно расположить три полигона. Ниже я прикрепил целевой выход и мой правильный выход.

Целевой выход

Мой вывод

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

1 Ответ

0 голосов
/ 14 марта 2020

Угол между полигонами составляет 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 и glRotatef, укажите матрицу и умножьте текущую матрицу на новую указанную матрицу. Используйте glPushMatrix / glPopMatrix для сохранения и восстановления матрицы (pu sh включается и извлекается из стека матриц).

Например:

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