summaryrefslogtreecommitdiff
path: root/geometry
diff options
context:
space:
mode:
authorMZuenni <michi.zuendorf@gmail.com>2023-02-10 11:57:41 +0100
committerMZuenni <michi.zuendorf@gmail.com>2023-02-10 11:57:41 +0100
commit2715b7e026c8ed1f3198d6958ac01e9bb667e727 (patch)
tree2199026ecf71b0252a5a8a9eae01f95f567bb772 /geometry
parent8b70f09245442827bb906a9a56d19172e2a62752 (diff)
parentadbd4322feaea2b6bd152e6bc63372fecea38970 (diff)
merged
Diffstat (limited to 'geometry')
-rw-r--r--geometry/formulars.cpp2
-rw-r--r--geometry/linesAndSegments.cpp23
2 files changed, 13 insertions, 12 deletions
diff --git a/geometry/formulars.cpp b/geometry/formulars.cpp
index 37cc4f4..e34b3c6 100644
--- a/geometry/formulars.cpp
+++ b/geometry/formulars.cpp
@@ -9,7 +9,7 @@ constexpr double PIL = PIU-2e-19l;
double angle(pt a) {return arg(a);}
// rotiert Punkt im Uhrzeigersinn um den Ursprung.
-pt rotate(pt a, double theta) {return a * exp(pt(0.0, theta));}
+pt rotate(pt a, double theta) {return a * polar(1.0, theta);}
// Skalarprodukt.
double dot(pt a, pt b) {return real(conj(a) * b);}
diff --git a/geometry/linesAndSegments.cpp b/geometry/linesAndSegments.cpp
index 4da35b1..068fa39 100644
--- a/geometry/linesAndSegments.cpp
+++ b/geometry/linesAndSegments.cpp
@@ -37,6 +37,11 @@ double distToLine(pt a, pt b, pt p) {
return abs(cross(p - a, b - a)) / abs(b - a);
}
+// Projektiert p auf die Gerade a-b
+pt projectToLine(pt a, pt b, pt p) {
+ return a + (b - a) * dot(p - a, b - a) / norm(b - a);
+}
+
// Liegt p auf der Geraden a-b? 2d und 3d
bool pointOnLine(pt a, pt b, pt p) {
return cross(a, b, p) == 0;
@@ -58,27 +63,23 @@ pt lineIntersection(pt p0, pt p1, pt p2, pt p3) {
// Liegt p auf der Strecke a-b?
bool pointOnLineSegment(pt a, pt b, pt p) {
if (cross(a, b, p) != 0) return false;
- ld dist = norm(a - b);
+ double dist = norm(a - b);
return norm(a - p) <= dist && norm(b - p) <= dist;
}
// Entfernung von Punkt p zur Strecke a-b.
double distToSegment(pt a, pt b, pt p) {
if (a == b) return abs(p - a);
- pt dir = b - a;
- if (dot(dir, a) <= dot(dir, p) && dot(dir, p) <= dot(dir, b)) {
- return distToLine(a, b, p);
- } else {
- return min(abs(p - a), abs(p - b));
+ if (dot(p - a, b - a) <= 0) return abs(p - a);
+ if (dot(p - b, b - a) >= 0) return abs(p - b);
+ return distToLine(a, b, p);
}}
// Kürzeste Entfernung zwischen den Strecken a-b und c-d.
double distBetweenSegments(pt a, pt b, pt c, pt d) {
if (lineSegmentIntersection(a, b, c, d)) return 0.0;
- double result = distToSegment(a, b, c);
- result = min(result, distToSegment(a, b, d));
- result = min(result, distToSegment(c, d, a));
- return min(result, distToSegment(c, d, b));
+ return min({distToSegment(a, b, c), distToSegment(a, b, d),
+ distToSegment(c, d, a)), distToSegment(c, d, b)});
}
// sortiert alle Punkte pts auf einer Linie
@@ -87,4 +88,4 @@ void sortLine(pt dir, vector<pt>& pts) {
sort(all(pts), [&](pt a, pt b){
return dot(dir, a) < dot(dir, b);
});
-} \ No newline at end of file
+}