C :: Aufgabe #350
1 Lösung
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-Code
#include <stdio.h> #include <math.h> typedef struct __Point__ { float X, Y; } Point; typedef struct __Line__ { Point P1, P2; } Line; 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 L1 = { P1, P2 }; // L12 Line L2 = { P3, P4 }; // L34 // Geradengleichung 1: L12 = (yP2 - yP1) / (xP2 - xP1) * (x - xP1) + yP1; // Geradengleichung 2: L34 = (yP4 - yP3) / (xP4 - xP3) * (x - xP3) + yP3; // beide Geradengleichungen gleich setzen: float x = (-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); // x in die 2. Gleichung einsetzen float y = (L2.P2.Y - L2.P1.Y) / (L2.P2.X - L2.P1.X) * (x - L2.P1.X) + L2.P1.Y; if (!(isnan(x) || isnan(y))) printf("Schnittpunkt: (%f, %f)\n", x, y); else printf("Kein Schnittpunkt\n"); }