C++ 布雷森厄姆';s线算法与朴素向量加法

C++ 布雷森厄姆';s线算法与朴素向量加法,c++,optimization,bresenham,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

给定
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;
   }
}
//Bresenham实现
浮点数x=x0,y=y0;
如果(坡度<1){
while(xright.y)
y+=斜率*阶跃;
其他的
y-=斜率*阶跃;
}
}
还有比这代码更有效的吗

//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;
}
//原始向量加法
int x=x0,y=y0;
浮点数xinc=xlen/len,yinc=ylen/len;
for(浮点i=0;i
(我的意思是,除了初始化,很明显。假设你只得到了线的长度和方向,并且必须退出坡度和其他什么的。)

1)
x+=I*xinc这是四舍五入为整数的浮点乘法。它并不能保证你从开始的
x
到最后的
x
都是整数。这意味着你的线可能有洞

2) 您的Bresenham实现是错误的。您不向
x
添加步骤。在每次迭代中递增
x
,并将
delta_y
添加到错误计数器中。当错误计数器大于
delta_x
时,可以从错误计数器中增加y并减去delta_x

这是对
delta_y
大于0且低于
delta_x
的行的解释。对所有其他情况进行旋转

3) 为了提高效率:这有点棘手。最古老的计算机不能轻易地进行浮点计算。在奔腾之前,通常没有任何x87协处理器,所有浮点计算都是在软件中完成的。这比简单的整数运算慢1000倍。如今,所有计算机都可以进行SIMD操作(即使用);可能不再是这样了。

1)
x+=i*xinc这是四舍五入为整数的浮点乘法。它并不能保证你从开始的
x
到最后的
x
都是整数。这意味着你的线可能有洞

2) 您的Bresenham实现是错误的。您不向
x
添加步骤。在每次迭代中递增
x
,并将
delta_y
添加到错误计数器中。当错误计数器大于
delta_x时,可以从错误计数器中增加y并减去delta_x

这是对
delta_y
大于0且低于
delta_x
的行的解释。对所有其他情况进行旋转


3) 为了提高效率:这有点棘手。最古老的计算机不能轻易地进行浮点计算。在奔腾之前,通常没有任何x87协处理器,所有浮点计算都是在软件中完成的。这比简单的整数运算慢1000倍。如今,所有计算机都可以进行SIMD操作(即使用);现在可能不再是这样了。

布雷森汉姆算法起源于60年代,当时计算机可以放在大衣橱里。其特点是:

  • 没有浮点运算
  • 没有乘法/除法

因为在那些日子里,甚至整数除法和乘法都是“昂贵的”。“true”Bresenham实现不会除法/乘法,也不会使用浮点数学。您的实现是“错误的”。检查一个“真实”的算法。

布雷森汉姆算法起源于60年代,当时计算机可以放在大衣橱里。其特点是:

  • 没有浮点运算
  • 没有乘法/除法


因为在那些日子里,甚至整数除法和乘法都是“昂贵的”。“true”Bresenham实现不会除法/乘法,也不会使用浮点数学。您的实现是“错误的”。检查一个“真实”的。

如果我没记错的话,那就不一样了。Bresenham的“步骤”各不相同。嗯,如果它以
float x=
开头,那么它就不是真正的Bresenham。在这里,请阅读:真正优化的Bresenham不使用浮点,循环内也没有乘法。这里根本没有任何Bresenham算法。如果我没记错的话,那就不一样了。Bresenham的“步骤”各不相同。嗯,如果它以
float x=
开头,那么它就不是真正的Bresenham。这里,请阅读:真正优化的Bresenham不使用浮点,循环内也没有乘法。这里根本没有任何Bresenham算法。顺便说一下,SIMD并不意味着浮点运算。许多支持SIMD的DSP仍然不能进行本机浮点运算。对于那些在硬件中浮动的,它仍然比在硬件中的int慢。你是对的。我的答案是高度简化的,并且偏向于x86CPU。这不仅仅是高度简化。不太对。奔腾中的浮点运算速度更快(比旧处理器更快),这不是因为奔腾可以执行SIMD。这是因为奔腾内置了浮点运算。MMX指令与浮点单元共享寄存器集只是一个设计细节。SIMD和浮点运算在功能上是不同的。事实上,如果您在奔腾中使用SIMD,那么浮点操作将被模拟。为了使用SIMD,您不能再使用浮点运算了,因为浮点堆栈共享寄存器。这取决于SIMD指令集是什么。如果你能在一个周期内乘以4个浮点数,那当然会使乘法更快(如果它适用于这个问题的话)。@thang不是我说的吗
在奔腾之前,没有任何x87协处理器是很常见的,所有浮点计算都是在软件中完成的。
。奔腾已经有20年的历史了,当我说:现在SIMD改变了游戏,我想得更多