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

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ß!
#2
3 Kommentare
vote_ok
von hollst (13980 Punkte) - 22.04.2021 um 21:16 Uhr
Quellcode ausblenden C#-Code
using System;
using static System.Console;
using System.Text;

Double[][] XY_Test = new Double[][]  {
    new double[] {  0,   0 }, // P1 (x1, y1)
    new double[] {  1,   1 }, // P2 (x2, y2)
    new double[] {  1,   1 }, // P3 (x3, y3)
    new double[] {-10,   0 }  // P4 (x4, y4)
};

WriteLine(Environment.NewLine + Intersection(XY_Test));
ReadKey();

static string ToMyString(Double[][] xy)  {
    StringBuilder sb = new();
    for (var i = 0; i < xy.Length; i++)  {
        for (var j = 0; j < xy[i].Length; j++)
            sb.Append($"{xy[i][j].ToString("F2"),6}");
        sb.AppendLine();
    }
    return sb.ToString();
}

static bool Intersection(Double[][] xy)  {

    WriteLine(ToMyString(xy));

    Double dx0 = xy[1][0] - xy[0][0]; WriteLine($"dx0  delta x L12  {dx0}"); //delta x L12
    Double dy0 = xy[1][1] - xy[0][1]; WriteLine($"dy0  delta y L12  {dy0}"); //delta y L12

    Double dx1 = xy[3][0] - xy[2][0]; WriteLine($"dx1  delta x L34  {dx1}"); //delta x L34   
    Double dy1 = xy[3][1] - xy[2][1]; WriteLine($"dy1  delta y L34  {dy1}"); //delta y L34

    Double DX = xy[2][0] - xy[0][0]; 
    Double DY = xy[2][1] - xy[0][1]; 

    Double det = dy0 * dx1 - dy1 * dx0;  

    if (det == 0)
        return false;

    Double det1 = DY * dx1 - dy1 * DX;
    Double det2 = dy0 * DY - DX * dx0;

    WriteLine($"det {det}    det1 {det1}    det2 {det2}");

    Double t1 = det1 / det;
    Double t2 = det2 / det;

    WriteLine($"t1 {t1.ToString("F2"),6} t2 {t2.ToString("F2"),6}");

    return (t1 <= 1) && (t2 <= 1) && (t1 >= 0) && (t2 >= 0);
}

Kommentare:

hollst

Punkte: 13980

761 Aufgaben
132 Lösungen
117 Kommentare

#1
23.04.2021 um 21:55 Uhr
Zeilen 38 und 40 könnten vertauscht werden.
post_arrow
691 0

hollst

Punkte: 13980

761 Aufgaben
132 Lösungen
117 Kommentare

#2
23.04.2021 um 21:55 Uhr
meine 35 ... und 40.
post_arrow
692 0

hollst

Punkte: 13980

761 Aufgaben
132 Lösungen
117 Kommentare

#3
08.05.2021 um 17:32 Uhr
Sorry, kleiner Rechenfehler, Zeile 44 ist zu ändern in

Quellcode ausblenden C#-Code
Double det2 = DY * dx0 - dy0 * DX;
post_arrow
699 0
Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben
2095454

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.