using System.Collections.Generic; using UnityEngine; namespace Core.Utility { /// /// 贝塞尔曲线 /// public class BesselPath { public List PosList; private List _time = new List(); public void SetPos(List PosList) { this.PosList = PosList; List allbs = new List(); float allb = 0; for (int i = 0; i < PosList.Count; i += 3) { if (i + 3 > PosList.Count) { break; } Vector3 p1 = PosList[i]; Vector3 p2 = PosList[i + 1]; Vector3 p3 = PosList[i + 2]; float b = GetPathCount(p1, p2, p3, 100); allb += b; allbs.Add(b); } _time.Clear(); float allt = 0; for (int i = 0; i < allbs.Count; i++) { float currt = allbs[i] / allb; allt+=currt; _time.Add(allt); } } private float GetPathCount(Vector3 p1, Vector3 p2, Vector3 p3, int count) { float step = 1f / count; Vector3 startPos = p1; float d = 0; for (int i = 1; i < count; i++) { float t = i * count; Vector3 a = Vector3.Lerp(p1, p2, t); Vector3 b = Vector3.Lerp(a, p3, t); d += Vector3.Distance(startPos, b); startPos = b; } return d; } public float GetPathCount(int count) { float step = 1f / count; Vector3 startPos = GetValue(0); float d = 0; for (int i = 1; i < count; i++) { Vector3 currPos = GetValue(step * i); d += Vector3.Distance(startPos, currPos); } return d; } public Vector3 GetValue(float t) { int startIndex = 0; float allt = 0; float startt = 0; for (int i = 0; i < _time.Count; i++) { if (t < _time[i]) { startIndex = i * 3; allt = _time[i]; if (i > 0) { allt= _time[i] - _time[i - 1]; startt= _time[i - 1]; } break; } } float t1 = (t - startt) / allt; if (t1 > 1) { t1 = 1; } if (t1 < 0) { t1 = 0; } Vector3 a = PosList[startIndex]; Vector3 p2 = PosList[startIndex + 1]; Vector3 p3 = PosList[startIndex + 2]; Vector3 b = Vector3.Lerp(a, p2, t1); Vector3 c = Vector3.Lerp(b, p3, t1); return c; } } }