欢迎来到天天文库
浏览记录
ID:15390460
大小:179.50 KB
页数:8页
时间:2018-08-03
《bresenham直线算法与画圆算法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Bresenham直线算法与画圆算法文章分类:Java编程计算机是如何画直线的?简单来说,如下图所示,真实的直线是连续的,但我们的计算机显示的精度有限,不可能真正显示连续的直线,于是我们用一系列离散化后的点(像素)来近似表现这条直线。 (上图来自于互联网络,《计算机图形学的概念与方法》柳朝阳,郑州大学数学系) 接下来的问题就是如何尽可能高效地找到这些离散的点,Bresenham直线算法就是一个非常不错的算法。 Bresenham直线算法是用来描绘由两点所决定的直线的算法,它会算出一条线段在n维光栅上最接近的点。这个算法只会用到较为快速的
2、整数加法、减法和位元移位,常用于绘制电脑画面中的直线。是计算机图形学中最先发展出来的算法。 (引自wiki百科布雷森漢姆直線演算法) 这个算法的流程图如下: 可以看到,算法其实只考虑了斜率在0~1之间的直线,也就是与x轴夹角在0度到45度的直线。只要解决了这类直线的画法,其它角度的直线的绘制全部可以通过简单的坐标变换来实现。 下面是一个C语言实现版本。Java代码 1.view sourceprint? 2. // 交换整数 a 、b 的值 3. 4.inline void swap_int(int *a, int *b)
3、 5.{ 6. *a ^= *b; 7. *b ^= *a; 8. *a ^= *b; 1.} 2. 3.// Bresenham's line algorithm 4. 5.void draw_line(IMAGE *img, int x1, int y1, int x2, int y2, unsigned long c) 6.{ 7. // 参数 c 为颜色值 8. int dx = abs(x2 - x1), 9. dy = abs(y
4、2 - y1), 10. yy = 0; 11. 12. if(dx < dy) 13. { 14. yy = 1; 15. swap_int(&x1, &y1); 16. swap_int(&x2, &y2); 17. swap_int(&dx, &dy); 18. } 19. 20. int ix = (x2 - x1) > 0 ? 1 : -1, 21. iy =
5、(y2 - y1) > 0 ? 1 : -1, 22. cx = x1, 23. cy = y1, 24. n2dy = dy * 2, 25. n2dydx = (dy - dx) * 2, 26. d = dy * 2 - dx; 27. 28.// 如果直线与 x 轴的夹角大于45度 29. if(yy) 30. { 31. while(cx != x2) 32. {
6、 33. if(d < 0) 34. { 35. d += n2dy; 36. } 37. else 38. { 39. cy += iy; 40. d += n2dydx; 41. } 42. 43. putpixel(img, cy, cx, c);
7、 1. 2. cx += ix; 3. } 4. } 5. 6.// 如果直线与 x 轴的夹角小于 度 7. else 8. { 9. while(cx != x2) 10. { 11. if(d < 0) 12. { 13. d += n2dy; 14. } 15. else
8、 16. { 17. cy += iy; 18.
此文档下载收益归作者所有