OpenGL學習之中點畫圓算法

中點畫圓算法

在每個布中以單位間隔取樣並確定離指定圓最近的像素位置。

代碼如下:

#include <gl/glut.h>
class screenpt
{
private:
	GLint x,y;
public:
	screenpt()
	{
		x = y = 0;
	}
	void setcoords(GLint xcoord,GLint ycoords)
	{
		x = xcoord;
		y = ycoords;
	}
	GLint getx() const
	{
		return x;
	}
	GLint gety() const
	{
		return y;
	}
	void incrementx()
	{
		x++;
	}
	void incrementy()
	{
		y++;
	}
	void decrementx()
	{
		x--;
	}
	void decreamenty()
	{
		y--;
	}
};


void  setpixel(GLint xcoord,GLint ycoord)
{
	glPointSize(5);
	glBegin(GL_POINTS);
	
	glVertex2i(xcoord,ycoord);
	glEnd();
}

void circlePlotPoints(GLint xc,GLint yc,screenpt circpt)
{
	setpixel(xc+circpt.getx(),yc+circpt.gety());
	setpixel(xc+circpt.getx(),yc-circpt.gety());
	setpixel(xc-circpt.getx(),yc+circpt.gety());
	setpixel(xc-circpt.getx(),yc-circpt.gety());

	setpixel(xc+circpt.gety(),yc+circpt.getx());
	setpixel(xc-circpt.gety(),yc+circpt.getx());
	setpixel(xc+circpt.gety(),yc-circpt.getx());
	setpixel(xc-circpt.gety(),yc-circpt.getx());
}

void circleMIDpoint(GLint xc,GLint yc,GLint radius)
{
	screenpt cirpt;
	GLint p =1-radius;
	cirpt.setcoords(0,radius);
	circlePlotPoints(xc,yc,cirpt);
	while(cirpt.getx()<cirpt.gety())
	{
		cirpt.incrementx();
		if(p<0)
		{
			p += 2*cirpt.getx() + 1;
		}
		else
		{
			cirpt.decreamenty();
			p += 2*(cirpt.getx()-cirpt.gety()) + 1;
		}
		circlePlotPoints(xc,yc,cirpt);
	}
}
void init()
{
	glClearColor(1.0,1.0,1.0,0.0);
	glMatrixMode(GL_PROJECTION);
	gluOrtho2D(-10,10,-10,10);
}
void display()
{
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(0.0,0.0,1.0);
	circleMIDpoint(1,1,5);
	glFlush();
}
int main(int argc,char **argv)
{
	glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowSize(500,500);
	glutInitWindowPosition(0,0);
	glutCreateWindow("hello");
	init();
	glutDisplayFunc(display);
	glutMainLoop();
	return 0;
}

畫出來的效果其實並不是特別的好


看完上面的中點畫圓算法之後我們看看利用極座標畫圓的結果,

因爲極座標的座標表示爲x = cos(theta),y  = sin(theta)

那麼很顯然就可以使用下面的程序進行畫圖了,看程序

#include <gl/glut.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define PI 3.14159f
#define R 5
GLfloat theta = 0.0f;
#define n 100
void init()
{
	glClearColor(0.0,0.0,0.0,0.0);
	glColor3f(1.0,1.0,0.0);
	glMatrixMode(GL_PROJECTION);
	gluOrtho2D(-10,10,-10,10);
}

void display()
{
	//GLfloat x,y;
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(1.0,0.0,0.0);
	glPointSize(5);
	glBegin(GL_POINTS);
	for(int i=0;i<n;i++)
		glVertex2f(R*cos(2*PI/n*i),R*sin(2*PI/n*i));
	glEnd();
	glFlush();
}
int main(int argc,char **argv)
{
	glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowSize(500,500);
	glutInitWindowPosition(0,0);
	glutCreateWindow("hello");
	init();
	glutDisplayFunc(display);
	glutMainLoop();
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章