summaryrefslogtreecommitdiff
path: root/geometry/linesAndSegments.cpp
diff options
context:
space:
mode:
authorNoobie99 <noob999noob999@gmail.com>2023-02-10 11:18:18 +0100
committerNoobie99 <noob999noob999@gmail.com>2023-02-10 11:18:18 +0100
commitadbd4322feaea2b6bd152e6bc63372fecea38970 (patch)
tree51d90b92272f50cec75132d472b6078c35a3d88f /geometry/linesAndSegments.cpp
parent3c5ae1141482f3791c6a36408a70da951c5565c7 (diff)
add projectToLine and improve some geometry function
Diffstat (limited to 'geometry/linesAndSegments.cpp')
-rw-r--r--geometry/linesAndSegments.cpp23
1 files changed, 12 insertions, 11 deletions
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
+}