Kollisionsberechnung von 2 Kreisen



  • hi oder auch Guten morgen 🙂

    also ich arbeite mit Borland Builder 3 (aus Gründen der Kompatibilität im Schulunterricht). ich habe ein Projekt mit der klasse Kreis, Rechteck und Kugel.
    ich erzeuge auf/in einer Form auf einer Image Komponente mit der klasse rechteck einen hintergrund mit belibiger farbe (frei wählbar über den farbdialog)
    und mit der klasse kugel (abgeleitet von Kreis) 2 Kreise. verschieben tu ich sie indem ich ein kreis mit der hintergrundfarbe drüber zeichne. ich arbeite nach dem Winke-Verfahren. das heisst ich gebe der klasse/objekt einen Winkel und den lass ich mit SIN/COS umrechnen

    X=SIN * SPEED
    Y=COS * SPEED

    soweit ganz einfach. nun habe ich auch schon die Kollisionsabfrage der wände / Ränder eingebaut mit "wenn Kugelx >Rahmen..." ja nun wollte ich eine kollisionsabfrage machen der 2 Kreise. aber ich schaff es nicht das sie Korreckt von ein ander abprallen 😞 . die erkennung wann sie sich berühren habe ich per Satz des Pythagoras gelöst (möchte nciht weiter drazuf eingehen bei nachfrage PN) .

    hier mein ansatz zur berechnung des abbpralls:

    ich berechne die Achse wo die kreise Virtuell abprallen mittels des Tangens von Alpha + 90° in meinem mit dem Satz des Pyth. erstellten Dreiecks. die "kugel hab ich in 4 Quadrenten mit jeh 2 unterQuadranten eingeteilt.

    von 0°-90° .... (bis 360)

    und die 0°-90° wieda in 2x 45°

    hier der Code

    // ---- FALL    0° - 90°  -------------------------------
            if ((posX < posX2 && posY > posY2))
            {
                achse = ((180 * atan2(katheteY, katheteX)) / Pi) * -1 + 90;
                if (achse + 90 < 45)
                {
                    Winkel = (Winkel + achse) * -1;
                //Winkel = 1;
                } else {
                    Winkel = (Winkel - achse) * -1 + 180;
                //Winkel = 2;
                }
    
            }
            // ---- FALL     90° - 180° -------------------------------
            if ((posX > posX2 && posY > posY2))
            {
                 achse = ((180 * atan2(katheteY, katheteX)) / Pi) * -1 + 90;
                 if (achse + 90 < 45 + 90)
                {
                    Winkel = (Winkel + achse) * -1;
                //Winkel = 3;
                } else {
                    Winkel = (Winkel - achse) + 180;
               // Winkel = 4;
                }
            }
            // ---- FALL     180° - 270° -------------------------------
            if ((posX > posX2 && posY < posY2))
            {
                achse = ((180 * atan2(katheteY, katheteX)) / Pi) * -1 + 90;
               if (achse + 270 < 45 + 180)
                {
                    Winkel = (Winkel + achse) * -1;
                //Winkel = 5;
                } else {
                    Winkel = (Winkel - achse) * -1 + 180;
                 //Winkel = 6;
                }
            }
             // ---- FALL     270° - 0° (360°)----------------------------
             if ((posX < posX2 && posY < posY2))
            {
                achse = ((180 * atan2(katheteY, katheteX)) / Pi) * -1 + 90;
               if (achse + 270 < 45 + 270)
                {
                    Winkel = (Winkel + achse) * -1;
                //Winkel = 7;
                } else {
                    Winkel = (Winkel - achse) + 180;
                 //Winkel = 8;
                }
            }
    

    posX2 wird übergeben ist die gegenüberliegende Kugel Xpos

    achse ist die achse zwischen den kugeln

    PS: ich habe überprüft ob die achse stimmt und alles richtig berechnet wird. und auf dem papier hab ich es nachgerechnet

    ich Freue mich auf antworten und hoffei ch hab euch nciht zu sehr verwirrt



  • Mir ist nicht so ganz klar was Du willst. Der Code sieht auch etwas umständlich aus. Wäre es nicht einfacher mit Richtungsvektoren zu rechnen?

    Aber egal. Wenn sich zwei Kugeln treffen, dann berühren sie sich wo?
    Auf der Hälfte der Verbindung der beiden Mittelpunkte. Das kannst Du also leicht ausrechnen. Und an dieser Geraden mußt Du jetzt auch die Geschwindigkeitsvektoren spiegeln.

    MfG Jester



  • zwei kreise berühren/überschneiden sich wenn der abstand ihrer mittelpunkte kleiner als die summe ihrer radien ist. einfacher gehts nicht



  • ja klar aber wie berechne ich dann den abprall winkel .. darum geht es mir weil das mit der kollision hab ich bereits gelöst (stand auch im TEXT)

    PS: plz durchlesen dann antworten 🙂 thx



  • Du hast ja einen Schnittpunkt .. oder eine Schnittfläche ..

    du ziehst einfach ne gerade durch die beiden Kreismittelpkte und den Schnittpunkt/Mittelpunkt(der Fläche) ... und hast die abprall richtung ... 😋

    das wär die theoretisch optimale ohne umgebungskonstanten und drall berücksichtigende abstoss berechnung 😉 Drall+Umgebungsvar könntest ja beim winkel +-3 grad dazurechnen .. ums nen bissl realistischer zu machen



  • hab ich mir auch gedacht 😃 aber klappt nicht so ganz wenn zb. eine kugel wegfligt und die ander hinter her und schneller ist dann haut das alled nichtmehr hin 😕





  • Jester schrieb:

    such mal bei google nach elastischer Stoß, 2. Treffer:

    http://www.gymnasium-walldorf.hd.bw.schule.de/Schule/Lehrerhomepages/FELL/mathe/elastischerstoss.htm

    meins war nur die stoßrichtung .. die kraftvektoren dreiecke bzw rechtecke .. waren sind in meiner lösung nicht berücksichtigt .. aber das war ja auch nicht gefragt ..


Anmelden zum Antworten