public class DouglasPoikerSimplification { private static double tolerant; // - () private static Point[] polyline; // private static ArrayList<Integer> markedPoints; // ( ) public static Point[] getSimplificatedPolyline(Point[] plots, double tolerant){//tolerant = 0.00005 DouglasPoikerSimplification.tolerant = tolerant; DouglasPoikerSimplification.polyline = plots; DouglasPoikerSimplification.markedPoints = new ArrayList<Integer>(); markedPoints.add(0); simplify(0, plots.length-1); // markedPoints.add(polyline.length-1); return writePointArray(); } private static Point[] writePointArray(){ Integer[] idx = new Integer[markedPoints.size()]; idx = markedPoints.toArray(idx); Arrays.sort(idx); Point[] result = new Point[idx.length]; for (int i = 0; i < result.length; i++) { result[i] = polyline[idx[i]]; } return result; } private static void simplify(int j, int k){ if(k == j+1){ // , return; // }else{ double maxd = -1; // int maxi = j; // . . for (int i = j+1; i < k; i++) { // // double dv = Point.getDistance(polyline[j], polyline[k], polyline[i]); if(dv > maxd){// , maxi = i; // maxd = dv; // . } } if(maxd > tolerant ){// , markedPoints.add(maxi); // // System.out.println(polyline[maxi].getLat() + "\t\t " + polyline[maxi].getLng()); simplify(j, maxi);// simplify(maxi, k); } } } }
public class DouglasPoikerSimplification { private static double tolerant; // - () private static Point[] polyline; // private static ArrayList<Integer> markedPoints; // ( ) public static Point[] getSimplificatedPolyline(Point[] plots, double tolerant){//tolerant = 0.00005 DouglasPoikerSimplification.tolerant = tolerant; DouglasPoikerSimplification.polyline = plots; DouglasPoikerSimplification.markedPoints = new ArrayList<Integer>(); markedPoints.add(0); simplify(0, plots.length-1); // markedPoints.add(polyline.length-1); return writePointArray(); } private static Point[] writePointArray(){ Integer[] idx = new Integer[markedPoints.size()]; idx = markedPoints.toArray(idx); Arrays.sort(idx); Point[] result = new Point[idx.length]; for (int i = 0; i < result.length; i++) { result[i] = polyline[idx[i]]; } return result; } private static void simplify(int j, int k){ if(k == j+1){ // , return; // }else{ double maxd = -1; // int maxi = j; // . . for (int i = j+1; i < k; i++) { // // double dv = Point.getDistance(polyline[j], polyline[k], polyline[i]); if(dv > maxd){// , maxi = i; // maxd = dv; // . } } if(maxd > tolerant ){// , markedPoints.add(maxi); // // System.out.println(polyline[maxi].getLat() + "\t\t " + polyline[maxi].getLng()); simplify(j, maxi);// simplify(maxi, k); } } } }
Source: https://habr.com/ru/post/81854/
All Articles