我試圖在我的程序中實現N階貝塞爾曲線的公式。 它在我看來,我做了一切正確,但視覺效果不正確。N順序的貝塞爾曲線
這就是:
紅色立方體是P0和藍色是P8。 白色立方體是製作曲線的實際一組點。 橙色立方體是控制點。
我所看到的是曲線末端附近有一個循環,曲線連接到最後一個(藍色立方體)點。看起來有一個看不見的地方。 另一件事是,P0和P1之間也是奇怪的事情...
任何人都可以幫我解決它嗎?
這裏是我使用的代碼:
private void Update()
{
controlPointsCoords = ControlPoints.Select(p => p.transform.position).ToArray();
for (int p = 0; p < PointsSet.Count; p++)
{
PointsSet[p].transform.position = CurveDegreeN
(
controlPointsCoords,
Rt(p, PointsSet.Count)
);
}
}
private Vector3 CurveDegreeN(Vector3[] pointsCoords, float u)
{
float X = 0, Y = 0, Z = 0;
float n = pointsCoords.Length - 1;
for (int i = 0; i < pointsCoords.Length; i++)
{
var coef = (Factorial(n)/(Factorial((float)i) * Factorial(n - i))) * Mathf.Pow(u, i) * Mathf.Pow(1 - u, n - i);
X += coef * pointsCoords[i].x;
Y += coef * pointsCoords[i].y;
Z += coef * pointsCoords[i].z;
}
return new Vector3(X, Y, Z);
}
private float Factorial(float n)
{
if (n == 0) return 1;
float res = 0.0f;
for (int i = 1; i < n; i++) res += (float)Math.Log(i);
return (float)Math.Exp(res);
}
private float Rt(int current, int count)
{
return ((float)current - 0)/((float)count - 0) * (1 - 0) + 0;
}
我希望這將是明確的人! 提前謝謝!
更新: 我將積分減少到3.以下是結果:3 Points curve。 在這裏清晰可見,計算中出現了一些問題......還有什麼建議?
您能否顯示視覺效果以及如何繪製?另外:你看到[這](http://stackoverflow.com/questions/15599766/n-th-order-bezier-curves)? – TaW
你可以看到,如果你去的視覺效果:https://i.stack.imgur.com/Iuitt.png –
@GeorgeVasilchenko你的'coef'幾乎肯定會計算錯誤(所以基本的調試包括打印它們,看看無論它們是否有意義),也是Bezier實現的原因之一,它絕對值得使用de Casteljau的算法來重新實現您的解決方案,因爲它不依賴於這些更高級的數學結構,所以不會出錯。見答案。 –