Files
MuHua-Core/Assets/ModuleFunction/Algorithm/AlgorithmEdge.cs
T
2024-11-08 18:15:06 +08:00

55 lines
1.8 KiB
C#

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
/// <summary>
/// 算法:中心角度排序法
/// 依据:???
/// </summary>
public class AlgorithmEdge : ModuleAlgorithm<DataPlate> {
/// <summary> 算法:中心角度排序法 </summary>
public AlgorithmEdge() { }
public class EdgeAngle {
public float angle;
public Vector3 position;
}
public override void Compute(DataPlate data) {
List<Vector2> edgePoints = data.edgePoints;
//计算多边形中心点
float x = edgePoints.Average((v3) => v3.x);
float y = edgePoints.Average((v3) => v3.y);
Vector2 center = new Vector2(x, y);
//计算所有点的夹角
Vector3 direction = edgePoints[0] - center;
List<EdgeAngle> angleList = new List<EdgeAngle>();
for (int i = 0; i < edgePoints.Count; i++) {
Vector3 normal = edgePoints[i] - center;
EdgeAngle edgeAngle = new EdgeAngle();
edgeAngle.angle = Angle(direction, normal);
edgeAngle.position = normal;
angleList.Add(edgeAngle);
}
data.centerOffset = center;
//排序
angleList.Sort((x, y) => x.angle.CompareTo(y.angle));
//把排序好的边缘点重新添加
data.edgePoints = new List<Vector2>();
for (int i = 0; i < angleList.Count; i++) {
data.edgePoints.Add(angleList[i].position);
}
}
/// <summary>
/// 计算两点夹角
/// </summary>
/// <param name="direction">0度点位置</param>
/// <param name="position">目标点</param>
/// <returns></returns>
private float Angle(Vector3 direction, Vector3 position) {
float angle = Vector2.SignedAngle(direction, position);
return angle;
}
}