summaryrefslogtreecommitdiff
path: root/geometry/closestPair.cpp
diff options
context:
space:
mode:
authormzuenni <michi.zuendorf@gmail.com>2022-06-27 17:19:28 +0200
committermzuenni <michi.zuendorf@gmail.com>2022-06-27 17:19:28 +0200
commit5ab8a5088b729a9953b8dff1b2a985dc8fb2098b (patch)
treeed40d6936c0e9eee40ba62751cbf99ecddbaddc2 /geometry/closestPair.cpp
parentadabbad9c51cf7cd3874bfde8eac1fbcf84fec10 (diff)
updated tcr
Diffstat (limited to 'geometry/closestPair.cpp')
-rw-r--r--geometry/closestPair.cpp39
1 files changed, 22 insertions, 17 deletions
diff --git a/geometry/closestPair.cpp b/geometry/closestPair.cpp
index cac544b..a7662b6 100644
--- a/geometry/closestPair.cpp
+++ b/geometry/closestPair.cpp
@@ -1,35 +1,40 @@
double squaredDist(pt a, pt b) {
- return (a.fst-b.fst) * (a.fst-b.fst) + (a.snd-b.snd) * (a.snd-b.snd);
+ return real(conj(a-b) * (a-b));
}
bool compY(pt a, pt b) {
- if (a.snd == b.snd) return a.fst < b.fst;
- return a.snd < b.snd;
+ return (imag(a) == imag(b)) ? real(a) < real(b)
+ : imag(a) < imag(b);
}
-// points.size() > 1 und alle Punkte müssen verschieden sein!
-double shortestDist(vector<pt> &points) {
+bool compX(pt a, pt b) {
+ return (real(a) == real(b)) ? imag(a) < imag(b)
+ : real(a) < real(b);
+}
+
+double shortestDist(vector<pt>& points) { // points.size() > 1
set<pt, bool(*)(pt, pt)> status(compY);
- sort(points.begin(), points.end());
- double opt = 1e30, sqrtOpt = 1e15;
+ sort(points.begin(), points.end(), compX);
+ double opt = 1.0/0.0, sqrtOpt = 1.0/0.0;
auto left = points.begin(), right = points.begin();
status.insert(*right); right++;
-
+
while (right != points.end()) {
- if (fabs(left->fst - right->fst) >= sqrtOpt) {
- status.erase(*(left++));
+ if (left != right &&
+ abs(real(*left - *right)) >= sqrtOpt) {
+ status.erase(*left);
+ left++;
} else {
- auto lower = status.lower_bound(pt(-1e20, right->snd - sqrtOpt));
- auto upper = status.upper_bound(pt(-1e20, right->snd + sqrtOpt));
- while (lower != upper) {
+ auto lower = status.lower_bound({-1.0/0.0, imag(*right) - sqrtOpt});
+ auto upper = status.upper_bound({-1.0/0.0, imag(*right) + sqrtOpt});
+ for (;lower != upper; lower++) {
double cand = squaredDist(*right, *lower);
if (cand < opt) {
opt = cand;
sqrtOpt = sqrt(opt);
- }
- ++lower;
- }
- status.insert(*(right++));
+ }}
+ status.insert(*right);
+ right++;
}}
return sqrtOpt;
}