2013-11-21 54 views
3

我有這個功能,我用它來從u計算指數,V基於其各自uStep點和VSTEP值插值彩車

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

讓我猜測,你正在畫一條線? – tobspr

+0

nope,線性紋理映射 – arcollector

+0

你可能應該使用.tofixed()或者在round()發生之前將它們轉換爲Ints來處理浮點數。還有其他一些與Javascript浮動問題相關的問題 - http://stackoverflow.com/questions/2221167/javascript-formatting-a-rounded-number-to-n-decimals – Asta

回答

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

這可以減少錯誤,因爲浮點計算僅在每個循環中出現一次,並且不會影響下一次迭代。作爲一個副作用,這應該稍微改進算法的性能。