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

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ß!
#4
vote_ok
von JchrisP (60 Punkte) - 15.07.2021 um 15:40 Uhr
Quellcode ausblenden C#-Code
namespace Schnittpunkt
{
    class Point 
    {
        public double X;
        public double Y;
        public Point(double x, double y)
        {
            X = x;
            Y = y;
        }
    }
    class Trace
    {
        public Point A;
        public Point B;
        public string Name;
        public Trace(string name, Point a, Point b)
        {
            A = a;
            B = b;
            Name = name;
        }        
    }
    
    class Program
    {
        public static void IntersectControl(Trace a, Trace b) //Die eigentliche Funktion(Methode) "IntersectControl"
        {
            double m1 = (a.B.Y - a.A.Y) / (a.B.X - a.A.X);   //Steigungsrgad von Trace a 
            double m2 = (b.B.Y - b.A.Y) / (b.B.X - b.A.X);   //Steigungsrgad von Trace b    
            if (m1 == m2) Console.WriteLine($"Die beiden Strecken {a.Name} und {b.Name} haben den gleichen Steigungsgrad und daher haben sie keinen gemeinsamen Schnittpunkt"); 
            if (m1 != m2)
            {
                double b1 = a.A.Y - (a.A.X * m1);                      //b (Y_Schnittpunkt) der Geraden, auf Trace a liegt            
                double b2 = b.A.Y - (b.A.X * m2);                      //b (Y_Schnittpunkt) der Geraden, auf Trace b liegt             
                double IntersectX = (b2 - b1) / (m1 - m2);             //Koordinate X des Schnittpunktes berechnen
                double IntersectY = m1 * IntersectX + b1;              //Koordinate Y des Schnittpunktes berechnen

                if ((IntersectX > a.A.X) && (IntersectX < b.A.X) && (IntersectX > b.B.X) && (IntersectX < a.B.X) &&
                    (IntersectY < a.A.Y) && (IntersectY > b.B.Y) && (IntersectY < b.A.Y) && (IntersectY > a.B.Y))       //Prüfen ob der Schnittpunkt der Geraden innerhalb der beiden Strecken liegt   
                {
                    Console.WriteLine($"Die beiden Strecken {a.Name} und {b.Name} haben einen gemeinsamen Schnittpunkt");
                }
                else
                {
                    Console.WriteLine($"Die beiden Strecken {a.Name} und {b.Name} haben keinen gemeinsamen Schnittpunkt");
                }
            }
        }
        static void Main(string[] args)
        {
            //Point L12_P1 = new Point(4.5, 6.2);
            //Point L12_P2 = new Point(-2.7, -7.8);     //Die Werte von L34 als L12 zum testen

            //Point L12_P1 = new Point(-10.77, 12.24); //eine Strecke ohne gemeinsamen Schnittpunkt 
            //Point L12_P2 = new Point(-5.21, 6.53);     

           Point L12_P1 = new Point(-4.5, 5.8);
           Point L12_P2 = new Point(3.1, -2);
           Point L34_P1 = new Point(4.5, 6.2);
           Point L34_P2 = new Point(-2.7, -7.8);
            
           Trace L12 = new Trace("L12",L12_P1, L12_P2);
           Trace L34 = new Trace("L34",L34_P1, L34_P2);


           IntersectControl(L12, L34);   //Aufrufen der Funktion IntersectControl  
            
           Console.ReadKey();
        }
    }
}

Kommentare:

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

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

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.