OpenGL - Максимизация / минимизация выходного окна изменяет размеры объекта внутри. Как я могу избежать этого? - PullRequest
1 голос
/ 10 февраля 2020

Как я могу убедиться, что окно вывода либо фиксировано, либо круговой вывод в окне не меняет форму каждый раз, когда я максимизирую / минимизирую окно в OpenGL. Я использую c ++ в Visual Studio 2019 (имеется в виду, что были установлены зависимости glew и glut.) Я пытаюсь создать круг, используя алгоритм рисования средней точки (радиус 5 см, координаты начальной точки (0,3)) и проверяю, что он вращается на 90 градусов потом.

Обратите внимание, что на скриншоте показана окружность, изменившая овальную форму после сворачивания окна. Ссылка на скриншот ...

Код:

    #include <Windows.h>
#include <GL\glew.h>
#include <GL\freeglut.h>
#include <iostream>

using namespace std;

int xForRotation = 000;
int yForRotation = 120;
int rFlag;
double theta = 0.0;

void myinit(void)
{
    glClearColor(1, 1, 1, 0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glutInitWindowSize(1000,1000);
    gluOrtho2D(-1*640.0, 640.0, -1*640.0, 640.0);
    glMatrixMode(GL_MODELVIEW);
}
void circleMidPoint()
{
    int xCenter = 000;
    int yCenter = 240; //3cm
    int radius = 400; //5cm

    int x = 0;
    int y = radius;
    int p = 1 - radius;//5/4 is rounded to 1 for integer radius

    while (x < y) {// iterates to draw the first sector
        x++;
        if (p < 0)// the mid point is inside the circle
            p += 2 * x + 1;
        else {// the mid point is outside or at the circle
            y--;
            p += 2 * (x - y) + 1;
        }
        glBegin(GL_POINTS);
        glVertex2i(xCenter + x, yCenter + y);
        glVertex2i(xCenter - x, yCenter + y);
        glVertex2i(xCenter + x, yCenter - y);
        glVertex2i(xCenter - x, yCenter - y);
        glVertex2i(xCenter + y, yCenter + x);
        glVertex2i(xCenter - y, yCenter + x);
        glVertex2i(xCenter + y, yCenter - x);
        glVertex2i(xCenter - y, yCenter - x);
        glEnd();
    }
    // OPTIONAL:-> center of the circle
    glBegin(GL_POINTS);
    glVertex2i(xCenter, yCenter);
    glEnd();
}
void display()
{

    glClear(GL_COLOR_BUFFER_BIT);     // clear the screen  
    glColor3f(1.0, 0.0, 0.0);          // red foreground
    glPointSize(5.0);// size of points to be drawin (in pixel)

    //establish a coordinate system for the image

    circleMidPoint();
    glFlush(); // send all output to the display

    glLoadIdentity();

        if (rFlag == 1) //Rotate the circle around fixed point
            {
                yForRotation;
                xForRotation;
                theta = 0.25;
            }
        glTranslatef(xForRotation, yForRotation, 0.0);
        glRotatef(theta, 0.0, 0.0, 1.0);
        glTranslatef(-xForRotation, -yForRotation, 0.0);
        glutPostRedisplay();
        glutSwapBuffers();


}

void rotateMenu(int option){
    if (option == 1)
        rFlag = 1;
}

int main(int argc, char** argv){
    glutInit(&argc, argv);
    glutInitWindowSize(640, 480); // set the size of the window
    glutInitWindowPosition(10, 10); // the position of the top-left of window
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutCreateWindow("Midpoint Circle Drawing Algorithm. *Right CLick to Rotate");
    myinit();
    glutDisplayFunc(display); // set the gl display callback function
    glutCreateMenu(rotateMenu);
    glutAddMenuEntry("Rotate Circle", 1);
    glutAttachMenu(GLUT_RIGHT_BUTTON);
    glutMainLoop(); // enter the GL event loop
}

1 Ответ

0 голосов
/ 10 февраля 2020

Для отражения нового размера окна, вы должны добавить обратный вызов glutReshapeFunc. В обратном вызове вы должны адаптировать прямоугольник области просмотра к новому размеру на glViewport. Более того, вам необходимо адаптировать проекцию orthographi c к новому размеру окна.

Размер окна должен быть задан до его создания. Более поздние вызовы glutInitWindowSize не имеют никакого эффекта.

Поскольку проекция orthographi c установлена ​​в reshape, нет необходимости устанавливать ее в myinit.

void myinit(void)
{
    glClearColor(1, 1, 1, 0);
}

void reshape(int width, int height) {
    glViewport(0, 0, width, height);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(-width, width, -height, height);
    glMatrixMode(GL_MODELVIEW);
}

int main(int argc, char** argv) {
    // [...]

    glutInitWindowSize(1000, 1000);
    glutCreateWindow("Midpoint Circle Drawing Algorithm. *Right CLick to Rotate");

    // [...]

    glutReshapeFunc(reshape);

    // [...]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...