diff options
| author | MZuenni <michi.zuendorf@gmail.com> | 2023-02-10 11:57:41 +0100 |
|---|---|---|
| committer | MZuenni <michi.zuendorf@gmail.com> | 2023-02-10 11:57:41 +0100 |
| commit | 2715b7e026c8ed1f3198d6958ac01e9bb667e727 (patch) | |
| tree | 2199026ecf71b0252a5a8a9eae01f95f567bb772 /geometry | |
| parent | 8b70f09245442827bb906a9a56d19172e2a62752 (diff) | |
| parent | adbd4322feaea2b6bd152e6bc63372fecea38970 (diff) | |
merged
Diffstat (limited to 'geometry')
| -rw-r--r-- | geometry/formulars.cpp | 2 | ||||
| -rw-r--r-- | geometry/linesAndSegments.cpp | 23 |
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 +} |
