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 }); }