Как нарисовать полый круг в openGL C ++ - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь нарисовать полый круг с плавными линиями в окне. И по какой-то причине круг не появляется. До сих пор я нашел код для кругов, но линии зазубрены, и мне нужно, чтобы они были гладкими. Я хочу иметь возможность поместить другой объект в круг в конечном итоге там, где круг ограничивает объект. Ниже мой код:

#include <iostream>
#include <math.h>
#include <GL/glut.h>                // include GLUT library
#include <GL/gl.h>
#include <GL/glu.h>
#include <stdlib.h>
#include <Windows.h>
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
//#include "RGBpixmap.h"
using namespace std;

void DrawCircle()
{
    glBegin(GL_LINE_LOOP);
    for (int i = 0; i <= 300; i++) {
        double angle = 2 * M_PI * i / 300;
        double x = cos(angle);
        double y = sin(angle);
        glVertex2d(x, y);
    }
    glEnd();
}


//***********************************************************************************
void myInit()
{
    glClearColor(1, 1, 1, 0);           // specify a background clor: white 
    gluOrtho2D(-300, 300, -300, 300);  // specify a viewing area
    glPointSize(1);     // change point size back to 1
}

//***********************************************************************************
void myDisplayCallback()
{
    DrawCircle();
    glClear(GL_COLOR_BUFFER_BIT);   // draw the background



    glFlush(); // flush out the buffer contents
}

//***********************************************************************************
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitWindowSize(600, 600);               // specify a window size
    glutInitWindowPosition(100, 0);         // specify a window position
    glutCreateWindow("Drawing Window"); // create a titled window

    myInit();                                   // setting up

    glutDisplayFunc(myDisplayCallback);     // register a callback


    glutMainLoop();                         // get into an infinite loop

    return 0;
}

1 Ответ

2 голосов
/ 15 октября 2019
void myDisplayCallback()
{
    // This call does NOT draw the background, it clears the screen.
    // You should be doing this before drawing anything!
    glClear(GL_COLOR_BUFFER_BIT);

    // and now you can draw on a nice clear screen
    DrawCircle();

    // This doesn't 'flush' the buffers, it waits until the OpenGL
    // command queue has finished executing (i.e. drawing is complete)
    glFlush();
}

Для «гладких» линий в OpenGL наилучшим подходом является включение мультисэмплинга на заднем буфере. См. Раздел здесь о перенасыщении: https://www.khronos.org/opengl/wiki/Multisampling

В вашем случае (если вы вообще не собираетесь использовать двойную буферизацию), вы, вероятно, захотите использовать

glutInitDisplayMode( GLUT_RGBA | GLUT_SINGLE | GLUT_MULTISAMPLE);

и более поздние версии. включите мультисэмплинг с помощью:

glEnable(GL_MULTISAMPLE_ARB);

Я бы, вероятно, также рекомендовал использовать количество делений в вашем круге, например, 180 или 360 (а не 300). Таким образом, с общими углами (например, 30, 45, 90, 180 и т. Д.) Вы будете знать, что у вас всегда есть точка на окружности в этом месте.

...