using System; using System.Collections; using System.Collections.Generic; using UnityEngine; /// /// 贝塞尔曲线计算边缘点 /// public class UnitAlgorithmEdgePoint : UnitAlgorithm { /// 三阶贝塞尔曲线计算边缘点 public UnitAlgorithmEdgePoint() { } public void Compute(DataPolygon data) { //List points = new List(data.points); //List edgePoints = new List(); //for (int i = 0; i < points.Count; i++) { // DataPoint aPoint = points.LoopIndex(i); // DataPoint bPoint = points.LoopIndex(i + 1); // if (!aPoint.isCurveAfter && !bPoint.isCurveFront) { // edgePoints.Add(aPoint.position); // } // if (!aPoint.isCurveAfter && bPoint.isCurveFront) { // edgePoints.AddRange(CreateLine(aPoint, bPoint, bPoint.frontBezier, data.edgeSmooth)); // } // if (aPoint.isCurveAfter && !bPoint.isCurveFront) { // edgePoints.AddRange(CreateLine(aPoint, bPoint, aPoint.afterBezier, data.edgeSmooth)); // } // if (aPoint.isCurveAfter && bPoint.isCurveFront) { // edgePoints.AddRange(CreateLine(aPoint, bPoint, data.edgeSmooth)); // } //} //data.edgePoints = edgePoints; } #region 函数 /// 二阶贝塞尔线段 public List CreateLine(DataPlatePoint aPoint, DataPlatePoint bPoint, Vector3 b, float smooth) { List points = new List(); //方向,距离 Vector2 direction = (bPoint.position - aPoint.position).normalized; float distance = Vector2.Distance(bPoint.position, aPoint.position); //求余,得商数 int quotient = Quotient(distance, smooth); //贝塞尔曲线点 Vector3 a = aPoint.position; Vector3 c = bPoint.position; for (int i = 0; i < quotient; i++) { float t = i * (distance / quotient) / distance; Vector2 position = ComputeBezier(a, b, c, t); points.Add(position); } return points; } /// 三阶贝塞尔线段 public List CreateLine(DataPlatePoint aPoint, DataPlatePoint bPoint, float smooth) { List points = new List(); //方向,距离 Vector2 direction = (bPoint.position - aPoint.position).normalized; float distance = Vector2.Distance(bPoint.position, aPoint.position); //求余,得商数 int quotient = Quotient(distance, smooth); //贝塞尔曲线点 //Vector3 a = aPoint.position; //Vector3 b = aPoint.afterBezier; //Vector3 c = bPoint.frontBezier; //Vector3 d = bPoint.position; //for (int i = 0; i < quotient; i++) { // float t = i * (distance / quotient) / distance; // Vector2 position = ComputeBezier(a, b, c, d, t); // points.Add(position); //} return points; } #endregion #region 算法 /// 商数 public static int Quotient(float distance, float smooth) { int a = (int)(distance * 1000); int b = (int)(smooth * 1000); return Math.DivRem(a, b, out int remainder); } /// /// 一阶贝塞尔算法 /// /// 起点 /// 终点 /// 进度 /// public static Vector3 ComputeBezier(Vector3 a, Vector3 b, float t) { return a + (b - a) * t; } /// /// 二阶贝塞尔算法 /// /// 起点 /// 贝塞尔点 /// 终点 /// 进度 /// 当前进度的曲线点 public static Vector3 ComputeBezier(Vector3 a, Vector3 b, Vector3 c, float t) { Vector3 aa = a + (b - a) * t; Vector3 bb = b + (c - b) * t; return aa + (bb - aa) * t; } /// /// 三阶贝塞尔算法 /// /// 起点 /// 起点的贝塞尔点 /// 终点的贝塞尔点 /// 终点 /// 进度 /// 当前进度的曲线点 public static Vector3 ComputeBezier(Vector3 a, Vector3 b, Vector3 c, Vector3 d, float t) { Vector3 aa = a + (b - a) * t; Vector3 bb = b + (c - b) * t; Vector3 cc = c + (d - c) * t; Vector3 aaa = aa + (bb - aa) * t; Vector3 bbb = bb + (cc - bb) * t; return aaa + (bbb - aaa) * t; } #endregion }