C++ :: Aufgabe #360
2 Lösungen
Schnittpunkt zweier Geraden endlicher Länge
Fortgeschrittener - C++
von hollst
- 20.04.2021 um 10:25 Uhr
In der unendlich ausgedehnten euklidischen 2D-Eben wähle man zufällig vier unterschiedliche Punkte P1, P2, P3 und P4. Gedanklich verbinde man P1 und P2 mit einer geraden Linie L12 sowie P3 und P4 mit einer geraden Linie L34.
Man schreibe eine Funktion, die als Rückgabewert ausgibt, ob sich L12 und L34 schneiden in Abhändigkeit von den Anfangs-/Endpunkten P1 ... P4.
Viel Spaß!
Man schreibe eine Funktion, die als Rückgabewert ausgibt, ob sich L12 und L34 schneiden in Abhändigkeit von den Anfangs-/Endpunkten P1 ... P4.
Viel Spaß!
Lösungen:
C++ 17
Lösung mittels Geradengleichung:
.h
.cpp
Lösung mittels Geradengleichung:
C-Code
#include <iostream> #include "IntersectLine.h" int main(){ Point P1 { -4.5, 5.8 }; Point P2 { 3.1, -2 }; Point P3 { 4.5, 6.2 }; Point P4 { -2.7, -7.8 }; Line L12 { P1, P2 }; Line L34 { P3, P4 }; IntersectLine isl { L12, L34 }; isl.print_result(); }
.h
C-Code
#pragma once #include <iostream> struct Point { double X, Y; }; struct Line { struct Point P1, P2; }; class IntersectLine { private: struct Line L1, L2; double get_xS(); double get_yS(); public: IntersectLine(Line l1, Line l2) : L1{ l1 }, L2{ l2 } {} void print_result(); bool is_intersect_line(); };
.cpp
C-Code
#include "IntersectLine.h" // Geradengleichung 1: L12 = (yP2 - yP1) / (xP2 - xP1) * (x - xP1) + yP1; // Geradengleichung 2: L34 = (yP4 - yP3) / (xP4 - xP3) * (x - xP3) + yP3; // beide Geradengleichungen gleich setzen => xS: double IntersectLine::get_xS() { return (-L1.P2.X * L2.P1.X * L1.P1.Y + L1.P2.X * L2.P2.X * L1.P1.Y + L1.P1.X * L2.P1.X * L1.P2.Y - L1.P1.X * L2.P2.X * L1.P2.Y + L1.P1.X * L2.P2.X * L2.P1.Y - L1.P2.X * L2.P2.X * L2.P1.Y - L1.P1.X * L2.P1.X * L2.P2.Y + L1.P2.X * L2.P1.X * L2.P2.Y) / (-L2.P1.X * L1.P1.Y + L2.P2.X * L1.P1.Y + L2.P1.X * L1.P2.Y - L2.P2.X * L1.P2.Y + L1.P1.X * L2.P1.Y - L1.P2.X * L2.P1.Y - L1.P1.X * L2.P2.Y + L1.P2.X * L2.P2.Y); } // xS in die 2. Gleichung einsetzen => yS double IntersectLine::get_yS() { return (L2.P2.Y - L2.P1.Y) / (L2.P2.X - L2.P1.X) * (get_xS() - L2.P1.X) + L2.P1.Y; } void IntersectLine::print_result() { if (is_intersect_line()) std::cout << "Schnittpunkt: (" << get_xS() << ", " << get_yS() << ")" << std::endl; else std::cout << "Kein Schnittpunkt" << std::endl; } bool IntersectLine::is_intersect_line() { return !(std::isnan(get_xS()) || std::isnan(get_yS())); }
C-Code
#include <iostream> class P { public: double x; int y; }; class line { public: double x; double y; }; bool check(line l1, line l2) { double k = l1.x / l2.x; if(l1.y * k == l2.y) { return false; } return true; } int main() { P P1; P P2; P P3; P P4; line l12; l12.x = P2.x - P1.x; l12.y = P2.y - P1.y; line l34; l34.x = P4.x - P3.x; l34.y = P4.y - P3.y; std::cout << check(l12, l34); return 0; }