private bool ExistsIncludedVertex(VertexContract vertex)
        {
            var a = vertex.Position.ToVector2();
            var b = vertex.Previous.Position.ToVector2();
            var c = vertex.Next.Position.ToVector2();

            var pointer = vertex.Next.Next;

            while (pointer.Next.Index != vertex.Index)
            {
                var o = pointer.Position.ToVector2();
                if (VectorUtility.OntheSameSide(o, c, a, b) && VectorUtility.OntheSameSide(o, a, b, c) && VectorUtility.OntheSameSide(o, b, a, c)) { return true; }
                pointer = pointer.Next;
            }

            return false;
        }
        private List<int> GetTriangles(VertexContract[] vertexes, bool reverse)
        {
            var pointer = vertexes[0];
            var triangles = new List<int>();

            for (var i = 0; i < vertexes.Length - 3; i++)
            {
                var index = pointer.Index;

                while (GetIncludeAngle(pointer) >= 180.0f || ExistsIncludedVertex(pointer))
                {
                    pointer = pointer.Next;
                    if (pointer.Index == index) { break; }
                }

                if (reverse)
                {
                    triangles.Add(pointer.Next.Index);
                    triangles.Add(pointer.Index);
                    triangles.Add(pointer.Previous.Index);
                }
                else
                {
                    triangles.Add(pointer.Previous.Index);
                    triangles.Add(pointer.Index);
                    triangles.Add(pointer.Next.Index);
                }

                pointer.Next.Previous = pointer.Previous;
                pointer.Previous.Next = pointer.Next;
                pointer = pointer.Next;
            }

            if (reverse)
            {
                triangles.Add(pointer.Next.Index);
                triangles.Add(pointer.Index);
                triangles.Add(pointer.Previous.Index);
            }
            else
            {
                triangles.Add(pointer.Previous.Index);
                triangles.Add(pointer.Index);
                triangles.Add(pointer.Next.Index);
            }

            return triangles;
        }
 private float GetIncludeAngle(VertexContract vertex)
 {
     return VectorUtility.GetAngle((vertex.Previous.Position - vertex.Position).ToVector2(), (vertex.Next.Position - vertex.Position).ToVector2());
 }
 public static void Join(this List<SurfaceContract> surfaceContracts, VertexContract[] vertexes, Direction direction)
 {
     surfaceContracts.Add(new SurfaceContract { Vertexes = vertexes.Link(GetVectexesCount(surfaceContracts)), Direction = direction });
 }