Funktion zur Kollisionsüberprüfung geht nicht



  • Hallo ich habe eine Funktion geschrieben die überprüfen soll ob sich zwei Kreise berühren.

    bool CircleCollision (int x1,int y1,int r1,int x2,int y2,int r2)
     {
        int q1,q2,sum,sqare;
    
        q1=(x1-x2)*(x1-x2);
        q2=(y1-y2)*(y1-y2);
        sum=q1+q2;
        sqare=sqrt(sum);
        if (sqare<(r1+r2))
            return true;
        else
            return false;
     }
    

    Die Funktion versagt total...warum?



  • sqrt() liefert kein int.



  • Ok... ich hab jetzt mal probiert einfach alle Variablen innerhalb der Funktion als float zu deklarieren.

    bool CircleCollision (int x1,int y1,int r1,int x2,int y2,int r2)
     {
        float q1,q2,sqare,sum;;
    
        q1=(x1-x2)*(x1-x2);
        q2=(y1-y2)*(y1-y2);
        sum=q1+q2;
        sqare=sqrt(sum);
        if (sqare<(r1+r2))
            return true;
        else
            return false;
     }
    

    bringt aber garnichts. 😞
    Vieleicht hab ich was den Phytagoras angeht einen Denkfehler.



  • Was ist denn x und y? Der Mittelpunkt? Dann sehe ich erstmal keine Probleme, bis auf den Genauigkeitsverlust zwischen Ganzzahl unf Fliesskommazahl.

    Trotzdem noch 2 Anmerkungen:

    1. Nutze boolsche Logik

    return sqare < r1 + r2;
    

    2. sqrt ist hier ein bisschen Overkill. Du brauchst ja nicht die wirkliche Länge, das Quadrat davon reicht auch

    return sum < (r1 + r2) * (r1 + r2);
    


  • Ja.. x und y ist der jeweilige Mittelpunkt.

    Das mit der Boolschen Logik ist ein guter Tip!

    Allerdings weiß ich nicht genau was ich mit dem Quadrat der Radien anfangen soll.
    Kanst du daß etwas näher erläutern?



  • Beim Programmstart ist ein Kreis in der linken oberen Ecke, der andere in der Mitte des Fensters am unteren Rand.
    Beim Debugen hab ich grad festgestellt das die Funktion beim ersten aufruf false zurückgibt.
    Bei allen weiteren aufrufen True, und zwar unabhängig davon ob sich die Kreise berühren oder nicht.

    Das verseh ich jetzt garnimmer!!! 😮 😕



  • BackBONE schrieb:

    Allerdings weiß ich nicht genau was ich mit dem Quadrat der Radien anfangen soll.
    Kanst du daß etwas näher erläutern?

    Nun, wie du sicher weisst, besagt der Satz des Pythagoras, dass in einem rechtwinkligen Dreieck die Seitenlängen wie folgt definiert werden können
    a2+b2=c2a^2+b^2=c^2
    a und b sind hierbei die Seiten, die den rechten Winkel einschliessen.

    a2a^2 und b2b^2 haben wir ja bereits (q1 und q2). Was wir nun noch brauchen ist c2c^2. c haben wir auch (r1+r2), demzufolge ist das Quadrat davon (r1+r2)*(r1+r2). Unsere Formel lautet also wie folgt, wenn sich unsere Kreise in exakt einem Punkt berühren würden

    q1 + q1 = (r1+r2)*(r1+r2)
    

    Daraus kann man auch problemlos ableiten, wann die Kreise kollidieren würden und wann nicht. Damit ersparst du dir den sqrt Aufruf, der nicht ganz trivial ist.

    BackBONE schrieb:

    Bei allen weiteren aufrufen True, und zwar unabhängig davon ob sich die Kreise berühren oder nicht.

    Ich vermute, dass du weniger Probleme mit der Funktion hast, sondern vielmehr mit den Werten, die du übergibst. Oder mit der Auswertung des Rückgabewertes.



  • Yup... war ein Vorstellungsproblem meinerseits. Leuchtet mir aber voll ein.
    Ich glaub ich hab auch mein eigentliches Problem gefunden.

    Die beiden Radien werden nämlich auch berechnet (wär blos nie auf die Idee gekommen das an dieser Stelle der Wurm drinn ist).Wenn hier natürlich ein vielfach zu hoher Wert rauskommt überschneiden sich die Kreise natürlich auch fast immer.

    Vieleicht sollt ich beim nächsten mal bischen länger debugen und mir alle Stellen des Codes genau anschaun bevor ich nach Hilfe schrei 😃 ,

    Trozdem danke für den Denkanstoß!



  • BackBONE schrieb:

    Vieleicht sollt ich beim nächsten mal bischen länger debugen und mir alle Stellen des Codes genau anschaun bevor ich nach Hilfe schrei

    Definitiv.

    Bye, TGGC


Anmelden zum Antworten