using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public static class BezierFunctions
{
    /// <summary>
    /// 用于计算参考点的位置
    /// 我们想像一个立方体,开始点与结束点分别位于这个立方体的两个对角,那么剩下的六个点即为各个参考点
    /// </summary>
    public static Vector3 GetReferencePoint(Vector3 startPoint, Vector3 endPoint, ReferencePointLocation location)
    {
        switch (location)
        {
            case ReferencePointLocation.Near: return new Vector3(endPoint.x, endPoint.y, startPoint.z);
            case ReferencePointLocation.Far: return new Vector3(startPoint.x, startPoint.y, endPoint.z);
            case ReferencePointLocation.RightTop: return new Vector3(endPoint.x, startPoint.y, startPoint.z);
            case ReferencePointLocation.RightBottom: return new Vector3(endPoint.x, endPoint.y, startPoint.z);
            case ReferencePointLocation.LeftTop: return new Vector3(startPoint.x, startPoint.y, endPoint.z);
            case ReferencePointLocation.LeftBottom: return new Vector3(startPoint.x, endPoint.y, endPoint.z);
        }
        return new Vector3();

    }
    /// <summary>
    /// 计算贝塞尔曲线上的点,任意参考点
    /// </summary>
    /// <param name="t">取值区间为0-1,它代表取值的位置</param>
    /// <param name="startPoint">开始点</param>
    /// <param name="endPoint">结束点</param>
    /// <param name="vertice">控制点</param>
    public static Vector3 GetBezierPoint(Vector3 startPoint, Vector3 endPoint, Vector3 vertice, float t)
    {
        //需要注意,当你的所谓的曲线是一条直线,即输入参数vertice为一个0向量,那么该方法会失效,你需要在计算参考点时解决这个问题
        float u = 1 - t;
        float tt = t * t;
        float uu = u * u;
        return uu * startPoint + 2 * u * t * endPoint + tt * vertice;
    }
    /// <summary>
    /// 计算贝塞尔曲线上的点,特殊参考点
    /// </summary>
    /// <param name="t">取值区间为0-1,它代表取值的位置</param>
    /// <param name="startPoint">开始点</param>
    /// <param name="endPoint">结束点</param>
    /// <param name="vertice">控制点</param>
    /// <returns></returns>
    public static Vector3 GetBezierPoint(Vector3 startPoint, Vector3 endPoint, ReferencePointLocation location, float t)
    {
        var vertice = GetReferencePoint(startPoint, endPoint, location);
        float u = 1 - t;
        float tt = t * t;
        float uu = u * u;
        return uu * startPoint + 2 * u * t * vertice + tt * endPoint;
    }
}
