private double SimplifyVertex(VWVertex vwLine) { // Scan vertices in line and remove the one with smallest effective area. // TODO: use an appropriate data structure to optimize finding the smallest area vertex VWVertex curr = vwLine; double minArea = curr.GetArea(); VWVertex minVertex = null; while (curr != null) { double area = curr.GetArea(); if (area < minArea) { minArea = area; minVertex = curr; } curr = curr.Next; } if (minVertex != null && minArea < _tolerance) { minVertex.Remove(); } if (!vwLine.IsLive) { return(-1); } return(minArea); }
public Coordinate[] GetCoordinates() { CoordinateList coords = new CoordinateList(); VWVertex curr = this; do { coords.Add(curr._pt, false); curr = curr.Next; }while (curr != null); return(coords.ToCoordinateArray()); }
public Coordinate[] Simplify() { VWVertex vwLine = VWVertex.BuildLine(_pts); double minArea = _tolerance; do { minArea = SimplifyVertex(vwLine); }while (minArea < _tolerance); Coordinate[] simp = vwLine.GetCoordinates(); // ensure computed value is a valid line if (simp.Length >= 2) { return(simp); } return(new[] { simp[0], new Coordinate(simp[0]) }); }
public static VWVertex BuildLine(Coordinate[] pts) { VWVertex first = null; VWVertex prev = null; foreach (Coordinate c in pts) { VWVertex v = new VWVertex(c); if (first == null) first = v; v.Prev = prev; if (prev != null) { prev.Next = v; prev.UpdateArea(); } prev = v; } return first; }
public static VWVertex BuildLine(Coordinate[] pts) { VWVertex first = null; VWVertex prev = null; foreach (Coordinate c in pts) { VWVertex v = new VWVertex(c); if (first == null) { first = v; } v.Prev = prev; if (prev != null) { prev.Next = v; prev.UpdateArea(); } prev = v; } return(first); }
private double SimplifyVertex(VWVertex vwLine) { // Scan vertices in line and remove the one with smallest effective area. // TODO: use an appropriate data structure to optimize finding the smallest area vertex VWVertex curr = vwLine; double minArea = curr.GetArea(); VWVertex minVertex = null; while (curr != null) { double area = curr.GetArea(); if (area < minArea) { minArea = area; minVertex = curr; } curr = curr.Next; } if (minVertex != null && minArea < _tolerance) minVertex.Remove(); if (!vwLine.IsLive) return -1; return minArea; }
public VWVertex Remove() { VWVertex tmpPrev = Prev; var tmpNext = Next; VWVertex result = null; if (Prev != null) { Prev.Next = tmpNext; Prev.UpdateArea(); result = Prev; } if (Next != null) { Next.Prev = tmpPrev; Next.UpdateArea(); if (result == null) { result = Next; } } _isLive = false; return(result); }