Bresenham高效画线算法

画线的算法不少,但要作到高速、简单并不容易。斜率相乘法是最简单的方法之一,但计算每个点均要花费不少时间用于乘、除法运算;下面介绍的是Bresenham's高效画线算法,对每个点的坐标计算只要加、减法就能完成。
简化算法用伪Pascal语言描述如下:
Code:
  1. procedure DrawLine(x1, y1, x2, y2: Integer);  
  2. var  
  3. x, y, DeltaX, DeltaY, HalfX, ErrorTerm, i: Integer;  
  4. begin  
  5. DeltaX := x2 - x1;  
  6. DeltaY := y2 - y1;  
  7. HalfX := (x2 - x1) shr 1;  
  8. ErrorTerm := 0;  
  9. x := x1;  
  10. y := y1;  
  11. for i:=0 to DeltaX do  
  12. begin  
  13. Plot(X, Y);  
  14. Inc(x);  
  15. ErrorTerm := ErrorTerm + DeltaY;  
  16. if ErrorTerm>HalfX then  
  17. begin  
  18. ErrorTerm := ErrorTerm - DeltaX;  
  19. Inc(y);  
  20. end;  
  21. end;  
  22. end;  
  23. 为方便阅读,上述程序作了简化。实际程序应略作修正,以分别处理DeltaX与DeltaY比较大小, 必要时交换起始、结束点等。  
  24. 修正后的的伪Pascal算法如下:  
  25. procedure DrawLine(x1, y1, x2, y2: Integer);  
  26. var  
  27. x, y, DeltaX, DeltaY, HalfCount, ErrorTerm, i, Flag: Integer;  
  28. begin  
  29. DeltaX := x2 - x1;  
  30. DeltaY := y2 - y1;   
  31.   
  32. if Abs(DeltaY)<Abs(DeltaX) then  
  33. begin  
  34. if DeltaX<0 then  
  35. begin  
  36. i := x1; x1 := x2; x2 := i;  
  37. i := y1; y1 := y2; y2 := i;  
  38. DeltaX := x2 - x1;  
  39. DeltaY := y2 - y1;  
  40. end;  
  41. if DeltaY<0 then Flag := -1  
  42. else Flag := 1;  
  43. DeltaY := Abs(DeltaY);  
  44. HalfCount := DeltaX shr 1;  
  45. ErrorTerm := 0;  
  46. x := x1;  
  47. y := y1;  
  48. for i:=0 to DeltaX do  
  49. begin  
  50. Plot(X, Y);  
  51. Inc(x);  
  52. ErrorTerm := ErrorTerm + DeltaY;  
  53. if ErrorTerm>HalfCount then  
  54. begin  
  55. ErrorTerm := ErrorTerm - DeltaX;  
  56. y := y + Flag;  
  57. end;  
  58. end;  
  59. end  
  60. else  
  61. begin  
  62. if DeltaY<0 then  
  63. begin  
  64. i := x1; x1 := x2; x2 := i;  
  65. i := y1; y1 := y2; y2 := i;  
  66. DeltaX := x2 - x1;  
  67. DeltaY := y2 - y1;  
  68. end;  
  69. if DeltaX<0 then Flag := -1  
  70. else Flag := 1;  
  71. DeltaX := Abs(DeltaX);  
  72. HalfCount := DeltaY shr 1;  
  73. ErrorTerm := 0;  
  74. x := x1;  
  75. y := y1;  
  76. for i:=0 to DeltaY do  
  77. begin  
  78. Plot(X, Y);  
  79. Inc(y);  
  80. ErrorTerm := ErrorTerm + DeltaX;  
  81. if ErrorTerm>HalfCount then  
  82. begin  
  83. ErrorTerm := ErrorTerm - DeltaY;  
  84. x := x + Flag;  
  85. end;  
  86. end;  
  87. end;  
  88. end;  
  89.    
  90.   
  91.    
  92.   
  93.    

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值