Kollision von zwei Kreisen

Java4win

Aktives Mitglied
Hey Leute,

Habe ein einfaches Programm geschrieben indem zwei Kreise in einem Fenster an den "Wänden" (Fensterrand) abprallen und sich auch gegenseitig treffen können.

Jedoch ist die Kollision der beiden Kreise noch nicht ganz ausgereift. Es passiert schon etwas jedoch überlappen diese sich.

Ich habe die Kollision mit der Vektorrechnung gemacht. Der Radius eines Balls beträgt 25.

Hier der Code:

Java:
double ab1 = (Var.xOval1 + 50) - (Var.xOval2 + 50);
                double ab2 = (Var.yOval1 + 50) - (Var.yOval2 + 50);
               
                double ab3 = Math.sqrt(Math.pow(ab1, 2) + Math.pow(ab2, 2));
               
                if (ab3 <= 50){
                   
                    Var.xOval1dir *= -1;
                    Var.yOval1dir *= -1;
                   
                }

Wie gesagt prallen die schon voneinander ab jedoch zu spät, da der eine Kreis erst einmal unter dem anderen Kreis verschwunden sein muss. Was stimmt hier also nicht ?

Vielen Dank im Voraus🙂
 
Nicht alle static in der Klasse Var haben, wäre mal ein erster Schritt, dann noch anständige Namen suchen die etwas aussagen
 
Überlege dir doch mal wie wir als außenstehende wissen sollen was "ab1", "ab2" oder "ab3" bedeuten soll?
besser ?
Java:
double vektorX = (Var.xKreis1 + 50) - (Var.xKreis2 + 50);
                double vektorY = (Var.yKreis1 + 50) - (Var.yKreis2 + 50);
              
                double vektorLänge = Math.sqrt(Math.pow(vektorX, 2) + Math.pow(vektorY, 2));
              
                if (vektorLänge <= 50){  //50 ist die Summe der zwei Kreisradien
                  
                    Var.xKreis1Richtung*= -1;
                    Var.yKreis1Richtung *= -1;
                  
                }
 
Das würde ich dir auch empfehlen.
Mit dieser fragwürdigen Vars Klasse ( und den darin enthaltenen statischen Variablen ) machst du dir das Leben nur sehr viel schwerer.
 
Mit dieser fragwürdigen Vars Klasse ( und den darin enthaltenen statischen Variablen ) machst du dir das Leben nur sehr viel schwerer.
Ja, nur irgendwie fand ich es Übersichtlicher alle wichtigen Variablen in einer Klasse unterzubringen.
Aber es ist ja irgendwie auch unter programmieren schlecht angesehen wenn die Variablen in einer Klasse nicht private sind.

Kennst du eine gute Quelle zum lernen, wo man "richtige" Informationen bekommt?
 
Ich weiß nicht, ob dem Thread Ersteller bereits geholfen wurde, deshalb schreibe ich nochmal was dazu.
Um zu überprüfen, ob 2 Kreise kollidieren, verwendet man den Mittelpunkt & den Radius und berechnet die Entfernung.

Für den Kreis kannst du folgende Klasse verwenden:
Java:
class Circle {

    protected double x = 0;
    protected double y = 0;
    protected double radius = 0;

    //constructor
    public Circle (double x, double y, double radius) {
        this.x = x;
        this.y = y;
        this.radius = radius;
    }

    public double getX () {
        return this.x;
    }

    public double getY () {
        return this.y;
    }

    public double getRadius () {
        return this.radius;
    }

    //check, if this circle collides with another circle
    public boolean collides (Circle c) {
        double radiusSum = this.getRadius() + c.getRadius();

        //substract vectors to calculate distance
        double x1 = c.getX() - this.x;
        double y1 = c.getY() - this.y;

        //calculate length of vector
        double length = Math.sqrt((x1 * x1) + (y1 + y1));

        return length <= radiusSum;
    }

}

Beispiel Code:
Java:
//create 2 circles
Circle c1 = new Circle(0, 0, 10);
Circle c2 = new Circle (2, 2, 5);

//check, if circles collides
boolean collides = c1.collides(c2);
 
Für den Kreis kannst du folgende Klasse verwenden:
Vielen Dank.

Mein Hauptproblem war bisher immer das ich das ganze zeichnen wollte und die Kreise werden leider nicht von der angegebenen x und y Koordinate gezeichnet, sondern die Koordinaten geben einen Punkt an welcher sich etwa oben Links befindet und von dort aus wird gezeichnet.

Es wird ja zuerst ein Viereck gezeichnet und darein der Kreis.

Ich hoffe man konnte das irgendwie verstehen.
 
Dann musst du eben die Koordinaten umrechnen.

Java:
double middleX = x + (width / 2);
double middleY = y + (height / 2);

Je nachdem, wie dein Koordinatensystem aussieht, musst du das eben anpassen.
Ich ging gerade davon aus, dass sich der Koordinatenursprung (0, 0) unten links befindet.

Wieso wird erst ein Rechteck gezeichnet?
 

Zurück
Oben