using System.Collections; using System.Collections.Generic; using UnityEngine; namespace TFramework { /// /// 贝塞尔曲线 /// public class BezierCurve { static List vector2s = new List(); static List vector3s = new List(); /// /// 阶乘 /// /// /// private static long Factoral(int n) { long result = 1; for (int i = 2; i <= n; i++) result *= i; return result; } /// /// 计算组合数 /// /// /// /// private static long BinomialCoeffcient(int n,int k)=> Factoral(n) / Factoral(k) * Factoral(n - k); /// /// 获取Vector2贝塞尔曲线上的点 /// /// 范围值(0~1) /// 控制点 /// public static Vector2 CalculateVector2BezierPoint(float t,IEnumerable controlPoints) { Vector2 point = Vector2.zero; vector2s.Clear(); vector2s.AddRange(controlPoints); int n = vector2s.Count - 1; for(int i=0;i<=n;i++) { float binomialCoefficient = BinomialCoeffcient(n, i); float term = binomialCoefficient * Mathf.Pow(1 - t, n - i) * Mathf.Pow(t, i); point += term * vector2s[i]; } return point; } /// /// 获取Vector3贝塞尔曲线上的点 /// /// 范围值(0~1) /// 控制点 /// public static Vector3 CalculateVector3BezierPoint(float t, IEnumerable controlPoints) { Vector3 point = Vector3.zero; vector3s.Clear(); vector3s.AddRange(controlPoints); int n = vector3s.Count - 1; for (int i = 0; i <= n; i++) { float binomialCoefficient = BinomialCoeffcient(n, i); float term = binomialCoefficient * Mathf.Pow(1 - t, n - i) * Mathf.Pow(t, i); point += term * vector3s[i]; } return point; } } }