游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2947|回复: 6

求助:这个产生赛平斯基垫片的几行代码错在哪儿?

[复制链接]

11

主题

26

帖子

26

积分

注册会员

Rank: 2

积分
26
发表于 2006-10-6 14:36:00 | 显示全部楼层 |阅读模式
#include <windows.h>
#include <gl/Gl.h>
#include <gl/glut.h>

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

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

void drawDot(GLint x, GLint y)
{        // 在整数点(x, y)绘制一个点
        glBegin(GL_POINTS);
                glVertex2i(x, y);
        glEnd;
}

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

        int index = random(3);                // 0、1或2都很相似
        GLintPoint point = T[index];        // 初始点
        drawDot(point.x, point.y);                // 绘制初始点
        for (int i = 0; i < 1000; i++)                // 绘制1000个点
        {
                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();
}

报错如下:
Compiling...
main.cpp
F:\Visual Studio Projects\Demo\222Sierpinski\main.cpp(19) : warning C4551: function call missing argument list
F:\Visual Studio Projects\Demo\222Sierpinski\main.cpp(33) : error C2228: left of '.x' must have class/struct/union type
F:\Visual Studio Projects\Demo\222Sierpinski\main.cpp(34) : error C2228: left of '.y' must have class/struct/union type
Error executing cl.exe.

main.obj - 2 error(s), 1 warning(s) [em6]

27

主题

179

帖子

259

积分

中级会员

Rank: 3Rank: 3

积分
259
发表于 2006-10-6 15:00:00 | 显示全部楼层

Re:求助:这个产生赛平斯基垫片的几行代码错在哪儿?

错在 index.x 和 index.y上。 index是个int,怎么会有 x和y的member呢?

11

主题

26

帖子

26

积分

注册会员

Rank: 2

积分
26
 楼主| 发表于 2006-10-7 02:12:00 | 显示全部楼层

Re:求助:这个产生赛平斯基垫片的几行代码错在哪儿?

谢谢楼上!偶已经改过了,修改后的代码如下:
-----------------------------------------
#include <windows.h>
#include <gl/Gl.h>
#include <gl/glut.h>

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

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

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

void drawDot(GLint x, GLint y)
{        // 在整数点(x, y)绘制一个点
        glBegin(GL_POINTS);
                glVertex2i(x, y);
        glEnd;
}

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

        int index = random(3);                // 0、1或2都很相似
        GLintPoint point = T[index];        // 初始点
        drawDot(point.x, point.y);                // 绘制初始点
        for (int i = 0; i < 1000; i++)                // 绘制1000个点
        {
                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 myDisplay(void)
{
        glClear(GL_COLOR_BUFFER_BIT);
        Sierpinski();
}

void main(int argc, char** argv)
{
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
        glutInitWindowSize(640, 480);
        glutInitWindowPosition(100, 150);
        glutCreateWindow("Sierpinski");
        glutDisplayFunc(myDisplay);
        myInit();
        glutMainLoop();
}
-----------------------------------------
可为什么绘制出的图片会这么难看呢?


图片的刷新也有问题……
------------------------------------------------------------------------------------------------
改为绘制20000个点,好看了一些,但是刷新还是有问题 [em7]为什么背景不能持续显示为白色呢?

27

主题

179

帖子

259

积分

中级会员

Rank: 3Rank: 3

积分
259
发表于 2006-10-7 02:30:00 | 显示全部楼层

Re:求助:这个产生赛平斯基垫片的几行代码错在哪儿?

你用的是single buffer所以刷新会有问题.而且分型没有设置level,所以产生的点即有level 2 又有level 3的.才难看. 你可以把点的大小弄小点,生成100,000个点,就好看拉.

11

主题

26

帖子

26

积分

注册会员

Rank: 2

积分
26
 楼主| 发表于 2006-10-7 02:49:00 | 显示全部楼层

Re:求助:这个产生赛平斯基垫片的几行代码错在哪儿?

谢谢aear啊~我刚开始自学OpenGL,很多不明白的地方,用这种显示模式在绘制点的时候没有问题啊~但是绘制Sierpinski时有个小小问题:把窗口缩小了再放大就显示不出背景了,不知为何……

27

主题

179

帖子

259

积分

中级会员

Rank: 3Rank: 3

积分
259
发表于 2006-10-7 03:41:00 | 显示全部楼层

Re:求助:这个产生赛平斯基垫片的几行代码错在哪儿?

在用double buffer的时候每次都要用glClearColor(1.0, 1.0, 1.0, 0.0); 清除屏幕背景色

你目前还是用的single buffer ,要在 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 时候设置成double buffer. 具体的操作可以参考opengl手册和相关书籍

14

主题

52

帖子

52

积分

注册会员

Rank: 2

积分
52
QQ
发表于 2006-10-7 15:32:00 | 显示全部楼层

Re:求助:这个产生赛平斯基垫片的几行代码错在哪儿?

啊,你们好厉害啊,我还在读大学,现在也在自学,争取毕业前能学到些东西。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 14:04

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表