OpenGL画直线、圆、椭圆

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

使用openGl画直线(DDA算法)、画圆、椭圆(Bresenham算法)

#include

#include

#include

/* initialization: */

void myinit(void)

{

/* attributes */

glClearColor(1.0, 1.0, 1.0, 0.0);//设置背景颜色

glColor3f(1.0, 0.0, 0.0); //设置绘制颜色为红色

/* set up viewing: */

/* 500 x 500 window with origin lower left */

glMatrixMode(GL_PROJECTION); //指定设置投影参数

glLoadIdentity();

/*

OpenGL为我们提供了一个非常简单的恢复初始坐标系的手段,那就是调用glLoadIdentity()命令。该命令是一个无参的无值函数,其功能是用一个4×4的单位矩阵来替换当前矩阵,实际上就是对当前矩阵进行初始化。

也就是说,无论以前进行了多少次矩阵变换,在该命令执行后,当前矩阵均恢复成一个单位矩阵,即相当于没有进行任何矩阵变换状态。

*/

gluOrtho2D(0.0, 500.0, 0.0, 500.0); //设置投影参数

glMatrixMode(GL_MODELVIEW);

/*

这两个都是glMatrixMode()函数的参数,那就先说说glMatrixMode吧~,这个函数其实就是对接下来要做什么进行一下声明,也就是在要做下一步之前告诉计算机我要对“什么”进行操作了,这个“什么”在glMatrixMode的“()”

里的选项(参数)有,GL_PROJECTION,GL_MODELVIEW和GL_TEXTURE;

如果参数是GL_PROJECTION,这个是投影的意思,就是要对投影相关进行操作,也就是把物体投影到一个平面上,就像我们照相一样,把3维物体投到2维的平面上。这样,接下来的语句可以是跟透视相关的函数,比如glFrustum()或gluPerspective();

如果参数是GL_MODELVIEW,这个是对模型视景的操作,接下来的语句描绘一个以模型为基础的适应,这样来设置参数,接下来用到的就是像gluLookAt()这样的函数;

若是GL_TEXTURE,就是对纹理相关进行操作;

顺便说下,OpenGL里面的操作,很多是基于对矩阵的操作的,比如位移,旋转,缩放,所以,这里其实说的规范一点就是glMatrixMode是用来指定哪一个矩阵是当前矩阵,而它的参数代表要操作的目标,GL_PROJECTION是对投影矩阵操作,

GL_MODELVIEW是对模型视景矩阵操作,GL_TEXTURE是对纹理矩阵进行随后的操作。

*/

}

void plot_circle_points(int xc,int yc,int x,int y)//画圆

{

glBegin(GL_POINTS);

glVertex3f(xc+x,yc+y,0);

glVertex3f(xc-x,yc+y,0);

glVertex3f(xc+x,yc-y,0);

glVertex3f(xc-x,yc-y,0);

glVertex3f(xc+y,yc+x,0);

glVertex3f(xc-y,yc+x,0);

glVertex3f(xc+y,yc-x,0);

glVertex3f(xc-y,yc-x,0);

glEnd();

}

void drawcircle(int xc,int yc,int radius)

{

int x,y,p;

x=0;

y=radius;

p=3-2*radius;

glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_POINTS);

while(x

{

plot_circle_points(xc,yc,x,y);

if(p<0)

p=p+4*x+6;

else

{

p=p+4*(x-y)+10;

y-=1;

}

x+=1;

}

if(x==y)

plot_circle_points(xc,yc,x,y);

}

void putpixel(int xc,int yc,int x,int y)//画椭圆

{

glBegin(GL_POINTS);

glVertex3f(xc+x,yc+y,0);

glEnd();

}

void drawEllipse(int xc,int yc,int a,int b)

{

int x,y;

float d1,d2;

x=0;

y=b;

d1=b*b+a*a*(-b+0.25);

putpixel(xc,yc,x,y);

putpixel(xc,yc,-x,-y);

putpixel(xc,yc,-x,y);

putpixel(xc,yc,x,-y);

while(b*b*(x+1)

{

if(d1<0)

{

d1+=b*b*(2*x+3);

x++;

}

else

{

d1+=b*b*(2*x+3)+a*a*(-2*y+2);

x++;

y--;

}

putpixel(xc,yc,x,y);

putpixel(xc,yc,-x,-y);

putpixel(xc,yc,-x,y);

putpixel(xc,yc,x,-y);

}

d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;

while(y>0)

相关文档
最新文档