您的位置:首页 > 运维架构

opengl学习小笔记(3)直线段的绘制之DDA 算法

2012-10-26 20:38 330 查看
这算是第二个实验吧,关于OPENGL配置等问题,请查看之前的学习小笔记吧!

先来看看此次实验的最终结果图:



说白了就是在黑色的背景下画出一条白色的线,当然画出一条线应该说方法有很多,今天说一下DDA算法吧。(PS:上网查找资料看到了各种版本的思想,代码,今天可以总结一下了)

实验环境:

WINDOWS系统,VC6.0++及以上版本,OPENGL相关函数库(小环境搭建请见上一稿)

操作详情:(最为详细请见http://course.cug.edu.cn/cugThird/CGOL_NET/CLASS/course/2-1-1-a.htm

简单描述DDA算法:

  设(x1,y1)和(x2,y2)分别为所求直线的起点和终点坐标,由直线的微分方程得



= m =直线的斜率
下面直接贴出我的代码:

#include<GL/glut.h>

#include<stdio.h>

#include<math.h>

void PlotDDAline()

{

int x0,y0,x1,y1;

float k,dx,dy,xi,yi;

x0=0;y0=0;

x1=600;y1=200;

dx=x1-x0;

dy=y1-y0;

k=dy/dx;

glPointSize(2);

glColor3f(0.0,1.0,0.0);

if(k>=-1 && k<=1)

{

yi=y0;

for(xi=x0;xi<x1;xi++)

{

glBegin(GL_POINTS);

glVertex2f(xi,int(yi+0.5));

yi=yi+k;

}

}

else

{

k=1.0/k;

xi=x0;

for(yi=y0;yi<y1;yi++)

{

glBegin(GL_POINTS);

glVertex2f(int(xi+0.5),yi);

xi=xi+k;

}

}

glEnd();

glFlush();

}

int main()

{

glutInitWindowSize(640,480);

glutInitWindowPosition(100,150);

glutCreateWindow("DDA 算法之直线段的绘制");

glClearColor(0.0,0.0,0.0,0.0);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(0.0,640.0,0.0,480.0);

glutDisplayFunc(PlotDDAline);

glutMainLoop();

return 0;

}

PS:

解决结果图一片白色问题~~

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);此函数为清除内存,由于本人第一次没有介个函数,结果导致无论如何改变代码,结果图都是一片白色,添加之后就OK啦!

相关函数解释更权威的请见

http://www.programfan.com/CLUB/showtxt.asp?id=275228

由于之前上网查找时看到了各种版本的代码实现,下面就罗列一下个人认为比较好的几个,和大家分享一下,至于这些代码间的差异性本人也是好奇,如有人明白请指点!

(1):/article/6005975.html

(2):http://blog.163.com/nan_qiao/blog/static/5031895720071198516608/

(3):http://www.oschina.net/code/snippet_130216_6341

(4):http://www.doc88.com/p-900534839201.html

大家各自根据需求选择吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: