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