Sierpinski垫片

时间:2014-05-14 23:42:52

标签: c++ opengl

我正在用C / C ++编写代码,我遇到了错误。

#include "glut.h"
#include <random>

// Classes and structs // 
struct GLPoint {
    GLfloat x, y;
};

// Method(s) Declration // 
void drawDot(GLfloat, GLfloat);
void serpinski_render(void);
void myInti(void); 

// Method(s) Implementation // 
void drawDot(GLfloat x, GLfloat y){
    glBegin(GL_POINTS);
    glVertex2i(x, y);
    glEnd();
}
void serpinski_render(void)
{
    glClear(GL_COLOR_BUFFER_BIT);  // Clear the screen from anything is displayed on it 
    GLPoint T[3] = { { 10, 10 }, { 600, 10 }, { 300, 600 } }; // the three points of parent triangle 

    int index = rand() % 3;  // this mean i will choose a random number between 0 , 3 
    GLPoint point = T[index];
    drawDot(point.x, point.y);

    for (unsigned int i = 0; i < 5500; i++) // a loop that going to run 5500 ( a very big number ) 
    {
        index = rand() % 3;
        point.x = (point.x + T[index].x) / 2;
        point.y = (point.y + T[index].y) / 2;

        drawDot(point.x, point.y); 
    }
    glFlush(); 

}
void myInti(void)
{
    glClearColor(1, 1, 1, 0);  // a white background 
    glColor3f(0, 0, 0); // black points 
    glPointSize(3); // 3 pixel point size 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0, 640, 0, 480); 
}


// Main Method //
void main(int argc ,char ** argv )
{
    glutInit(&argc, argv); // intilize toolkit 
    glutInitWindowPosition(100, 150); 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 
    glutInitWindowSize(640, 480); // windows size is 640 x 480 
    glutDisplayFunc(serpinski_render); 

    myInti(); 
    glutMainLoop(); 
}

我不知道它是否会正常工作,但这段代码应该让我产生Sierpinski三角形。 而且每次我使用C ++库时都会面对这种情况下随机lib这个stdlib.h中的问题让我感到困惑从来没有像以前那样面对它

错误1错误C2381:'退出':重新定义; __declspec(noreturn)不同c:\ program files(x86)\ microsoft visual studio 12.0 \ vc \ include \ stdlib.h 376

2 个答案:

答案 0 :(得分:2)

在glut.h和Visual Studio .NET之间存在不兼容性,这是“glut.h”和你的情况下的用法。 你可以通过声明来解决它:

#include <random>
#include "glut.h"

而不是:

#include "glut.h"
#include <random>

请阅读this description以获取更多信息和其他解决方案。 (“标题(.h)文件”部分)

由于没有创建窗口,您的代码也可能会失败。您可以使用glutCreateWindow创建一个窗口。你也可以通过如下安排你的主要来解决这个问题:

void main(int argc ,char ** argv )
{
    glutInit(&argc, argv); // intilize toolkit 
    glutInitWindowPosition(100, 150); 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 
    glutInitWindowSize(640, 480); // windows size is 640 x 480 
    glutCreateWindow("A title");
    myInti(); 
    glutDisplayFunc(serpinski_render); 

    glutMainLoop(); 
}

请同时阅读this information了解glutCreateWindow函数。

答案 1 :(得分:0)

您可能在glut.h

中有此代码
# ifndef GLUT_BUILDING_LIB
extern _CRTIMP void __cdecl exit(int);
# endif

glut.h标题很旧。这可能是旧VC缺乏的一种解决方法。 Visual C现在似乎有一个与此冲突的声明。简单的解决方案是从标题中删除这些行,因为stdlib.h中有一个有效的定义。

顺便说一下,所有glVertexglBeginglEnd,矩阵堆栈和许多其他OpenGL调用都不推荐使用着色器。

也许还有更新/更好的glut可用。我要检查一下。