using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
///
/// 算法:中心角度排序法
/// 依据:???
///
public class AlgorithmEdge : ModuleAlgorithm {
/// 算法:中心角度排序法
public AlgorithmEdge() { }
public class EdgeAngle {
public float angle;
public Vector3 position;
}
public override void Compute(DataPlate data) {
List 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 angleList = new List();
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();
for (int i = 0; i < angleList.Count; i++) {
data.edgePoints.Add(angleList[i].position);
}
}
///
/// 计算两点夹角
///
/// 0度点位置
/// 目标点
///
private float Angle(Vector3 direction, Vector3 position) {
float angle = Vector2.SignedAngle(direction, position);
return angle;
}
}