我有这个函数用于根据u,vs和vStep值计算u,v点的索引
function getIndex1( u,v, uStep, vStep ) {
var res = [];
for( var i = 0; i < 45; i++ ) {
res[i] = Math.round( v ) * 128 + Math.round( u );
v += vStep;
u += uStep;
}
return res;
}
如果我尝试插入此函数,我会得到这个
function getIndex2( u,v, uStep, vStep ) {
var res = [];
v *= 128;
vStep *= 128;
for( var i = 0; i < 45; i++ ) {
res[i] = Math.round( v + u );
v += vStep;
u += uStep;
}
return res;
}
当u,v,uStep,vStep为整数时,这种方法很有效,当这些值为浮点数时会出现问题。 我有预感,我需要一些“bresenham代码”来实现我的目标。 希望有些人可以帮助我。
答案 0 :(得分:1)
我认为问题在于,当您的步长值是浮点时,数学误差会累积循环的每次迭代。解决这个问题的方法是将每个步骤值乘以索引。
function getIndex(u, v, uStep, vStep) {
var res = [];
for (var i = 0; i < 45; ++i) {
var du = uStep * i;
var dv = vStep * i;
res[i] = Math.round(v + dv) * 128 + Math.round(u + du);
}
return res;
}
这减少了错误,因为浮点计算仅在每个循环中发生一次,并且对下一次迭代没有影响。作为附带好处,这应该会略微提高算法的性能。