gcc_pure static FlatGeoPoint NearestPoint(const FlatGeoPoint &p1, const FlatGeoPoint &p2, const FlatGeoPoint &p3) { const FlatGeoPoint p12 = p2-p1; const fixed rsq(p12.DotProduct(p12)); if (!positive(rsq)) { return p1; } const FlatGeoPoint p13 = p3-p1; const fixed numerator(p13.DotProduct(p12)); if (!positive(numerator)) { return p1; } else if (numerator>= rsq) { return p2; } else { fixed t = numerator/rsq; return p1+(p2-p1)*t; } }
gcc_pure static FlatGeoPoint NearestPoint(const FlatGeoPoint &p1, const FlatGeoPoint &p2, const FlatGeoPoint &p3) { const FlatGeoPoint p12 = p2-p1; const double rsq(p12.DotProduct(p12)); if (rsq <= 0) return p1; const FlatGeoPoint p13 = p3-p1; const double numerator(p13.DotProduct(p12)); if (numerator <= 0) { return p1; } else if (numerator>= rsq) { return p2; } else { double t = numerator/rsq; return p1+(p2-p1)*t; } }
unsigned FlatGeoPoint::DistanceSquared(const FlatGeoPoint &sp) const { const FlatGeoPoint delta = *this - sp; return delta.DotProduct(delta); }