资源描述:
《用中点算法扫描转换直线.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、用中点算法扫描转换直线段电信001李理0052011一.算法教材里已有现成的算法,只要把其中的算法修改一下就行了。应该修改的第一点是:在教材中,是根据平时的习惯将左下角左为坐标原点,而在PC机中左上角为坐标原点。因此在实际程序中,计算(x,y)时仍照教材,只是将putpixel(x,y,color)必成putpixel(x,HEIGHT-y,color)就行了,其中变量HEIGHT为屏幕的最大分辨率,可用C系统提供的getmaxy函数得到,它的原型为:intfargetmaxy(void);第二个问题是关于怎么按斜率的来分类。我在这里将它分为了6类:即斜率为(0,∞),(
2、0,1),(1,+∞),(-1,0),(-∞,-1)。将0和∞单独处理是因为这样速度会快一点(也许感觉不到)。斜率的判断,最初的考虑是用(y1-y0)/(x1-x0),但因为在定义时这些变量都是整型,所以不能正确判断。另外考虑到教材的算法是假定起点的横坐标小于终点的横坐标的,所以在一开始就将横坐标小的作为起点。(换序来实现)这样,只要y1>y0就说明斜率大于0,而再加上(y1-y0)<(x1=x0)这个条件就说明它满足教材算法的条件了。下面要解决的问题是斜率在(1,+∞)的算法了。我们选y轴为计长方向(每次加一),可推出:xi+1,r=xi,r,当di<0xi+1,r=x
3、i,r+1,当di>=0di+1=di+2Δx,di<0di+1=di+2(Δx+Δy),di>=0最后的问题就是斜率为(-1,0)和(-∞,-1)的情况。当然也可以另写类似的算法,不过我们可以利用已有的(0,1)的算法和(1,+∞)的算法,只要作一个变换:将(x1,y1)作直线y=y0的对称点,即用(x0,y0),(x1,2*y0-y1)这两点满足第一种条件,在画点时只要再用(2*y0-y)代替y就行了。程序流程图见末页。二.程序清单:/*******************************************************************
4、***Thisisaprogramofdrawingalinebymiddlepointalgorithm(Bresenhamalgorithm).CopyRights2002ByLiLi.**********************************************************************/#include"graphics.h"intHEIGHT;main(){intx0,x1,y0,y1;intcolor;voidmidpointline(intx0,inty0,intx1,inty1,intcolor);printf("Ple
5、asethexcoordinateofthefirstpoint.");scanf("%d",&x0);printf("Theycoordinateofthefirstpointplease.");scanf("%d",&y0);printf("Thexcoordinateofthesecondpoint.");scanf("%d",&x1);printf("Theycoordinateofthesecondpoint.");scanf("%d",&y1);printf("TheColoroftheLine:");scanf("%d",&color);
6、midpointline(x0,y0,x1,y1,color);}voidmidpointline(intx0,inty0,intx1,inty1,intcolor){inti;inttemp;intgdriver=DETECT,gmode;voidline1(int,int,int,int,int);voidline2(int,int,int,int,int);voidline3(int,int,int,int,int);voidline4(int,int,int,int,int);if(x0>x1){temp=x0;x0=x1;x1=temp;temp=y0;y0=y
7、1;y1=temp;}initgraph(&gdriver,&gmode,"");HEIGHT=getmaxy();if(y0==y1)/*It'sahorizontalline.*/for(i=x0;i<=x1;i++)putpixel(i,HEIGHT-y0,color);elseif(x0==x1)/*It'saverticalline.*/if(y0