# Kollision Kreis Rechteck



## Samurai (3. Nov 2010)

Hey,
ich hoffe dies ist hier die richtige Kategorie, sonst bitte verschieben.

Mein Problem: ich schreibe an einer Art Breakoutklon, sprich man hat dieses "Paddel" und muss mit einem Ball die Blöcke zerstören. Gibt es zwar schon 1000 mal aber ist eine gute Übung für 2d Spiele. (Btw kann hier jemand gute Anleitungen für 2d Spiele angeben?).

Mein Problem ist jetzt die Korrekte Kollisionserkennung zwischen Ball und Block. Theoretisch kann man dies ja einfach machen indem ein Quadrat um den Ball annimmt und abfragt ob dieses den Quader des Block schneidet (intersect oder so). Das führt aber bei einem runden Ball zu komischem Verhalten.

Gibt es also eine Funktion um einen Kreis mit einen Rechteck kollidieren zu lassen? Und wie bekomme ich dann raus wo die sich getroffen haben.
Ich hab das momentan folgender Maßen gemacht:

es werden 8 Punkte auf dem Kreis berechnet. Das sind diese (x = Punkt)

00x00
0x0x0
x000x
0x0x0
00x00

Dann schau ich mit .getrect().contains() nach ob einer davon im Block liegt. Wenn ja wird halt die Richtung geändert. Dies funktioniert aber nicht gerade perfekt. Daher die Frage wie mache ich das besser?


----------



## Marco13 (3. Nov 2010)

Spontan... 

Wenn der Mittelpunkt des Balles in einem der mit ! markierten bereiche liegt

```
.    .
       .    .
       !!!!!!
       !!!!!!
...!!!!BBBBBB!!!!...
...!!!!BBBBBB!!!!...
       !!!!!!
       !!!!!!
       .    .
       .    .
```
dann bestimmt man den Abstand des Mittelpunktes zur jeweiligen Seite, und wenn der <radius ist, prallt er an der entsprechenden Seite ab, mit Einfallswinkel=Ausfallswinkel, außer wenn du noch Fancy was mit Anschneiden machen willst. (Bei einigen Breakouts wird der Schläger als Block dargestellt, hat aber afair ein Verhalten, das eher an eine flache "Pyramide" erinnert.)

Wenn der Mittelpunkt nicht in diesen Bereichen liegt, dann liegt er an einer "Ecke" (also den leeren Eck-Bereichen oben). Dann betrachtet man den Abstand vom Mittelpunkt zur Ecke, und wenn der kleiner als der Radius ist, prallt der Ball an der Ecke ab, dann müßte (statisch, im einfachsten Fall) einfallswinkel=ausfallswinkel in bezug auf die Ebene gelten, deren Normale die Strecke Kresimittelpunkt-Ecke gegeben ist.


----------



## Samurai (3. Nov 2010)

Ok das hört sich etwas einfacher an! Gibt es eine vorgefertige Funktion für den Abstand? Sonst muss ich da nochmal selber was zusammenbasteln.


----------



## Marco13 (4. Nov 2010)

Alles in der Umgebung von Line2D (Java Platform SE 6)


----------



## Samurai (8. Nov 2010)

Dumme frage aber das ist doch nur eine Superklasse sozusagen stimmts? Daher muss ihc mit konkreten Unterklassen arbeiten.
Rect gibts ja zum Beispiel, aber als ich sowas in der Art:

```
Line linie;
linie = new Line()
```

versucht habe kamen nur Fehler. Gibt es da was passendes?


----------



## Marco13 (8. Nov 2010)

Line2D.Double line = new Line2D.Double(...);
oder (besser?)
Line2D line = new Line2D.Double(...);
Ich find' diese Unterklassen etwas merkwürdig... aber wohl eine angemessene Lösung für das Problem.


----------



## StrikeTom (17. Nov 2010)

Den abstand zwischen zwei punkten berechnet man so:
wurzel von ((punkt1x-punkt2x) zum quadrat + (punkt1y-punkt2y)zum quadrat)
In java aus gedrückt:

```
int abstand = Math.sqrt((Math.pow(x1,2)-Math.pow(x2,2))+(Math.pow(y1,2)-Math.pow(y2,2))
```


----------



## Marco13 (18. Nov 2010)

Oder mit Point2D (Java Platform SE 6)


----------



## Grey_M (18. Nov 2010)

Also ich hatte mal sowas ämliches.

Für die Kollisionserkennung habe ich mir dann neben dem Rechteck das ich zeichne, jede Kante als Linie gemerkt.
-lineTop
-LineBottom
-lineLeft
-LineRight

Irgendwo, ich weis gerade nicht wo, gibt es eine Methode die schaut ob eine Linie einen Kreis schneidet. Bei meiner Logikprüfung habe ich dann geschaut in welche Richtung sich die Kugel bewegt.
Bewegt sie sich nach oben, so muss ich nur die lineBottom prüfen. Kommt die Kugel von rechts, so muss ich nur lineRight prüfen.
Entsprechend gibt es dann die Kombinationen. Wenn die Kugel von rechts unten kommt, dann prüfen linteBottom und lineRight.

Hat soweit wunderbar funktioniert. Falls interesse besteht kann ich meinen "proof of concept" bereit stellen.


----------

