public Coordinate[] simplify() { VWLineSimplifier.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 new Coordinate[] { simp[0], new Coordinate(simp[0]) }; } return simp; }
private double simplifyVertex(VWLineSimplifier.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 VWLineSimplifier.VWVertex curr = vwLine; double minArea = curr.getArea(); VWLineSimplifier.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 VWLineSimplifier.VWVertex remove() { VWLineSimplifier.VWVertex tmpPrev = prev; VWLineSimplifier.VWVertex tmpNext = next; VWLineSimplifier.VWVertex result = null; if (prev != null) { prev.setNext(tmpNext); prev.updateArea(); result = prev; } if (next != null) { next.setPrev(tmpPrev); next.updateArea(); if (result == null) result = next; } isLive = false; return result; } public Coordinate[] getCoordinates()
public static VWLineSimplifier.VWVertex buildLine(Coordinate[] pts) { VWLineSimplifier.VWVertex first = null; VWLineSimplifier.VWVertex prev = null; for (int i = 0; i < pts.length; i++) { VWLineSimplifier.VWVertex v = new VWVertex(pts[i]); if (first == null) first = v; v.setPrev(prev); if (prev != null) { prev.setNext(v); prev.updateArea(); } prev = v; } return first; }