summaryrefslogtreecommitdiff
path: root/content/geometry/delaunay.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'content/geometry/delaunay.cpp')
-rw-r--r--content/geometry/delaunay.cpp23
1 files changed, 11 insertions, 12 deletions
diff --git a/content/geometry/delaunay.cpp b/content/geometry/delaunay.cpp
index c813892..9ae9061 100644
--- a/content/geometry/delaunay.cpp
+++ b/content/geometry/delaunay.cpp
@@ -3,7 +3,8 @@ using pt = complex<lll>;
constexpr pt INF_PT = pt(2e18, 2e18);
-bool circ(pt p, pt a, pt b, pt c) {// p in circle(A,B,C), ABC must be ccw
+// p in circle(A,B,C), ABC must be ccw
+bool circ(pt p, pt a, pt b, pt c) {
return imag((c-b)*conj(p-c)*(a-p)*conj(b-a)) < 0;
}
@@ -12,10 +13,10 @@ struct QuadEdge {
QuadEdge* onext = nullptr;
pt orig = INF_PT;
bool used = false;
- QuadEdge* rev() const {return rot->rot;}
- QuadEdge* lnext() const {return rot->rev()->onext->rot;}
- QuadEdge* oprev() const {return rot->onext->rot;}
- pt dest() const {return rev()->orig;}
+ QuadEdge* rev() const { return rot->rot; }
+ QuadEdge* lnext() const { return rot->rev()->onext->rot; }
+ QuadEdge* oprev() const { return rot->onext->rot; }
+ pt dest() const { return rev()->orig; }
};
deque<QuadEdge> edgeData;
@@ -98,12 +99,10 @@ pair<QuadEdge*, QuadEdge*> rec(IT l, IT r) {
}
vector<pt> delaunay(vector<pt> pts) {
- if (sz(pts) <= 2) return {};
- sort(all(pts), [](const pt& a, const pt& b) {
- if (real(a) != real(b)) return real(a) < real(b);
- return imag(a) < imag(b);
- });
- QuadEdge* r = rec(all(pts)).first;
+ if (ssize(pts) <= 2) return {};
+ ranges::sort(pts, {},
+ [](pt x) { return pair{real(x), imag(x)}; });
+ QuadEdge* r = rec(begin(pts), end(pts)).first;
vector<QuadEdge*> edges = {r};
while (cross(r->onext->dest(), r->dest(), r->orig) < 0) r = r->onext;
auto add = [&](QuadEdge* e){
@@ -117,7 +116,7 @@ vector<pt> delaunay(vector<pt> pts) {
};
add(r);
pts.clear();
- for (int i = 0; i < sz(edges); i++) {
+ for (int i = 0; i < ssize(edges); i++) {
if (!edges[i]->used) add(edges[i]);
}
return pts;