欢迎来到天天文库
浏览记录
ID:35218372
大小:213.50 KB
页数:38页
时间:2019-03-22
《图形学实验报告格式》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、实验一直线、圆弧及曲线的生成算法一、实验目的1、几种直线生成算法的比较,特别掌握用Bresenham直线生成算法。2、几种圆弧生成算法的比较,掌握Bresenham圆弧生成算法。3、掌握用像素点法直接生成其它曲线的方法。二、基本要求1、用不同的生成算法在屏幕上绘制出直线的图形,对不同的算法可设置不同的线形或颜色表示区别。2、用Bresenham生成算法在屏幕上绘制出圆弧的图形,用动画的方式表演图形的生成。三、算法提示1、有关直线生成算法有:DDA(数值微分)直线算法、逐点比较法、直线Bresenham生成算法。直线Bresenham
2、生成算法思想如下(第一象限,且斜率k<1的情况图2-1a中的1a):1)画点(x1,y1),dx=x2-x1,dy=y2-y1,计算误差初值P1=2dy-dx,i=1;2)求直线下一点位置xi+1=xi+1如果Pi>0,则yi+1=yi+1,否则yi+1=yi;3)画点(xi+1,yi+1);4)求下一个误差Pi+1点,如果Pi>0,则Pi+1=Pi+2dy-2dx,否则Pi+1=Pi+2dy;5)i=i+1,如果i3、用浮点数,只用整数。3)只做整数加减运算和乘2运算,而乘2运算可以用移位操作实现。Bresenham算法的速度很快,并适于用硬件实现。对于图2-1a中的2a,只需将xi+1=xi+1改为xi+1=xi-1。对于图2-1a中的1b,斜率k>1的情况,可交换变量x和y,y每次长1个单位。对Pi进行判断,xi+1=xi或xi+1=xi+1。2、有关圆弧生成算法有:逐点比较法、DDA(数值微分)直线算法、圆的Bresenham生成算法。圆的生成算法一般将圆划分为8等份,只需计算(900,450)的八分之一圆弧,其它用对称法求得(参见图2-14、b)。Bresenham生成算法思想如下(第一象限,且斜率k<1的情况):1)计算误差初值P1=3-2r,i=1,画点(0,r);2)求下一个光栅点位置xi+1=xi+1如果Pi<0,则yi+1=yi,否则yi+1=yi-1;3)画点(xi+1,yi+1);4)求下一个误差Pi+1点,如果Pi<0,则Pi+1=Pi+2xi+6,否则Pi+1=Pi+4(xi-yi)+10;5)i=i+1,如果x=y则结束操作,否则转步骤2。圆Bresenham算法的算式简单,只需做加减法和乘4运算3.对屏幕布局的考虑适当选取坐标,将屏幕分成几个区域性5、,在每个区域内实现一种算法,生成一个图形。也可用delay实现延时实现动画。四、上机作业题及思考题1、用正负法编程绘制圆弧2、用直线Bresenham生成算法绘制直线。3、用Bresenham生成算法绘制圆。五、参考源程序1、数值微分法生成斜率小于90的直线/*DDAline数值微分法生成斜率小于90的直线*/#include#include"display.h"main(){intxo,yo,xa,ya,i,j;intdx,dy,c;floatddx,ddy,x,y;Initialize();printf("inp6、utstartx,y(x=0-640,y=0-480)");scanf("%d,%d",&xo,&yo);/*输入直线的两个点*/printf("xa:%d--639",xo);scanf("%d",&xa);printf("ya:0..%d",yo);scanf("%d",&ya);printf("redlineissystem,yellowiscreate");if(xa>=xo&&xa<=639&&ya>=0&&ya<=yo)/*数值微分法生成直线算法*/{outtextxy(xo,yo+5,"o");outtextx7、y(xa,ya-10,"a");dx=xa-xo;dy=yo-ya;if(dx>dy)c=dx;elsec=dy;ddx=dx*1.0/c;ddy=dy*1.0/c;x=xo*1.0;y=yo*1.0;setcolor(12);line(xo,yo,xa,ya);getch();while(c>=0){i=round(x);j=round(y);putpixel(i,j,14);x=x+ddx;y=y-ddy;c=c-1;}}elseprintf("dataerror");getch();closegraph();}intround8、(ff)floatff;{intk;if((ff-(int)ff)>0.5)k=(int)ff+1;elsek=(int)ff;k=(int)ff;return(k);}2、逐点插补法生成圆弧源程序/*STEPCIRCLE逐点插补法生
3、用浮点数,只用整数。3)只做整数加减运算和乘2运算,而乘2运算可以用移位操作实现。Bresenham算法的速度很快,并适于用硬件实现。对于图2-1a中的2a,只需将xi+1=xi+1改为xi+1=xi-1。对于图2-1a中的1b,斜率k>1的情况,可交换变量x和y,y每次长1个单位。对Pi进行判断,xi+1=xi或xi+1=xi+1。2、有关圆弧生成算法有:逐点比较法、DDA(数值微分)直线算法、圆的Bresenham生成算法。圆的生成算法一般将圆划分为8等份,只需计算(900,450)的八分之一圆弧,其它用对称法求得(参见图2-1
4、b)。Bresenham生成算法思想如下(第一象限,且斜率k<1的情况):1)计算误差初值P1=3-2r,i=1,画点(0,r);2)求下一个光栅点位置xi+1=xi+1如果Pi<0,则yi+1=yi,否则yi+1=yi-1;3)画点(xi+1,yi+1);4)求下一个误差Pi+1点,如果Pi<0,则Pi+1=Pi+2xi+6,否则Pi+1=Pi+4(xi-yi)+10;5)i=i+1,如果x=y则结束操作,否则转步骤2。圆Bresenham算法的算式简单,只需做加减法和乘4运算3.对屏幕布局的考虑适当选取坐标,将屏幕分成几个区域性
5、,在每个区域内实现一种算法,生成一个图形。也可用delay实现延时实现动画。四、上机作业题及思考题1、用正负法编程绘制圆弧2、用直线Bresenham生成算法绘制直线。3、用Bresenham生成算法绘制圆。五、参考源程序1、数值微分法生成斜率小于90的直线/*DDAline数值微分法生成斜率小于90的直线*/#include#include"display.h"main(){intxo,yo,xa,ya,i,j;intdx,dy,c;floatddx,ddy,x,y;Initialize();printf("inp
6、utstartx,y(x=0-640,y=0-480)");scanf("%d,%d",&xo,&yo);/*输入直线的两个点*/printf("xa:%d--639",xo);scanf("%d",&xa);printf("ya:0..%d",yo);scanf("%d",&ya);printf("redlineissystem,yellowiscreate");if(xa>=xo&&xa<=639&&ya>=0&&ya<=yo)/*数值微分法生成直线算法*/{outtextxy(xo,yo+5,"o");outtextx
7、y(xa,ya-10,"a");dx=xa-xo;dy=yo-ya;if(dx>dy)c=dx;elsec=dy;ddx=dx*1.0/c;ddy=dy*1.0/c;x=xo*1.0;y=yo*1.0;setcolor(12);line(xo,yo,xa,ya);getch();while(c>=0){i=round(x);j=round(y);putpixel(i,j,14);x=x+ddx;y=y-ddy;c=c-1;}}elseprintf("dataerror");getch();closegraph();}intround
8、(ff)floatff;{intk;if((ff-(int)ff)>0.5)k=(int)ff+1;elsek=(int)ff;k=(int)ff;return(k);}2、逐点插补法生成圆弧源程序/*STEPCIRCLE逐点插补法生
此文档下载收益归作者所有