《2022年BRESENHAM直线算法与画圆算法[收 .pdf》由会员分享,可在线阅读,更多相关《2022年BRESENHAM直线算法与画圆算法[收 .pdf(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Bresenham直线算法与画圆算法文章分类: Java 编程计算机是如何画直线的?简单来说,如下图所示, 真实的直线是连续的, 但我们的计算机显示的精度有限, 不可能真正显示连续的直线, 于是我们用一系列离散化后的点(像素)来近似表现这条直线。(上图来自于互联网络, 计算机图形学的概念与方法柳朝阳,郑州大学数学系)接下来的问题就是如何尽可能高效地找到这些离散的点,Bresenham直线算法就是一个非常不错的算法。Bresenham直线算法是用来描绘由两点所决定的直线的算法,它会算出一条线段在 n 维光栅上最接近的点。这个算法只会用到较为快速的整数加法、减法和位元移位, 常用于绘制电脑画面中的
2、直线。 是计算机图形学中最先发展出来的算法。(引自 wiki 百科布雷森漢姆直線演算法)这个算法的流程图如下:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 8 页 - - - - - - - - - 可以看到,算法其实只考虑了斜率在0 1 之间的直线,也就是与x 轴夹角在 0 度到 45 度的直线。只要解决了这类直线的画法,其它角度的直线的绘制全部可以通过简单的坐标变换来实现。下面是一个 C语言实现版本。Java 代码1. viewsourceprint?2./交换整数
3、a、b 的值3.4. inlinevoidswap_int(int*a,int*b)5. 6.*a=*b;7.*b=*a;8.*a=*b;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 8 页 - - - - - - - - - 9. 10.11./Bresenhamslinealgorithm12.13.voiddraw_line(IMAGE*img,intx1,inty1,intx2,inty2,unsignedlongc)14.15./参数c为颜色值16.intdx
4、=abs(x2-x1),17.dy=abs(y2-y1),18.yy=0;19.20.if(dx0?1:-1,29.iy=(y2-y1)0?1:-1,30.cx=x1,31.cy=y1,32.n2dy=dy*2,33.n2dydx=(dy-dx)*2,34.d=dy*2-dx;35.36./如果直线与x轴的夹角大于 45 度37.if(yy)38.39.while(cx!=x2)40.41.if(d0)42.43.d+=n2dy;44.45.else46.47.cy+=iy;48.d+=n2dydx;49.50.51.putpixel(img,cy,cx,c);名师资料总结 - - -精品资料
5、欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 8 页 - - - - - - - - - 52.53.cx+=ix;54.55.56.57./如果直线与x轴的夹角小于度58.else59.60.while(cx!=x2)61.62.if(d0)63.64.d+=n2dy;65.66.else67.68.cy+=iy;69.d+=n2dydx;70.71.72.putpixel(img,cx,cy,c);73.74.cx+=ix;75.76.77.可以看到,在画线的循环中, 这个算法只用到了整数的加法,
6、所以可以非常的高效。接下来,我们再来看一看Bresenham画圆算法。Bresenham画圆算法又称中点画圆算法, 与 Bresenham 直线算法一样, 其基本的方法是利用判别变量来判断选择最近的像素点,判别变量的数值仅仅用一些加、减和移位运算就可以计算出来。为了简便起见,考虑一个圆心在坐标原点的圆,而且只计算八分圆周上的点,其余圆周上的点利用对称性就可得到。为什么只计算八分圆周上的点就可以了呢?和上面的直线算法类似,圆也有一个“八对称性”,如下图所示。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - -
7、- - - - 第 4 页,共 8 页 - - - - - - - - - 显然,我们只需要知道了圆上的一个点的坐标(x, y) ,利用八对称性,我们马上就能得到另外七个对称点的坐标。和直线算法类似, Bresenham画圆算法也是用一系列离散的点来近似描述一个圆,如下图。(上图来自于互联网络, 计算机图形学的概念与方法柳朝阳,郑州大学数学系)Bresenham画圆算法的流程图如下。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 8 页 - - - - - - - - -
8、 可以看到,与画线算法相比, 画圆的循环中用到了整数的乘法,相对复杂了一些。下面是一个 C语言实现版本。Java 代码1. viewsourceprint?2./八对称性3.名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 8 页 - - - - - - - - - 4. inlinevoid_draw_circle_8(IMAGE*img,intxc,intyc,intx,inty,unsignedlongc)5. 6./参数c为颜色值7.putpixel(img,xc+
9、x,yc+y,c);8.putpixel(img,xc-x,yc+y,c);9.putpixel(img,xc+x,yc-y,c);10.putpixel(img,xc-x,yc-y,c);11.putpixel(img,xc+y,yc+x,c);12.putpixel(img,xc-y,yc+x,c);13.putpixel(img,xc+y,yc-x,c);14.putpixel(img,xc-y,yc-x,c);15.16.17./Bresenhamscirclealgorithm18.voiddraw_circle(IMAGE*img,intxc,intyc,intr,intfill,
10、unsignedlongc)19.20./(xc,yc)为圆心,r为半径21./fill为是否填充22./c为颜色值23./如果圆在图片可见区域外,直接退出24.25.if(xc+r=img-w|yc+r=img-h)26.27.return;28.29.30.intx=0,y=r,yi,d;31.d=3-2*r;32.33.if(fill)34.35./如果填充(画实心圆)36.while(x=y)37.38.for(yi=x;yi=y;yi+)39.40._draw_circle_8(img,xc,yc,x,yi,c);41.42.if(d0)名师资料总结 - - -精品资料欢迎下载 -
11、- - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 8 页 - - - - - - - - - 43.44.d=d+4*x+6;45.46.else47.48.d=d+4*(x-y)+;49.y-;50.51.52.x+;53.54.55.else56.57./如果不填充(画空心圆)58.while(x=y)59.60._draw_circle_8(img,xc,yc,x,y,c);61.62.if(d0)63.64.d=d+4*x+6;65.66.else67.68.d=d+4*(x-y)+;69.y-;70.71.72.x+;73.74.75.可以看到, Bresenham画圆算法(中点圆算法)的实现也非常简单。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 8 页 - - - - - - - - -