static FlatGeoPoint nearest_point_convex(const SearchPointVector& spv, const FlatGeoPoint &p3) { unsigned distance_min = 0-1; SearchPointVector::const_iterator i_best = spv.end(); // find nearest point in vector for (SearchPointVector::const_iterator i = spv.begin(); i!= spv.end(); ++i) { unsigned d_this = p3.distance_sq_to(i->get_flatLocation()); if (d_this<distance_min) { distance_min = d_this; i_best = i; } } FlatGeoPoint pc = i_best->get_flatLocation(); // find nearest point on this segment FlatGeoPoint pa = segment_nearest_point(spv,i_best,p3); if (!(pa == pc)) { unsigned d_seg = pa.distance_sq_to(p3); if (d_seg < distance_min) { distance_min = d_seg; pc = pa; } } // find nearest point on previous segment SearchPointVector::const_iterator i_prev; if (i_best == spv.begin()) { i_prev = spv.end()-1; } else { i_prev = i_best-1; } FlatGeoPoint pb = segment_nearest_point(spv,i_prev,p3); if (!(pb == pc)) { unsigned d_seg = pb.distance_sq_to(p3); if (d_seg < distance_min) { distance_min = d_seg; pc = pb; } } return pc; }
SearchPointVector::const_iterator SearchPointVector::NearestIndexConvex(const FlatGeoPoint &p3) const { unsigned distance_min = 0 - 1; const_iterator i_best = end(); // find nearest point in vector for (const_iterator i = begin(); i != end(); ++i) { unsigned d_this = p3.distance_sq_to(i->get_flatLocation()); if (d_this < distance_min) { distance_min = d_this; i_best = i; } } return i_best; }
static FlatGeoPoint nearest_point_nonconvex(const SearchPointVector& spv, const FlatGeoPoint &p3) { unsigned distance_min = 0-1; SearchPointVector::const_iterator i_best = spv.end(); for (SearchPointVector::const_iterator i = spv.begin(); i!= spv.end(); ++i) { FlatGeoPoint pa = segment_nearest_point(spv,i,p3); unsigned d_this = p3.distance_sq_to(pa); if (d_this<distance_min) { distance_min = d_this; i_best = i; } } return i_best->get_flatLocation(); }
static FlatGeoPoint NearestPointNonConvex(const SearchPointVector& spv, const FlatGeoPoint &p3) { unsigned distance_min = 0-1; FlatGeoPoint point_best; for (SearchPointVector::const_iterator i = spv.begin(); i!= spv.end(); ++i) { FlatGeoPoint pa = SegmentNearestPoint(spv,i,p3); unsigned d_this = p3.distance_sq_to(pa); if (d_this<distance_min) { distance_min = d_this; point_best = pa; } } return point_best; }