插值浮点数

3
我有一个函数,用于根据各自的uStep和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代码”来实现我的目标。 希望有人能帮助我。


让我猜猜,你正在画一条线? - tobspr
不行,线性纹理映射 - arcollector
你可能需要通过使用.toFixed()或在round()发生之前将它们转换为整数来处理浮点数。还有很多与Javascript浮点问题相关的其他问题- https://dev59.com/enE95IYBdhLWcg3wp_gg - Asta
这是我在这个问题上找到的最佳答案: https://dev59.com/tXM_5IYBdhLWcg3wQQpd - Zachary Carter
1个回答

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;
}

这样做可以减少误差,因为每次循环只进行一次浮点数计算,并且对下一次迭代没有影响。作为一个副作用,这应该稍微提高您的算法性能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接