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改变了游戏,我想得更多