public static List<oint> douglasPeucker(List<oint> points, double epsilon) {
if (points.size() < 3) {
return points;
}
int index = -1;
double dmax = 0;
int end = points.size();
for (int i = 1; i < end - 1; i++) {
double d = perpendicularDistance(points.get(i), points.get(0), points.get(end - 1));
if (d > dmax) {
index = i;
dmax = d;
}
}
List<oint> result = new ArrayList<>();
if (dmax > epsilon) {
List<oint> recursiveResult1 = douglasPeucker(points.subList(0, index + 1), epsilon);
List<oint> recursiveResult2 = douglasPeucker(points.subList(index, points.size()), epsilon);