Bresenham的线算法与朴素向量加法

lin*_*le5 1 c++ optimization bresenham

给定的xlen是delta-x,ylen是delta-y,len是行的长度,为什么这个代码:

//Bresenham implementation
float x = x0, y = y0;

if (slope < 1) {
    while (x < xlen) {
        paintpt(x, y));
         x += step;
        if (left.y > right.y) 
            y += slope * step;
        else 
            y -= slope * step;
   }
}
Run Code Online (Sandbox Code Playgroud)

比这个代码更有效率?

//Naive vector addition
int x = x0, y = y0;
float xinc = xlen / len, yinc = ylen / len;

for (float i = 0; i < len; i++) {
   paintpt(x, y);
   x += i * xinc;
   y += i * yinc;
}
Run Code Online (Sandbox Code Playgroud)

(我的意思是,除了初始化之外,很明显.假设你只给出了线长和方向,并且必须退出斜坡和诸如此类的东西.)

use*_*108 5

Bresenham算法来自60年代,当时计算机适合大壁橱.它的标志是:

  • 没有浮点数学,
  • 没有乘法/除法.

因为在那些日子里,甚至整数除法和乘法都是"昂贵的"."真正的"Bresenham实现不会分割/乘法,也不会使用浮点数学.您的实施是"错误的".点击这里查看"真实"的.