正確計算點我寫應該從控制點的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.4437500000000001
爲X,0.5625
爲Ÿ和-4.683753385137379e-17
爲z,那就是不是我所期望的。我的意思是,乍一看,x和y的返回值看起來似乎合理,但考慮到控制點矩陣提供的值,z的返回值看起來完全錯誤。
據我所知,Bézier曲線的點以及Bézier曲面的點總是包含在控制多邊形的凸包中,這裏用4x4矩陣的點表示。所以,當控制點的z值範圍僅從-1.0
到1.0
時,表面的計算點如何具有z值< -4.0
?
如果我們假設結果爲錯,一定是有什麼毛病我的函數計算表面上的點,但是雖然在bezierSurface
和貝塞爾表面的一段時間的數學定義交替地盯着,我沒能夠發現錯誤呢。我希望別人可以。
哇,非常感謝你的回答!我認爲** e-17 **僅僅是一些更多數字的縮寫,沒有什麼會改變整個表達的意義。我的瀏覽器不應該期望我知道這一點。 :-P – SickBoy
這被稱爲科學記數法,並不是特定於瀏覽器的。 – Thomas