HartoukChartEditor/Assets/Script/Core/BezierFunctions.cs

57 lines
2.6 KiB
C#

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