public static List <Edge> SortedClockwise(this List <Edge> edges) { var center = (edges.First().Center() + edges.Last().Center()) / 2; var baseline = edges.First().Center(); var comparer = new CompareVectorsClockwise(center, baseline); var sortedEdges = edges.OrderBy(edge => edge.Center(), comparer); return(sortedEdges.ToList()); }
public static float Area(this Face face) { var center = Center(face); var baseline = face.Vertices.First().Position; var clockwiseComparer = new CompareVectorsClockwise(center, baseline); var sortedVertices = face.Vertices.OrderBy(vertex => vertex.Position, clockwiseComparer).Reverse().ToList(); var sumOfCrossProducts = new Vector3(); for (int i = 0; i < sortedVertices.Count; i++) { var currentPosition = sortedVertices[i].Position; var nextPosition = sortedVertices[(i + 1) % sortedVertices.Count].Position; sumOfCrossProducts += Vector3.Cross(nextPosition, currentPosition); } var normalToFace = center.normalized; var area = Vector3.Dot(sumOfCrossProducts, normalToFace) / 2; return(area); }