C :: Aufgabe #350 :: Lösung #1

1 Lösung Lösung öffentlich
#350

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ß!
#1
vote_ok
von JKooP (18090 Punkte) - 23.04.2021 um 08:10 Uhr
Quellcode ausblenden 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");
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben
1960618

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.