using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BezierUtils
{
///
/// 二次贝塞尔曲线:根据T值,计算贝塞尔曲线上面相对应的点
///
/// T值
/// 起始点
/// 控制点
/// 目标点
/// 根据T值计算出来的贝赛尔曲线点
public static Vector3 CalculateBezierPointN2(float t, Vector3 pStartV, Vector3 pControlV, Vector3 pEndV)
{
float u = 1 - t;
Vector3 tPos = u * u * pStartV;
tPos += 2 * u * t * pControlV;
tPos += t * t * pEndV;
return tPos;
}
///
/// 二次贝塞尔曲线:获取存储贝塞尔曲线点的数组
///
/// 起始点
/// 控制点
/// 目标点
/// 采样点的数量
/// 存储贝塞尔曲线点的数组
public static Vector3[] GetBezierListN2(Vector3 pStartV, Vector3 pControlV, Vector3 pEndV, int pSegment)
{
Vector3[] tPath = new Vector3[pSegment + 1];
for (int i = 0; i <= pSegment; i++)
{
float t = i / (float)pSegment;
Vector3 pixel = CalculateBezierPointN2(t, pStartV, pControlV, pEndV);
tPath[i] = pixel;
}
return tPath;
}
///
/// 二次贝塞尔曲线:根据T值,计算贝塞尔曲线上面相对应的点
///
/// T值
/// 起始点
/// 控制点1
/// 控制点2
/// 目标点
/// 根据T值计算出来的贝赛尔曲线点
public static Vector3 CalculateBezierPointN3(float t, Vector3 pStartV, Vector3 pControlV1, Vector3 pControlV2, Vector3 pEndV)
{
float u = 1 - t;
Vector3 tPos = Vector3.zero;
tPos = u * u * u * pStartV;
tPos += 3 * u * u * t * pControlV1;
tPos += 3 * u * t * t * pControlV2;
tPos += t * t * t * pEndV;
return tPos;
}
///
/// 三次贝塞尔曲线:获取存储贝塞尔曲线点的数组
///
/// 起始点
/// 控制点1
/// 控制点2
/// 目标点
/// 采样点的数量
/// 存储贝塞尔曲线点的数组
public static Vector3[] GetBezierListN3(Vector3 pStartV, Vector3 pControlV1, Vector3 pControlV2, Vector3 pEndV, int pSegment)
{
Vector3[] tPath = new Vector3[pSegment + 1];
for (int i = 0; i <= pSegment; i++)
{
float t = i / (float)pSegment;
Vector3 pixel = CalculateBezierPointN3(t, pStartV, pControlV1, pControlV2, pEndV);
tPath[i] = pixel;
}
return tPath;
}
}