[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
/// <summary>
/// 由伯恩斯坦多项式推导出的三次贝塞尔曲线多项式(参数)
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public Vector4 BernsteinBasis(float t)
{
float invT = 1.0f - t;
return new Vector4(invT*invT*invT,//B0^3(t) = (1-t)^3
3.0f * t * invT * invT,
3.0f * t * t * invT,
t*t*t
);
}

/// <summary>
/// 三次伯恩斯坦导数多项式(参数)
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
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
);
}

/// <summary>
/// 根据参数来计算三次贝塞尔多项式
/// </summary>
/// <param name="posPatch"></param>
/// <param name="basisU"></param>
/// <param name="basisV"></param>
/// <returns></returns>
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;
}