Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Kolizje prymitywów

Ostatnio zmodyfikowano 2024-02-07 14:36
Autor Wiadomość
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.
C/C++
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 )
   
P-180254
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
P-180255
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ą.
P-180257
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
P-180259
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.
P-180260
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.
C/C++
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 );
       
//executeScriptsMap( m );
   
}
   
m->visible = boolean;
   
P-180261
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.
P-180266
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.
P-180269
« 1 » 2 3
  Strona 1 z 3 Następna strona