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;
}
}
}