C++ 使用OpenGL绘制Sierpinski时遇到的问题

C++ 使用OpenGL绘制Sierpinski时遇到的问题,c++,opengl,glut,C++,Opengl,Glut,我正在尝试使用一个函数生成Sierpinski垫片,该函数绘制点模式并生成垫片 但当我编译并运行程序时,它只显示黑屏。问题出在哪里 这是我的密码: #include <Windows.h> #include <gl/GL.h> #include <glut.h> void myInit(void) { glClearColor(1.0, 1.0, 1.0, 0.0); glColor3f(0.0f, 0.0f, 0.0f); glMa

我正在尝试使用一个函数生成Sierpinski垫片,该函数绘制点模式并生成垫片

但当我编译并运行程序时,它只显示黑屏。问题出在哪里

这是我的密码:

#include <Windows.h>
#include <gl/GL.h>
#include <glut.h>

void myInit(void) {
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glColor3f(0.0f, 0.0f, 0.0f);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, 640.0, 0.0, 480.0);
}

class GLintPoint {
    public:
        GLint x, y;
    };

    int random(int m) {
        return rand() % m;
    }

    void drawDot(GLint x, GLint y)
    {
        glBegin(GL_POINTS);
        glVertex2i(x, y);
        glEnd();
    }

    void Sierpinski(void) {
    GLintPoint T[3] = {{ 10, 10 }, {300, 30}, {200, 300}};

    int index = random(3);
    GLintPoint point = T[index];
    for (int i = 0; i < 1000; i++)
    {
        index = random(3);
        point.x = (point.x + T[index].x) / 2;
        point.y = (point.y + T[index].y) / 2;
        drawDot(point.x, point.y);
    }
    glFlush();
}

void main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(640, 480);
    glutInitWindowPosition(100, 150);
    glutCreateWindow("Sierpinski Gasket");
    glutDisplayFunc(drawDot);
    myInit();
    glutMainLoop();
}
#包括
#包括
#包括
void myInit(void){
glClearColor(1.0,1.0,1.0,0.0);
GL3F(0.0f,0.0f,0.0f);
glMatrixMode(GL_投影);
glLoadIdentity();
gluOrtho2D(0.0640.0,0.0480.0);
}
类闪烁点{
公众:
闪烁x,y;
};
int随机(int m){
返回rand()%m;
}
虚空绘制点(闪烁x、闪烁y)
{
glBegin(总分);
glVertex2i(x,y);
格伦德();
}
沃尔德·谢尔宾斯基(沃尔德){
闪烁点T[3]={{10,10},{300,30},{200,300};
int指数=随机(3);
闪烁点=T[指数];
对于(int i=0;i<1000;i++)
{
指数=随机(3);
点x=(点x+T[index].x)/2;
点.y=(点.y+T[index].y)/2;
绘图点(点x、点y);
}
glFlush();
}
void main(整型argc,字符**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
GLUTINITWindowsSize(640480);
位置(100150);
玻璃窗(“Sierpinski垫片”);
glutDisplayFunc(绘图点);
myInit();
glutMainLoop();
}

如果要在白色背景上绘制黑点,则必须清除背景:

glClear( GL_COLOR_BUFFER_BIT );
注意,设置用于清除视图端口的颜色,但不清除任何内容

您的代码应该是这样的:

void drawDot(GLint x, GLint y)
{
    glVertex2i(x, y);
}

void Sierpinski(void) {
    GLintPoint T[3] = {{ 10, 10 }, {300, 30}, {200, 300}};

    int index = random(3);
    GLintPoint point = T[index];

    glClearColor(1.0, 1.0, 1.0, 1.0); // set up white clear color
    glClear( GL_COLOR_BUFFER_BIT );   // clear the back ground (white)

    glMatrixMode( GL_MODELVIEW );
    glPushMatrix();                   // setup model matrix
    glScalef( 1.5f, 1.5f, 1.0f );     // scale the point distribution

    glColor3f( 0.0f, 0.0f, 0.0f );    // set black draw color
    glPointSize( 5.0f );              // set the size of the points 
    glBegin(GL_POINTS);
    for (int i = 0; i < 1000; i++)
    {
        index = random(3);
        point.x = (point.x + T[index].x) / 2;
        point.y = (point.y + T[index].y) / 2;
        drawDot(point.x, point.y);
    }
    glEnd();
    glPopMatrix();                    // reset model matrix

    glFlush();
}
void绘图点(闪烁x、闪烁y)
{
glVertex2i(x,y);
}
沃尔德·谢尔宾斯基(沃尔德){
闪烁点T[3]={{10,10},{300,30},{200,300};
int指数=随机(3);
闪烁点=T[指数];
glClearColor(1.0,1.0,1.0,1.0);//设置白色透明颜色
glClear(GL_COLOR_BUFFER_BIT);//清除背景(白色)
glMatrixMode(GLU模型视图);
glPushMatrix();//设置模型矩阵
glScalef(1.5f,1.5f,1.0f);//缩放点分布
glColor3f(0.0f,0.0f,0.0f);//设置黑色绘制颜色
glPointSize(5.0f);//设置点的大小
glBegin(总分);
对于(int i=0;i<1000;i++)
{
指数=随机(3);
点x=(点x+T[index].x)/2;
点.y=(点.y+T[index].y)/2;
绘图点(点x、点y);
}
格伦德();
glPopMatrix();//重置模型矩阵
glFlush();
}

你画过简单的东西吗,比如一个白点和一个黑点?是的,他们画得很完美,但这不会画任何东西。请同时展示成功画出东西的最小代码,以供参考。问题可能在于使用类似代码和非工作代码的区别。仅供参考,如果您开始学习OpenGL,我建议您从现代(核心配置文件)开始,而不是传统API。像
glBegin
glEnd
等函数调用在2008年被遗留下来:并且将(或已经)被弃用。下面是一段成功绘制3个点的代码:void myDisplay(void){glClearColor(GL_COLOR_BUFFER_位);glBegin(GL_点);glVertex2i(100,50);glVertex2i(100,130);glVertex2i(150130);格伦德();glFlush();}这就解决了问题,我忘了设置绘图函数的颜色。谢谢。@AbdulBasitMehtab查看对答案的更改。你必须调用
glClear
Ok,明白了。但是输出非常小,如何使它变大一点?@AbdulBasitMehtab使用@AbdulBasitMehtab点的分布可以按比例缩放。查看对an的更改回答。