OpenGL画直线、圆、椭圆
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);