OpenGL学习记录(四)----赛平斯基垫片Sierpinski垫片

:2018-09-28    :215 次   :2658 字   

思路:

利用鼠标点击,记录三个点的位置传送到赛平斯基垫片函数进行画图,刷新界面。


// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <gl/glut.h>
#include<stdlib.h>
void myInit(void)
{
	glClearColor(1.0, 1.0, 1.0, 0.0);
	glColor3f(0.0f, 0.0f, 0.0f);
	glPointSize(2.0);
	glLineWidth(10.0);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0, 800, 0, 600);
}
class GLintPoint
{
public:
	GLint x, y;
};
GLintPoint corner[3];
int screenheight = 600;
int screenwidth = 800;
int numCorners = 0;
void drawDot(GLint x, GLint y) {
	glBegin(GL_POINTS);
	glColor3f(0.0, 0.0, 0.0);
	glVertex2f(x, y);
	glEnd();
};
void sierpinski_render(GLintPoint T[3])
{
	glClear(GL_COLOR_BUFFER_BIT);//用当前背景色填充窗口
	glColor3f(0.0, 0.0, 0.0);
	int index = rand() % 3;
	GLintPoint point = T[index];
	drawDot(point.x, point.y);
	for (int i = 0; i < 55000; i++)
	{
		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();//清空命令缓冲区,执行OpenGL程序
}
void myMouse(int button, int state, int x, int y) {
	if (state == GLUT_DOWN)
	{
		if (button == GLUT_LEFT_BUTTON)
		{
			corner[numCorners].x = x;
			corner[numCorners].y = screenheight - y;
			if (++numCorners == 3) {
				sierpinski_render(corner);
				numCorners = 0;
			}
			glFlush();
		}
		else if (button == GLUT_RIGHT_BUTTON)
		{
			glClear(GL_COLOR_BUFFER_BIT);
			glFlush();
		}
	}
};
void Display()
{
//	sierpinski_render(corner);
	glClearColor(0.0f, 1.0f, 0.0f, 0.0f); //green
	glClear(GL_COLOR_BUFFER_BIT);
	glFlush();
}
void main(int argc, char* argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
	glutInitWindowPosition(0, 0);
	glutInitWindowSize(800, 600);
	glutCreateWindow("实验一"); 
	glutDisplayFunc(Display); 
	glutMouseFunc(myMouse);
	myInit();
	glutMainLoop();                
}




    暂无评论,快来抢沙发吧!
×