Skocz do zawartości

Algorytm sprawdzania kolizji prostokątów


Boro Casso

Rekomendowane odpowiedzi

Witajcie potrzebuje jakiegoś szybkiego algorytmu sprawdzania kolizji, język programowania jest nie ważny, aby szybko chodził. Ja sobie już go przepisze pod własne potrzeby.

 

Najważniejsze aby przyjmował parametry x,y,szerokość,wysokość dla obu prostokątów.

Odnośnik do komentarza
Udostępnij na innych stronach

if ((player.x < rect.x + rect.width/2 + 0.1f) && (player.x > rect.x) && (player.y < rect.y + rect.height/2) && (player.y > rect.y - rect.height/2))

player.x = rect.x + rect.width/2 + 0.1f;

 

if ((player.x > rect.x - rect.width/2 - 0.1f) && (player.x < rect.x) && (player.y < rect.y + rect.height/2) && (player.y > rect.y - rect.height/2))

player.x = rect.x - rect.width/2 - 0.1f;

 

if ((player.y < rect.y + rect.height/2 + 0.1f) && (player.y > rect.y) && (player.x < rect.x + rect.width/2) && (player.x > rect.x - rect.width/2))

player.y = rect.y + rect.height/2 + 0.1f;

 

if ((player.y > rect.y - rect.height/2 - 0.1f) && (player.y < rect.y) && (player.x < rect.x + rect.width/2) && (player.x > rect.x - rect.width/2))

player.y = rect.y - rect.height/2 - 0.1f;

kiedyś w jakiejś książce był sam go używałem tyle że dla x,z :P

Odnośnik do komentarza
Udostępnij na innych stronach

Tak. Tyle że player.x musisz odpowiednio zmienić żeby był to prostokąt, a nie punkt, ale to chwilka roboty ;)

E: to jest na prostokąty tyle że jedynie zwaca wartość czy wystąpiła kolizja

bool kolizja(int x1,int y1,int s1,int w1,int x2,int y2,int s2,int w2)

{

if( x2<=x1+s1 && x2>x1 && y2>=y1 && y2<=y1+w1) return true; else

if( x2<=x1+s1 && x2>x1 && y2+w2>=y1 && y2+w2<=y1+w1) return true; else

if( x2+s2<=x1+s1 && x2+s2>x1 && y2>=y1 && y2<=y1+w1) return true; else

if( x2+s2<=x1+s1 && x2+s2>x1 && y2+w2>=y1 && y2+w2<=y1+w1) return true;

else return false;

};

* x1 - współrzędna x lewego górnego rogu naszego prostokąta.

* y1 - współrzędna y lewego górnego rogu naszego prostokąta.

* w1 - wysokość pierwszego prostokąta.

* s1 - szerokość pierwszego prostokąta.

http://www.easykoder.vot.pl/arty/kolizja

jak będę miał czas to go zmieni tak żeby wyliczał pozycje po kolizji

Odnośnik do komentarza
Udostępnij na innych stronach

///jakas struktura/klasa watever

struct Rect

{

int x;

int y;

int width;

int height;

 

};

 

bool RectanglesIntersect(const Rect& r1, const Rect& r2)

{

if(r2.x >= r1.x && r2.x <= r1.x + r1.width && r2.y >= r1.y && r2.y <= r1. y + r1.height) return true;

if(r2.x + r2.width >= r1.x && r2.x + r2.width <= r1.x + r1.width && r2.y >= r1.y && r2.y <= r1. y + r1.height) return true;

if(r2.x + r2.width >= r1.x && r2.x + r2.width <= r1.x + r1.width && r2.y + r2.height >= r1.y && r2.y + r2.height <= r1. y + r1.height) return true;

if(r2.x >= r1.x && r2.x <= r1.x + r1.width && r2.y + r2.height >= r1.y && r2.y + r2.height <= r1.y + r1.height) return true;

 

return false;

 

}

 

Coś w tym stylu. Sprawdzasz czy jakikolwiek wierzchołek jednego prostokąta znajduje się w drugim... Nie ma innej hiper-wydajniejszej metody.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...