资源描述:
《计算机图形学---直线的生成算法.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、实验二直线段生成绘制的实现算法班级08信计2班学号姓名张玉凤分数一、实验目的和要求:1、掌握光栅图形显示基本原理2、熟悉直线的生成算法,掌握直线的绘制3、初步了解Tc下画图基本程序结构;4、初步了解DDA画线算法及Bresenham算法的思想和基本方法二、实验主要思想:1、DDA算法思想:数值微分法即DDA法,这是一种基于直线的微分方程来生成直线的方法。选定和中较大者作为步进方向,取该方向上的为一个像素单位长,即x每次递增一个像素,然后利用公式计算出相应的y值,把每次计算出的取整后顺序输出到显
2、示器,则得到光栅后的直线。2、中点直线算法思想:假定直线斜率k在0~1之间(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画线算法画一段直线实验代码:#include"stdio.h
3、"#include"graphics.h"voidDDALine(intx1,inty1,intx2,inty2){ doubledx,dy,e,x,y; inti; dx=x2-x1; dy=y2-y1; e=(fabs(dx)>fabs(dy))?fabs(dx):fabs(dy); dx/=e; dy/=e; x=x1;7 y=y1; for(i=1;i<=e;i++) { putpixel((int)(x+0.5),(int)(y+0.5
4、),GREEN); x+=dx; y+=dy; }}voidmain(){ intdriver=VGA; intmode=VGAHI; initgraph(&driver,&mode,""); DDALine(100,150,250,300); getch(); closegraph();}运行结果:2.用Bresenham画线算法画直线,并完善算法功能,使之适应更广实验代码:#include#include5、>voidBresenhamline(intx1,inty1,intx2,inty2){ intx,y,dx,dy,p; x=x1; y=y1; dx=x2-x1; dy=y2-y1; p=2*dy-dx; for(;x<=x2;x++) { putpixel(x,y,BLUE); if(p>=0) { y++; p+=2*(dy-dx); } else {
6、 p+=2*dy; }7 }}main(){ intdriver=VGA; intmode=VGAHI; initgraph(&driver,&mode,""); Bresenhamline(50,150,200,250); getch(); closegraph();}运行结果:3.、对比Bresenham算法、DDA算法、中点算法三种算法的像素逼近效果和程序执行速度三两种算法的像素逼近效果和程序执行速度。实验代码:#include7、io.h>#include#include#include#include#includevoidDrawZb();voidBLine(int,int,int,int);voidDDALine(int,int,int,int);voidMidLine(int,int,int,int);voidmain(){inti;charstr[20];longoldtime,newtime,time;intgd=VGA,g
8、m=VGAHI;initgraph(&gd,&gm,"D:\TC\TCPP\BGI");DrawZb();outtextxy(10,10,"Welcometothisprogram!");settextstyle(2,0,0);outtextxy(10,420,"Name:Lineswork1.0");outtextxy(10,430,"Information:ComputerGraphicsWork-lines");outtextxy(10,440,"Copy