public PolygonLink(ConvexPolygon startPoly, IndexedEdge startEdge, ConvexPolygon endPoly, IndexedEdge endEdge) { StartPoly = startPoly; StartEdgeIndex = startEdge; EndPoly = endPoly; EndEdgeIndex = endEdge; }
/// <summary> /// Attmept to add a vertex to the polygon. /// If the vertex would form a concave polygon then it is not added. /// </summary> /// <param name="vertexPosition">The vertex to try to add.</param> public void TryToAddVertex(Point vertexPosition) { IndexedEdge edgeIndex = GetClosestEdge(vertexPosition); _vertices.Insert(edgeIndex.End, vertexPosition); if (IsConcave()) { _vertices.RemoveAt(edgeIndex.End); return; } GenerateEdges(); }
/// <summary> /// Given a 2d point in the world return the polygon's indexed edge that is closest to that point. /// </summary> /// <param name="vertexPosition">Position to compare.</param> /// <param name="minDistance">The distance the point is from the closest edge.</param> /// <returns>The closest edge</returns> public IndexedEdge GetClosestEdge(Point vertexPosition, out float minDistance) { minDistance = float.MaxValue; IndexedEdge current = new IndexedEdge(); foreach (IndexedEdge edge in _indexedEdges) { Point start = _vertices[edge.Start]; Point end = _vertices[edge.End]; float distance = (float)LineSegment.GetDistance(start, end, vertexPosition); if (distance < minDistance) { current = edge; minDistance = distance; } } return(current); }
public PolygonEdgePair(ConvexPolygon polygon, IndexedEdge edge) { Polygon = polygon; Edge = edge; }
/// <summary> /// Given a 2d point in the world return the polygon's indexed edge that is closest to that point. /// </summary> /// <param name="vertexPosition">Position to compare.</param> /// <param name="minDistance">The distance the point is from the closest edge.</param> /// <returns>The closest edge</returns> public IndexedEdge GetClosestEdge(Point vertexPosition, out float minDistance) { minDistance = float.MaxValue; IndexedEdge current = new IndexedEdge(); foreach (IndexedEdge edge in _indexedEdges) { Point start = _vertices[edge.Start]; Point end = _vertices[edge.End]; float distance = (float)LineSegment.GetDistance(start, end, vertexPosition); if (distance < minDistance) { current = edge; minDistance = distance; } } return current; }