OpenGL学习之中点画圆算法

45 篇文章 2 订阅
31 篇文章 0 订阅

中点画圆算法

在每个布中以单位间隔取样并确定离指定圆最近的像素位置。

代码如下:

#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;
}

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值