# Kollision zwischen 2 Kreisen



## checkerphil05 (29. Dez 2011)

Hi,

Ich möchte verweg sagen, ich bin ein blutiger Anfänger.

Ich probier mich an einem Spiel, welches eine Mischung aus Pong und AirHockey sein soll.
Meine beiden Spieler sind auf ihrer Spielseite jeweils freibeweglich und der Ball wird mit einer richtung von der Mitte aus initialisiert.

Ich verwende die Slickengine dabei. Die Spieler sowie der Spielball sind als Circle definiert, sodass ich mit die Kollisionsabfrage mittels intersect machen kann.

Ich würde es gerne über vektoren machen, bekomm es allerdings nicht hin.
Gedacht habe ich mir, dass aus dem Mittelpunkt und der Geschwindigkeitsattribute mir den Richtungsvektor des Balles geben lassen kann und ihm dann an einem zweiten Vektor spiegel. Dieser entsteht durch den Mittelpunkt des Balles und den Mittelpunkt des Spielers mit dem gerade die Kollision stattfindet. Nur weiß ich leider nicht wie ich das in Java-Slick umsetzen kann.

Das wäre jetzt der Anfang meiner Überlegung:

```
if(circle.intersects(player2.player2)){
    		Vector2f normal = new Vector2f(circle.getCenterX(),circle.getCenterY());
			Vector2f direction = new Vector2f(this.xSpd,this.ySpd);
```


----------



## checkerphil05 (30. Dez 2011)

Hi,

Ich hab im Internet jetzt folgende Formel gefunden:

R' = Reflektionsvektor; 
N = normale (normiert); 
R = Richtungsvektor (normiert); 

R' = 2 * Skalarprodukt(N, R) * N - R

Diese habe ich nun versucht anzuwenden:


```
if(circle.intersects(player2.player2)){
    		//Erstellt normalisierten Richtungsvektor des Spielballs
    		Vector2f normalc = new Vector2f(circle.getCenterX(),circle.getCenterY());
			Vector2f directionc = new Vector2f(this.xSpd,this.ySpd);
			Vector2f cr = directionc.sub(normalc);
			Vector2f crn = cr.normalise();
    		//Erstellt normalisierte Normale zwischen Spieler2 und dem Spielball
			Vector2f normalp2 = new Vector2f(player2.getCenterX(),player2.getCenterY());
			Vector2f directionp2 = new Vector2f(circle.getCenterX(),circle.getCenterY());
			Vector2f p2rc = directionp2.sub(normalp2);
			Vector2f p2rcn = p2rc.normalise();
			//Reflektiert den Richtungsvektor des Spielballs an der Normalen, nach der Formel
			Vector2f reflect1 = p2rcn.dot(crn);
			Vector2f reflect2 = 2 * reclect1 * crn - p2rcn;
			//Gibt die neue Richtung aus
			this.xSpd = reflect2.x;
			this.ySpd = reflect2.y;
			
    	}
```

Bei Zeile 13 und 14 gibt er mir aus, dass reflect1 ein float sein muss, allerdings weiß ich nicht wie ich das umschreiben muss.


----------



## Marco13 (30. Dez 2011)

Ohne das nachgerechnet zu haben, sowas wie
float reflect1 = p2rcn.dot(crn);
Vector2f reflect2 = new Vector2f(2 * reclect1 * crn.x - p2rcn.x, 2 * reclect1 * crn.y - p2rcn.y);


----------



## checkerphil05 (30. Dez 2011)

Super, hat funktioniert, vielen dank.


----------

