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

4 Lösungen Lösungen öffentlich
#390

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
3 Kommentare
1x
vote_ok
von JKooP (18090 Punkte) - 21.04.2021 um 19:36 Uhr
NET 5.x; C# 9.x; VS-2019
Hier eine Lösung mittels Geradengleichung:
Quellcode ausblenden C#-Code
using System;

// Geraden schneiden sich:
Point P1 = new(-4.5, 5.8);
Point P2 = new(3.1, -2);
Point P3 = new(4.5, 6.2);
Point P4 = new(-2.7, -7.8);

// Parallele Geraden => kein Schnittpunkt:
// Point P1 = new(-5, 5);
// Point P2 = new(-5, -5);
// Point P3 = new(5, 5);
// Point P4 = new(5, -5);

Line L12 = new(P1, P2);
Line L34 = new(P3, P4);

IntersectLine isl = new(L12, L34);

Console.WriteLine(isl);


record Point(double X, double Y);

record Line(Point P1, Point P2);

record IntersectLine (Line L1, Line L2)
{
    // Geradengleichung 1: L12 = (yP2 - yP1) / (xP2 - xP1) * (x - xP1) + yP1;
    // Geradengleichung 2: L34 = (yP4 - yP3) / (xP4 - xP3) * (x - xP3) + yP3;

    // beide Geradengleichungen gleich setzen:
    private double S1 => Math.Round((-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), 3);

    // S1 in die 2. Gleichung einsetzen
    private double S2 => Math.Round((L2.P2.Y - L2.P1.Y) / (L2.P2.X - L2.P1.X) * (S1 - L2.P1.X) + L2.P1.Y, 3);

    public override string ToString() => double.IsNaN(S1) || double.IsNaN(S2) ? "Kein Schnittpunkt" : $"Schnittpunkt: ({S1}, {S2})";
}

Kommentare:

hollst

Punkte: 13980

761 Aufgaben
132 Lösungen
117 Kommentare

#1
26.04.2021 um 18:29 Uhr
Bitte noch einmal prüfen, z. B.:

Quellcode ausblenden C#-Code
Point P1 = new(0, 0); 
Point P2 = new(1, 1); 
Point P3 = new(1, 0); 
Point P4 = new(2, 2); 


Ergebnis: Schnittpunkt: (2, 2) [im Prinzip richtig, aber ...

erste Linie geht nur bis (1, 1) und nicht bis (2, 2).]
post_arrow
694 0

JKooP

Punkte: 18090

680 Aufgaben
227 Lösungen
19 Kommentare

#2
26.04.2021 um 19:53 Uhr
Hallo,
ja das stimmt natürlich. Danke für den Hinweis. Ich hätte die Aufgabenstellung besser lesen sollen.

Zitat:

Abhändigkeit von den Anfangs-/Endpunkten P1 ... P4

Ich bin von unendlichen Geraden ausgegangen.
Ich gelobe Besserung ;)
post_arrow
695 0

hollst

Punkte: 13980

761 Aufgaben
132 Lösungen
117 Kommentare

#3
26.04.2021 um 20:07 Uhr
Ja, ist doch klar. Trotzdem vielen Dank für die Lösung, habe gelernt,
dass man in einem Record auch Methoden einbetten kann. Seit wann geht denn
das? Sehr interessant.
post_arrow
696 0
Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben
2095452

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.