# Kollision von zwei Kreisen



## Java4win (4. Aug 2017)

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: 


```
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


----------



## Thallius (4. Aug 2017)

Vor allem deine Variablennamen... Sorry aber da hab ich direkt die Lust verloren zu verstehen was du da machst.


----------



## Java4win (4. Aug 2017)

Thallius hat gesagt.:


> Vor allem deine Variablennamen... Sorry aber da hab ich direkt die Lust verloren zu verstehen was du da machst.


Evtl kannst du ja trotzdem hilfreich sein. Kennst du einen Artikel wo es um die Formalitäten beim Programmieren geht? Wie am besten Variablen, Klassen etc. benannt werden. Ich möchte mich ja auch dort verbessern.


----------



## thecain (4. Aug 2017)

Nicht alle static in der Klasse Var haben, wäre mal ein erster Schritt, dann noch anständige Namen suchen die etwas aussagen


----------



## Joose (4. Aug 2017)

Java4win hat gesagt.:


> Wie am besten Variablen, Klassen etc. benannt werden. Ich möchte mich ja auch dort verbessern.


Überlege dir doch mal wie wir als außenstehende wissen sollen was "ab1", "ab2" oder "ab3" bedeuten soll?


----------



## Java4win (4. Aug 2017)

Joose hat gesagt.:


> Überlege dir doch mal wie wir als außenstehende wissen sollen was "ab1", "ab2" oder "ab3" bedeuten soll?


besser ? 

```
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;
                  
                }
```


----------



## thecain (4. Aug 2017)

was ist Var? warum ist x,y, radius nicht auf einem Kreisobjekt?


----------



## Robat (4. Aug 2017)

thecain hat gesagt.:


> was ist Var? warum ist x,y, radius nicht auf einem Kreisobjekt?


Weil's leider einige Tutorials gibt die meinen Java den OOP Gedanken nehmen zu müssen, indem sie alle Variablen in eine Klasse klatschen.


----------



## Java4win (4. Aug 2017)

Robat hat gesagt.:


> Weil's leider einige Tutorials gibt die meinen Java den OOP Gedanken nehmen zu müssen, indem sie alle Variablen in eine Klasse klatschen.


Ja, das stimmt. 
Ich habe mir das Programmieren selber beigebracht und habe mein Wissen aus genau solchen Tutorials... 
Ich glaube ich sollte es nochmal "neu" erlernen.


----------



## Robat (5. Aug 2017)

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.


----------



## Java4win (5. Aug 2017)

Robat hat gesagt.:


> 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?


----------



## Robat (5. Aug 2017)

Java4win hat gesagt.:


> Kennst du eine gute Quelle zum lernen, wo man "richtige" Informationen bekommt?


Ich habe mich am Anfang immer viel mit dem Learning the Java Language von Oracle beschäftigt. Dort stehen die Basics mMn gut beschrieben.


----------



## Java4win (5. Aug 2017)

Robat hat gesagt.:


> Dort stehen die Basics mMn gut beschrieben.


Danke ich werde mich da einmal durcharbeiten  
Darf ich fragen, wo du jetzt stehst ? Bist du Informatik Lehrer ? Student ?


----------



## JuKu (5. Aug 2017)

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:

```
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:

```
//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);
```


----------



## Java4win (5. Aug 2017)

JuKu hat gesagt.:


> 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.


----------



## JuKu (5. Aug 2017)

Dann musst du eben die Koordinaten umrechnen.


```
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?


----------

