2016-01-12 85 views
1

正確計算點我寫應該從控制點的4×4矩陣上的雙三次Bézier surface返回點參數u和v,其是在[0,1],使用Bernstein polynomials的元件的功能。但是,我的功能無法像它應該那樣工作,或者我對這件事的理解甚至比我想象的還要糟糕。上的雙三次貝塞爾表面

計算點的功能如下:

var bezierSurface = function (u, v, p) { 
    var result = []; 

    var p00 = p[0], p01 = p[1], p02 = p[2], p03 = p[3], 
     p10 = p[4], p11 = p[5], p12 = p[6], p13 = p[7], 
     p20 = p[8], p21 = p[9], p22 = p[10], p23 = p[11], 
     p30 = p[12], p31 = p[13], p32 = p[14], p33 = p[15]; 

    var uin = (1 - u), 
     vin = (1 - v); 

    var bu0 = Math.pow(uin, 3), 
     bu1 = 3 * u * Math.pow(uin, 2), 
     bu2 = 3 * Math.pow(u, 2) * uin, 
     bu3 = Math.pow(u, 3); 

    var bv0 = Math.pow(vin, 3), 
     bv1 = 3 * v * Math.pow(vin, 2), 
     bv2 = 3 * Math.pow(v, 2) * vin, 
     bv3 = Math.pow(v, 3); 

    for (var i = 0; i < 3; i++) { 
    result.push(
     p00[i] * bu0 * bv0 + 
     p01[i] * bu0 * bv1 + 
     p02[i] * bu0 * bv2 + 
     p03[i] * bu0 * bv3 + 

     p10[i] * bu1 * bv0 + 
     p11[i] * bu1 * bv1 + 
     p12[i] * bu1 * bv2 + 
     p13[i] * bu1 * bv3 + 

     p20[i] * bu2 * bv0 + 
     p21[i] * bu2 * bv1 + 
     p22[i] * bu2 * bv2 + 
     p23[i] * bu2 * bv3 + 

     p30[i] * bu3 * bv0 + 
     p31[i] * bu3 * bv1 + 
     p32[i] * bu3 * bv2 + 
     p33[i] * bu3 * bv3 
    ); 
    } 

    return result; 
}; 

最有可能這是不是完成任務的最有效方式,但因爲我剛開始使用參數曲面,我儘量讓事情儘可能簡單,甚至不要考慮用曲面來獲取三角形的頂點或類似的東西。現在

,該問題出現時,我打電話與下列參數的函數:

var getSurfacePoint = function() { 
    var u = 0.5, 
     v = 0.25; 

    var cp = [ 
    [-1.0, 0.0, -1.0], 
    [-0.5, 0.3, -0.8], 
    [ 0.5, 0.3, -0.8], 
    [ 1.0, 0.0, -1.0], 

    [-0.8, 0.3, -0.5], 
    [-0.3, 1.0, -0.4], 
    [ 0.3, 1.0, -0.4], 
    [ 0.8, 0.3, -0.5], 

    [-0.8, 0.3, 0.5], 
    [-0.3, 1.0, 0.4], 
    [ 0.3, 1.0, 0.4], 
    [ 0.8, 0.3, 0.5], 

    [-1.0, 0.0, 1.0], 
    [-0.5, 0.3, 0.8], 
    [ 0.5, 0.3, 0.8], 
    [ 1.0, 0.0, 1.0] 
    ]; 

    return bezierSurface(u, v, cp); 
}; 

通過getSurfacePoint調用bezierSurface的結果是-0.4437500000000001X0.5625Ÿ-4.683753385137379e-17z,那就是不是我所期望的。我的意思是,乍一看,x和y的返回值看起來似乎合理,但考慮到控制點矩陣提供的值,z的返回值看起來完全錯誤。

據我所知,Bézier曲線的點以及Bézier曲面的點總是包含在控制多邊形的凸包中,這裏用4x4矩陣的點表示。所以,當控制點的z值範圍僅從-1.01.0時,表面的計算點如何具有z值< -4.0

如果我們假設結果錯,一定是有什麼毛病我的函數計算表面上的點,但是雖然在bezierSurface和貝塞爾表面的一段時間的數學定義交替地盯着,我沒能夠發現錯誤呢。我希望別人可以。

回答

1

用於Z的返回值只是看起來完全錯誤

-4.683753385137379 E-17,該值是(幾乎)0的結果看起來相當正確的。

+0

哇,非常感謝你的回答!我認爲** e-17 **僅僅是一些更多數字的縮寫,沒有什麼會改變整個表達的意義。我的瀏覽器不應該期望我知道這一點。 :-P – SickBoy

+0

這被稱爲科學記數法,並不是特定於瀏覽器的。 – Thomas