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)分别为所求直线的起点和终点坐标,由直线的微分方程得
下面直接贴出我的代码:
#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
大家各自根据需求选择吧!
先来看看此次实验的最终结果图:
说白了就是在黑色的背景下画出一条白色的线,当然画出一条线应该说方法有很多,今天说一下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
大家各自根据需求选择吧!
相关文章推荐
- OpenGL学习笔记(7)多边形绘制
- OpenCV学习笔记09--通过cvPtr2D或指针算法绘制图形
- opengl es3.0游戏开发学习笔记1-绘制旋转的三角形
- OpenGL学习笔记2:绘制和混合
- 【OpenGL】学习笔记之一 绘制基本图形单元的方法
- 【OpenGL学习代码笔记之一】 基本形状绘制及动画初窥
- opengl学习笔记3-1-在3D中绘制点
- LearnOpenGL学习笔记2:绘制基础图形
- OpenGL学习笔记()多边形绘制-cullface
- openGL学习笔记二、状态管理和绘制几何体【editing】
- OpenGL_Qt学习笔记之_02(绘制简单平面几何图形)
- OpenGL 学习笔记(3)绘制几何物体
- OpenGL学习笔记(7)多边形绘制
- OpenGL学习笔记 (2) —— 绘制多边形
- OpenGL_Qt学习笔记之_02(绘制简单平面几何图形)
- OpenGL学习笔记(一):状态管理与绘制
- OpenGL2.0学习笔记【二】——(第二章)矩形的绘制
- openGL之几何变换(绘制球体)---openGL学习笔记(六)
- Android OpenGL学习笔记(二)之----三角形的绘制.
- 现代OpenGL+Qt学习笔记之六:绘制可旋转、带光照效果的三维物体