tBane Temat założony przez niniejszego użytkownika |
Kolizje prymitywów » 2023-08-12 10:12:32 P - Point R - Rectangle C - Circle E - Elipsa x - coordinate x y - coordinate y w - width h - height r - radius hr - horizontal radius vr - vertical radius
Punkt z Prostokątem
if( Px>=Rx1 && Px<=Rx2 && Py>=Ry1 && Py<=Ry2)
Punkt z Kołem
if(pow(Cx-Px),2) + pow(Cy-Py),2) <= Cr*Cr)
Punkt z Elipsą
if( pow((x-E->x)/E->hr, 2) + pow((y-E->y)/E->vr, 2) <= 1 )
Koło z Kołem
if(pow((C1x-C2x), 2) + pow((C1y-C2y), 2) <= C1r + C2r)
Prostokąt z Prostokątem
if( abs(x1-x2) < (w1+w2)/2.f && abs(y1-y2) < (h1+h2)/2.f )
Koło z Prostokątem
-wyznacz najbliższy punkt koła do prostokąta poprzez funkcje atan2. Następnie sprawdź czy punkt zawiera się w prostokącie.
float len = sqrt( pow( C->x - R->x, 2 ) + pow( C->y - R->y, 2 ) ); float angle = atan2( C->y - R->y, C->x - R->x );
float Px = C->x - C->r * cos( angle ); float Py = C->y - C->r * sin( angle );
if( Px >= Rx1 && Px <= Rx2 && Py >= Ry1 && Py <= Ry2 ) |
|
tBane Temat założony przez niniejszego użytkownika |
» 2023-08-12 10:22:10 Jaki wzór będzie na kolizje dwóch kwadratów a najlepiej prostokatow?
Jak na razie wymyśliłem: -sprawdzanie każdego z wierzchołków pierwszego prostokąta czy zawiera się w drugim prostokącie -jakieś niedziałające ify |
|
pekfos |
» 2023-08-12 15:53:10 Z twojego wzoru na "Punkt z Prostokątem" wynika że prostokąt jest zawsze wyrównany do osi. Wystarczy sprawdzić czy zakresy współrzędnych w obu osiach mają część wspólną. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2023-08-12 16:07:43 Nie potrafię sobie tego wyobrazić, a nawet gdy potrafię i klepię kod to nie działa. Na razie mam zbiór ifow dla prostokąta a i tak uważam, że w moim rozumowania jest luka.. Co jeśli prostokąt jest na tyle wielki że wierzchołki są poza zakresem drugiego prostokąta. Sprawdzić też ten drugi względem pierwszego? To 16 ifow |
|
pekfos |
» 2023-08-12 16:12:35 Wyrównany do osi prostokąt jest opisany przez zakres współrzędnych X i zakres współrzędnych Y. Potrafisz sobie wyobrazić dwa przedziały na osi liczb które mają część wspólną i dwa takie które nie mają? Twoje dwa prostokąty przecinają się gdy na obu osiach jest część wspólna. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2023-08-12 16:45:38 Nie jestem w stanie wyobrazić sobie funkcji operujacej na tych zakresach. Dlatego dałem parę ifow. Mój kod nie zadziała raczej na wszystkich monitorach.. Jak pół mapy będzie większe od krawędzi kamery to mapa się nie wyświetli A co robi ten kod? Otóż sprawdza czy środek mapy, wierzchołki mapy, oraz dwusieczne ramion mapy zawierają się w obszarze widoku kamery. for( map * m = firstMap; m != NULL; m = m->next ) { if( cam->pointOnView( m->centerx, m->centery ) || cam->pointOnView( m->left, m->top ) || cam->pointOnView( m->right, m->top ) || cam->pointOnView( m->left, m->bottom ) || cam->pointOnView( m->right, m->bottom ) || cam->pointOnView( m->centerx, m->top ) || cam->pointOnView( m->centerx, m->bottom ) || cam->pointOnView( m->left, m->centery ) || cam->pointOnView( m->right, m->centery ) ) boolean = true; else boolean = false; if( m->visible == true && boolean == false ) deleteUnvisibleObjectsFromRender( m ); if( m->visible == false && boolean == true ) { addVisibleObjectsToRender( m ); } m->visible = boolean; |
|
tBane Temat założony przez niniejszego użytkownika |
» 2023-08-14 18:57:22 Zrozumiałem Cię pekfos. Mam już wzór, a był trywialny. |
|
pekfos |
» 2023-08-14 21:11:34 Masz na myśli to co dopisałeś na górze? R2x2-R1x1<R1w+R2w && R2y2-R1y1<R1h+R2h Na pewno nie działa to poprawnie. Wygląda jakbyś użył podejścia dla kolizji dwóch kół i zapomniał że potęgowanie załatwia sprawę potencjalnie ujemnego wyniku w R2x2-R1x1. |
|
« 1 » 2 3 |