任意数量控制点的贝兹曲线函数的实现
Posted dolaham
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了任意数量控制点的贝兹曲线函数的实现相关的知识,希望对你有一定的参考价值。
根据这篇文章(https://blog.csdn.net/aimeimeits/article/details/72809382)的介绍,贝兹曲线的方程其实是若干表达式的加:
a * (1 - t)^b * t^c * Pn
每一个控制点对应一个上面的表达式。a、b、c是该控制点对应的三个系数,它们的规律可以参见那篇文章的介绍。Pn 是第 n 个控制点。t 则是一个从 0 到 1 的浮点数,用来插值算出曲线的任一位置。
下面是 C# 的实现函数:
1 Vector3 bezierInterpolate(Vector3[] controlPoints, float t) 2 { 3 Vector3 ret = Vector3.zero; 4 5 int n = controlPoints.Length; 6 7 int[] yangHui = new int[n]; 8 9 bool nOdd = n % 2 != 0; 10 int hn = n / 2; 11 int mi = nOdd? hn: hn - 1; 12 13 yangHui[0] = 1; 14 for(int l = 1; l < n; ++l) 15 { 16 for(int i = mi; i > 0; --i) 17 { 18 yangHui[i] += yangHui[i - 1]; 19 } 20 } 21 22 for(int i = n - 1; i > mi; --i) 23 { 24 yangHui[i] = yangHui[n - 1 - i]; 25 } 26 27 int a = 1, b = n - 1, c = 0; 28 29 for(int i = 0; i < n; ++i) 30 { 31 Vector3 p = controlPoints[i]; 32 a = yangHui[i]; 33 ret += (a * Mathf.Pow(1 - t, b) * Mathf.Pow(t, c)) * p; 34 35 --b; 36 ++c; 37 } 38 39 return ret; 40 }
以上是关于任意数量控制点的贝兹曲线函数的实现的主要内容,如果未能解决你的问题,请参考以下文章