AP1994 Temat założony przez niniejszego użytkownika |
Zmiana toru lotu po kolizji względem kąta uderzenia » 2022-10-13 17:07:55 Sprawdzenie czy coś koliduje to nie problem, ale jak sprawdzić pod jakim kątem? Nie wiem jak zrobić coś, co zadziała dla każdego kąta ostrego, rozwartego, prostego. Tym bardziej że same kolizje mogą występować pod różnymi kątami. Piszę program, w którym piłka będzie się odbijać od ścian ekranu i czworokątów na ekranie. Chciałem znaleźć jakiś sposób na zmianę toru lotu kuli przy pomocy znajomości kąta. Na przykład, jeżeli kula uderzy w coś pod kątem 15° powinna się odbić pod takim samym kątem po drugiej stronie. Nawet jeżeli ktoś poda link, do angielskiej strony gdzie liczą to w radianach i tak się przyda. |
|
DejaVu |
» 2022-10-13 17:26:12 |
|
AP1994 Temat założony przez niniejszego użytkownika |
» 2022-10-15 14:46:19 |
|
pekfos |
» 2022-10-17 17:10:34 Z samą binarką ciężko powiedzieć. |
|
AP1994 Temat założony przez niniejszego użytkownika |
» 2022-10-18 11:25:38 posiadam klasy platformy piłki i poziomu dla objaśnienia: konstruktor lvl(int x,int y,int szr,int wys); wywołanie konstruktora lvl lvl1(szr_monitora/20,wys_monitora/50,szr_monitora,wys_monitora); void lvl::Collision( Ball & b, Platform & p ) { if( collide_aabb_circle( 0, 0, this->szr, this->wys, b.x, b.y, b.r ) ) { if( collide_aabb_aabb( b.x, b.y, b.w, b.h, 0, 0, this->szr, this->y * colision.size() ) ) { for( int i = 0; i < colision.size(); i++ ) { for( int j = 0; j < colision[ i ].size(); j++ ) { if( collide_aabb_circle( j * this->x, this->y * i, this->x, this->y, b.x, b.y, b.r ) ) { if( colision[ i ][ j ] > 0 ) { if( colision[ i ][ j ] == 10 ) { if( b.x >= j * this->x || b.x <= j * this->x + this->x ) { b.velocityY = abs( b.masa * b.velocityY + masa_klocka * num + masa_klocka *( num - b.velocityY ) /( b.masa + masa_klocka ) ); } else if( b.y >= i * this->y || b.y <= i * this->y + this->y ) { b.velocityX = abs( b.masa * b.velocityX + masa_klocka * num + masa_klocka *( num - b.velocityX ) /( b.masa + masa_klocka ) ); } } else { if( b.x >= j * this->x || b.x <= j * this->x + this->x ) { b.velocityY = - b.velocityY; } else if( b.y >= i * this->y || b.y <= i * this->y + this->y ) { b.velocityX = b.velocityX; } } colision[ i ][ j ] = colision[ i ][ j ] - 1; } break; } } } } else if( collide_aabb_aabb( b.x, b.y, b.w, b.h, 0, this->wys - p.h * 2, this->szr, p.h * 2 ) ) { if( b.klik ) { if( collide_paletka( b, p ) ) { if( b.x >= p.x || b.x <= p.x - p.w ) { b.velocityY = - b.velocityY; } else if( b.y >= p.y || b.y <= p.y - p.h ) { b.velocityX = - abs( b.masa * b.velocityX + p.masa * p.velocityX + p.masa *( p.velocityX - b.velocityY ) /( b.masa + p.masa ) ); } } } } } else { if( b.y >= this->wys + 100 ) { dol = true; } else if( b.y <= 0 || b.x >= this->szr || b.x <= 0 ) { if( b.y <= 0 ) b.velocityY = - b.velocityY; if( b.x >= this->szr || b.x <= 0 ) b.velocityX = - b.velocityX; } } |
|
pekfos |
» 2022-10-18 23:28:50 Doprecyzuj "nie działa za dobrze". Żeby nie zgadywać jaki jest problem. |
|
AP1994 Temat założony przez niniejszego użytkownika |
» 2022-10-19 10:37:15 program potrafi zgłupieć przy kolizji z paletką i zdarza się że kula zniszczy więcej niż 1 klocek naraz. bool collide_paletka( Ball & b, Platform & p ) { if( collide_aabb_circle( p.x + p.h / 2, p.y, p.w - p.h, p.h, b.x, b.y, b.r ) || collide_circle_circle( p.x + p.h / 2, p.y + p.h / 2, p.h / 2, b.x, b.y, b.r ) || collide_circle_circle( p.x + p.w - p.h / 2, p.y + p.h / 2, p.h / 2, b.x, b.y, b.r ) ) { return true; } else { return false; } }
błąd występuje na styku kolizji collide_aabb_circle i collide_circle_circle |
|
pekfos |
» 2022-10-19 18:02:40 Ten warunek jest poprawny? if( b.x >= p.x || b.x <= p.x - p.w ) { b.velocityY = - b.velocityY; } |
|
« 1 » 2 |