[libGDX 0.9.7][także C# i XNA] Kolizje pomiędzy kwadratami obróconymi o różny kąt

Witam, w tym poście omówię pokrótce, jak korzystać i obsługiwać kolizję dla kwadratów z uwzględnieniem ich obrotu.

Na internecie aż tak wiele(zwłaszcza dla Javy) przykładów nie ma. Na szczęście można znaleźć przykład dla C# i XNA(informacja odnośnie usprawnienia kodu C# na dole artykułu). Strony już nie pamiętam ale przykład z klasą obsługującą tą kolizję mam na chomikuj. Ale główna treść tego posta przeznaczona jest dla użytkowników Javy i libGDX w szczególności.

A więc do rzeczy:

RotatedRectangle.java - plik .java z przepisanym i lekko zmodyfikowanym(poprawiłem obsługę wektora Origin, odpowiadającego za środek obrotu) algorytmem z C#, dzięki temu możemy zmienić wartość zmiennej Vector2 Origin na dowolną. Samego algorytmu omawiać nie będę, ale przedstawię obsługę klasy.

1. Tworząc klasę w konstruktorze podajemy do niej 2 parametry:
Rectangle: pierwszy parametr określa nam pozycje domyślną naszego obracanego kwadratu, czyli dla 0*(stopni).
angle: określa o ile stopni nasz kwadrat jest obrócony. UWAGA: w libGDX im większy stopień tym kwadrat bardziej jest obrócony w LEWO!

2. Metody ChangePosition i SetPosition służą do zmiany pozycji naszego obracalnego kwadrata.
Z tymże ChangePosition() jako parametry przyjmuje tylko float(można to oczywiście wedle woli modyfikować) x i y o które UWAGA! kwadrat zostanie przesunięty. Czyli podane parametry zostaną dodane do już istniejącego położenia.
SetPositio() działa nieco inaczej i działa dla typów int i float. A wartości do niego wprowadzone x i y staną się jego nową pozycją i nie zostaną dodane do tych już przez niego posiadanych.

3. Na obrót mamy bezpośredni wpływ regulując wartość parametru float Rotation. Osobiście ten parametr u mnie przyjmuje wartości od 0* do 359* i nigdy innych(Choć zapewne nic się nie stanie gdy je przekroczy).

4. Klasa obracalnego kwadratu posiada jeszcze 1 przydatną funkcję a mianowicie:
Intersects(RotatedRectangle theRectangle) - zwracającego true jeśli wystąpiła kolizja z obracalnym kwadratem danym jako argument metody i false jeśli kolizja nie została wykryta.

Klasa posiada jeszcze parę innych publicznych funkcji mniej lub bardziej dla nas pomocnych. Których działania nie będę opisywał. Wystarczy spojrzeń na ich kod albo same nazwy by dowiedzieć się co robią. Poniżej przedstawię jeszcze adnotacje o środku symetrii(Origin) wraz z informacją dla użytkowników XNA.


C# i XNA: przykład podany na początku może mieć Origin tylko na środku swojej powierzchni, co może utrudnić pracę nad aplikacją. Czasem na przykład chce aby nasz obiekt obracał się od jednego z rogów a nie wokół swojego środka. Dlatego zainteresowanych modyfikacją zapraszam do przeglądnięcia metod: UpperRightCorner(), UpperLeftCorner(), LowerRightCorner() w kodzie java i podstawieniu w odpowiednie miejsca zamiast parametrów Origin - ich zmodyfikowanych wartości. Dzięki temu będziemy mogli ustawić nasz Origin tam gdzie będziemy go potrzebowali.