コード例 #1
0
        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());
        }
コード例 #2
0
        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);
        }