实验一直线、圆弧及曲线的生成算法一、实验目的1、几种直线生成算法的比较,特别掌握用Bresenham直线生成算法。2、几种圆弧生成算法的比较,掌握Bresenham圆弧生成算法。3、掌握用像素点法直接生成其它曲线的方法。二、基本要求1、用不同的生成算法在屏幕上绘制出直线的图形,对不同的算法可设置不同的线形或颜色表示区别。2、用Bresenham生成算法在屏幕上绘制出圆弧的图形,用动画的方式表演图形的生成。三、算法提示1、有关直线生成算法有:DDA(数值微分)直线算法、逐点比较法、直线Bresenham生成算法。直线Bresenham生成算法思想如下(第一象限,且斜率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,如果i1的情况,可交换变量x和y,y每次长1个单位。对Pi进行判断,xi+1=xi或xi+1=xi+1。2、有关圆弧生成算法有:逐点比较法、DDA(数值微分)直线算法、圆的Bresenham生成算法。圆的生成算法一般将圆划分为8等份,只需计算(900,450)的八分之一圆弧,其它用对称法求得(参见图2-1b)。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.对屏幕布局的考虑适当选取坐标,将屏幕分成几个区域性,在每个区域内实现一种算法,生成一个图形。也可用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("inputstartx,y(x=0-640,y=0-480)\n");scanf("%d,%d",&xo,&yo);/*输入直线的两个点*/printf("xa:%d--639",xo);scanf("%d",&xa);printf("ya:0..%d",yo);scanf("%d",&ya);printf("redlineissystem,yellowiscreate\n");if(xa>=xo&&xa<=639&&ya>=0&&ya<=yo)/*数值微分法生成直线算法*/{outtextxy(xo,yo+5,"o");outtextxy(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(ff)floatff;{intk;if((ff-(int)ff)>0.5)k=(int)ff+1;elsek=(int)ff;k=(int)ff;return(k);}2、逐点插补法生成圆弧源程序/*STEPCIRCLE逐点插补法生成圆弧*/#include#include"display.h"main(){intxo,yo,xa,ya,r,l,f;Initialize();printf("inputx,y,r");/*输入圆心和半径*/scanf("%d,%d,%d",&xo,&yo,&r);xa=xo+r;ya=yo;setcolor(12);circle(xo,yo,r);line(xo-r,yo,xo+r,yo);line(xo,yo-r,xo,yo+r);line(xo,yo,xo+140,yo-140);l=r*1.414/2;f=0;while(l!=0){putpixel(xa,ya,14);putpixel(xa,2*yo-ya,14);putpixel(2*xo-xa,ya,14);putpixel(2*xo-xa,2*yo-ya,14);putpixel(xo+ya-yo,yo+xa-xo,14);putpixel(xo+ya-yo,yo-xa+xo,14);putpixel(xo-ya+yo,yo+xa-xo,14);putpixel(xo-ya+yo,yo-xa+xo,14);getch();if(f>=...