Kollision 2er Kreise

Sacki

Grünschnabel
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
PHP:
// ---- 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
 
Zurück