直线生成算法的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二:直线生成算法
班级 13软件+道铁1班学号 20132110050115姓名丁益
1.实验目的
a)通过实验,进一步理解直线段扫描转换的DDA算法、中点画线自算法
及bresenham算法的基本原理,掌握以上算法生成直线段的基本过程。
b)通过编程,掌握在C/C++环境下完成用DDA算法、中点画线算法及
bresenham算法对任意直线段的扫描转换,以及在C/C++环境下完成用中
点画圆及椭圆的绘制方法。
2.实验内容
c)阅读《openGL三维程序设计》(电子书)第二部分第四章,掌握OpenGL
基本建模方法,并调试其中程序。
d)参考教材第6章,编程实现整数DDA算法、中点画线法和Bresenham
画线法,绘制直线(直线宽度和线型可自定)。
2.1 DDA直线生成
2.1.1算法原理
已知过端点P0(x0,y0),P1(x1,y1)的直线段L(P0,P1),斜率为k=(y1-y0)/(x1-x0),画线过程从x的左端点x0开始,向x右端点步进,步长为1个像素,计算相应的y坐标为y=kx+B。计算y i+1 = kx i+B
=kx i +B+kx
=y i +kx
当x=1,y i+1=y i+k,即当x每递增1,y递增k。由计算过程可知,y与k可能为浮点数,需要取y整数,源程序中round(y)=(int)(y+0.5)表示y四舍五入所得的整数值。
2.1.2 算法流程
2.1.3 算法实现关键代码
#include
#include
void Init()
{
glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,200.0,0.0,150.0);
}
void lineDDA(int x0,int y0,int xEnd,int yEnd)
{
int dx=xEnd-x0,dy=yEnd-y0,steps,k;
float xIncrement, yIncrement, x=x0, y=y0;
if(fabs(dx)>fabs(dy))
steps=fabs(dx);
else
steps=fabs(dy);
xIncrement=float(dx)/float(steps);
yIncrement=float(dy)/float(steps);
for(k=0;k { x+=xIncrement; y+=yIncrement; glBegin(GL_POINTS); glVertex2i(x,(int)(y+0.5)); glEnd(); } glFlush(); } void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0,0.0,0.0); lineDDA(50,50,100,120); } int main(int argc,char** argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowPosition(100,100); glutInitWindowSize(400,400); glutCreateWindow("Hello World"); Init(); glutDisplayFunc(myDisplay); glutMainLoop(); return 0; } 2.1.4算法运行示例及中间结果 2.2 Brese nham直线生成 2.2.1算法原理 Bresenham算法的基本原理是:过各行各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后确定该列像素中与此交点最近的像素。 2.2.2算法流程 2.2.3算法实现关键代码 #include #include #include void init(void) { glClearColor(1.0,1.0,1.0,0.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200,0.0,200); } void lineBres(int x0,int y0,int xEnd,int yEnd) { int dx=fabs(xEnd-x0),dy=fabs(xEnd-y0); int p=2*dy-dx; int twoDy=2*dy,twoDyMinusDx=2*(dy-dx); int x, y; if(x0>xEnd) { x=xEnd; y=yEnd; xEnd=x0; } else { x=x0; y=y0; }