- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
bresenham画线算法详解
给定两个点起点P1(x1,y1),P2(x2,y2),如何画它们直连的直线呢,即是如何得到上图所示的蓝色的点。假设直线的斜率0k0,直线在第一象限,Bresenham算法的过程如下:1.画起点(x1,y1).2.准备画下一个点,X坐标加1,判断如果达到终点,则完成。否则找下一个点,由图可知要画的点要么为当前点的右邻接点,要么是当前点的右上邻接点。 2.1.如果线段ax+by+c=0与x=x1+1的交点y坐标大于(y+*y+1))/2则选右上那个点 2.2.否则选右下那个点。3.画点4.跳回第2步5.结束 具体的算法如下,原理就是比较目标直线与x+1直线交点的纵坐标,哪个离交点近就去哪个voidBresenhamline(intx0,inty0,intx1,inty1,intcolor){ intx,y,dx,dy; floatk,e; dx=x1-x0; dy=y1-y0; k=dy/dx; e=-0.5; x=x0; y=y0; for(x=x0;xx1;x++) { drawpixel(x,y,color); //这个是画点子函数 e=e+k; if(e0) { y++; e=e-1; } }}上述Bresenham算法在计算直线斜率与误差项时用到小数与除法。可以改用整数以避免除法。等式两边同时乘以2*dx,得到2*e*dx=2*e*dx+2dy,2*e*dx=2*e*dx-2*dx.由于算法中只用到误差项的符号,因此可作如下替换:2*e*dx.改进的Bresenham画线算法程序:将e统一乘以2*dx即变成了整数的Bresenhan算法了,^_^voidInterBresenhamline(intx0,inty0,intx1,inty1,intcolor){ intdx=x1-x0; intdy=y1-y0; intdx2=dx1;//乘2 intdy2=dy1;//乘2 inte=-dx; intx=x0; inty=y0; for(x=x0;xx1;x++) { drawpixel(x,y,color); e=e+dy2; if(e0) { y++; e=e-dx2; } }}
文档评论(0)