float coordinate_calculation::perpendicular_distance(const FixedPointCoordinate &source_coordinate, const FixedPointCoordinate &target_coordinate, const FixedPointCoordinate &query_location) { float ratio; FixedPointCoordinate nearest_location; return perpendicular_distance(source_coordinate, target_coordinate, query_location, nearest_location, ratio); }
static Vector<Vector2> rdp(const Vector<Vector2> &v, float optimization) { if (v.size() < 3) return v; int index = -1; float dist = 0; //not looping first and last point for (size_t i = 1, size = v.size(); i < size - 1; ++i) { float cdist = perpendicular_distance(v[i], v[0], v[v.size() - 1]); if (cdist > dist) { dist = cdist; index = static_cast<int>(i); } } if (dist > optimization) { Vector<Vector2> left, right; left.resize(index); for (int i = 0; i < index; i++) { left.write[i] = v[i]; } right.resize(v.size() - index); for (int i = 0; i < right.size(); i++) { right.write[i] = v[index + i]; } Vector<Vector2> r1 = rdp(left, optimization); Vector<Vector2> r2 = rdp(right, optimization); int middle = r1.size(); r1.resize(r1.size() + r2.size()); for (int i = 0; i < r2.size(); i++) { r1.write[middle + i] = r2[i]; } return r1; } else { Vector<Vector2> ret; ret.push_back(v[0]); ret.push_back(v[v.size() - 1]); return ret; } }