[toc]
# 贝赛尔曲线
什么是贝塞尔曲线?
比如有三个控制点,二次贝塞尔就是通过这三个控制点的连线进行了两次线性插值 直接给结论: (朴素的也可以用递归的方式来计算) N 阶贝赛尔曲线可以使用伯恩斯坦基函数的形式来表示:
基于伯恩斯坦多项式求第 t 的三次贝塞尔曲线多项式算法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
public Vector4 BernsteinBasis(float t) { float invT = 1.0f - t; return new Vector4(invT*invT*invT, 3.0f * t * invT * invT, 3.0f * t * t * invT, t*t*t ); }
public Vector4 dBernsteinBasis(float t) { float invT = 1.0f - t; return new Vector4( -3 * invT * invT, 3 * invT * invT - 6 * t * invT, 6 * t * invT - 3 * t * t, 3*t*t ); }
public Vector3 CubicBezierSum(List<Vector3> posPatch,Vector4 basisU,Vector4 basisV) {
Vector3 sum = new Vector3(0.0f, 0.0f, 0.0f); sum = basisV.x * (basisU.x * posPatch[0] + basisU.y * posPatch[1] + basisU.z * posPatch[2] + basisU.w * posPatch[3]); sum += basisV.y * (basisU.x * posPatch[4] + basisU.y * posPatch[5] + basisU.z * posPatch[6] + basisU.w * posPatch[7]); sum += basisV.z * (basisU.x * posPatch[8] + basisU.y * posPatch[9] + basisU.z * posPatch[10] + basisU.w * posPatch[11]); sum += basisV.w * (basisU.x * posPatch[12] + basisU.y * posPatch[13] + basisU.z * posPatch[14] + basisU.w * posPatch[15]); return sum; }
|