《计算机图形学---直线的生成算法(共7页).doc》由会员分享,可在线阅读,更多相关《计算机图形学---直线的生成算法(共7页).doc(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上实验二 直线段生成绘制的实现算法班级 08信计2班 学号姓名 张玉凤 分数 一、实验目的和要求:1、掌握光栅图形显示基本原理2、熟悉直线的生成算法,掌握直线的绘制3、初步了解Tc下画图基本程序结构;4、初步了解DDA画线算法及Bresenham算法的思想和基本方法二、实验主要思想:1、DDA算法思想: 数值微分法即DDA法,这是一种基于直线的微分方程来生成直线的方法。选定和中较大者作为步进方向,取该方向上的为一个像素单位长,即x每次递增一个像素,然后利用公式计算出相应的y值,把每次计算出的取整后顺序输出到显示器,则得到光栅后的直线。2、中点直线算法思想: 假定直线斜率
2、k在01之间(k的其它取值可以类似处理),当前象素点为(xp,yp),则下一个象素点有两种可选择点P1(xp+1,yp)或P2(xp+1,yp+1)。若P1与P2的中点(xp+1,yp+0.5)称为M,Q为理想直线与x=xp+1垂线的交点。当M在Q的下方时,则取P2应为下一个象素点;当M在Q的上方时,则取P1为下一个象素点。这就是中点画线法的基本原理。三、实验内容及步骤1、dda画线算法画一段直线实验代码:#includestdio.h#includegraphics.hvoid DDALine(int x1,int y1, int x2,int y2) double dx, dy,e,x,y
3、; int i; dx=x2-x1; dy=y2-y1; e=(fabs(dx)fabs(dy)? fabs(dx):fabs(dy); dx/=e; dy/=e; x=x1; y=y1; for(i=1;i=e;i+) putpixel(int)(x+0.5),(int)(y+0.5),GREEN); x+=dx; y+=dy; void main() int driver=VGA; int mode=VGAHI; initgraph(&driver,&mode,); DDALine(100,150,250,300 ); getch(); closegraph();运行结果: 2. 用Bre
4、senham画线算法画直线,并完善算法功能,使之适应更广实验代码:#include#includevoid Bresenhamline(int x1,int y1,int x2,int y2) int x,y,dx,dy,p; x=x1; y=y1; dx=x2-x1; dy=y2-y1; p=2*dy-dx; for(;x=0) y+; p+=2*(dy-dx); else p+=2*dy; main() int driver=VGA; int mode=VGAHI; initgraph(&driver,&mode,); Bresenhamline(50,150,200,250); getc
5、h(); closegraph();运行结果:3.、对比Bresenham算法、DDA算法、中点算法三种算法的像素逼近效果和程序执行速度 三两种算法的像素逼近效果和程序执行速度。实验代码:#include #include #include #include #include #include void DrawZb();void BLine(int, int, int, int);void DDALine(int, int, int, int);void MidLine(int, int, int, int);void main() int i; char str20; long oldti
6、me, newtime,time; int gd = VGA, gm = VGAHI; initgraph(&gd, &gm, D:TCTCPPBGI); DrawZb(); outtextxy(10,10,Welcome to this program!); settextstyle(2,0,0); outtextxy(10,420,Name : Lineswork 1.0); outtextxy(10,430,Information : Computer Graphics Work - lines); outtextxy(10,440,CopyRight : (C) Lewsn 2010)
7、; outtextxy(10,450,Made by : Zhang Shaolei OUC 2010/12 ); settextstyle(0,0,0); setcolor(11); outtextxy(10,30,Press to Bline! ); getch(); oldtime = biostime(0,0L); for(i = 0; i 200; i+) BLine(0, 0, 200, 50); BLine(0, 0, 50, 200); BLine(0, 0, -50, 200); BLine(0, 0, -200, 50); BLine(0, 0, -200, -50); B
8、Line(0, 0, -50, -200); BLine(0, 0, 50, -200); BLine(0, 0, 200, -50); newtime = biostime(0,0L); time = (newtime - oldtime) * 1000 /CLK_TCK; sprintf(str, Time: %d ms,time); outtextxy(170, 30, str); setcolor(10); outtextxy(10, 50, Press to DDAline! ); getch(); oldtime = biostime(0,0L); for(i = 0; i 200
9、; i+) DDALine(0, 0, 190, 80); DDALine(0, 0, 80, 190); DDALine(0, 0, -80, 190); DDALine(0, 0, -190, 80); DDALine(0, 0, -190, -80); DDALine(0, 0, -80, -190); DDALine(0, 0, 80, -190); DDALine(0, 0, 190, -80); newtime = biostime(0,0L); time = (newtime - oldtime) * 1000 /CLK_TCK; sprintf(str, Time: %d ms
10、,time); outtextxy(170, 50, str); setcolor(12); outtextxy(10, 70, Press to Midline! ); getch(); oldtime = biostime(0,0L); for(i = 0; i dx) i=dx; dx=dy; dy=i; exchange=1; e=2*dy-dx; xsign=(x2x1)? 1:-1; ysign=(y2y1)? 1:-1; for(i=0; i=0) e=e-2*dx; if(exchange) x+=xsign; else y+=ysign; e=e+2*dy; if(excha
11、nge) y+=ysign; else x+=xsign; void DDALine(int x1,int y1,int x2,int y2) float x,y,dx,dy; int i,step; x = x1 + 0.5; y = y1 + 0.5; step = abs(x2 - x1) abs(y2 - y1) ? abs(x2 - x1) : abs(y2 - y1); dx = (float)(x2 - x1) / step; dy = (float)(y2 - y1) / step; for(i = 0; i=step; i+) putpixel( (int)x+320, 24
12、0-(int)y, 10); x += dx; y += dy; void MidLine(int x1, int y1, int x2, int y2) if(abs(x1 - x2) = 1 & abs(y1 - y2) = 1) putpixel ( (int)(320 + (x1 + x2)/2 +0.5), (int)(240 - (y1 + y2)/2 +0.5), 12 ); else MidLine(x1, y1, (int) (x1 + x2)/2), (int) (y1 + y2)/2); MidLine(int) (x1 + x2)/2), (int) (y1 + y2)
13、/2), x2, y2); 运行结果:四、实验结果分析:该程序实现了三种算法的直线段绘制比较三种算法的结果:像素逼近效果由好到差依次为:Bresenham算法、DDA算法、中点算法 执行速度由快到慢依次为: 中点算法、DDA算法、Bresenham算法五、思想与提高:经过这次实验,对运用TURBOC实现C语言绘图有了一定的了解,对现成的算法描述转换为可执行代码有了初步认识。试验中对于Bresenham画线算法及DDA直线算法的设计思想有了验证性的认识, ,而且对于理论知识有了进一步的巩固。实验中,使我复习了TURBOC的编程调试工具的使用,也是一定程度上的收获,在一定程度上已经为我们今后的学习应用打下了基础。专心-专注-专业