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

Zmiana toru lotu po kolizji względem kąta uderzenia

Ostatnio zmodyfikowano 2022-10-20 15:30
Autor Wiadomość
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.
P-179710
DejaVu
» 2022-10-13 17:26:12
Kąt odbicia, trygonometria [SFML]

Frazy, które należy wpisać w wyszukiwarkę google:

https://doraprojects.net/questions/573084/how-to-calculate-bounce-angle
P-179711
AP1994
Temat założony przez niniejszego użytkownika
» 2022-10-15 14:46:19
przy pomocy stron od DejaVu Kąt odbicia, trygonometria [SFML] i Jak obliczyć kąt odbicia?
Stworzyłem taki program
niestety ciągle nie działa za dobrze i nie wiem czemu.
P-179717
pekfos
» 2022-10-17 17:10:34
Z samą binarką ciężko powiedzieć.
P-179730
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);
C/C++
void lvl::Collision( Ball & b, Platform & p ) /*metoda klasy poziomu*/
{
   
if( collide_aabb_circle( 0, 0, this->szr, this->wys, b.x, b.y, b.r ) ) ///kolizja w oknie
   
{
       
if( collide_aabb_aabb( b.x, b.y, b.w, b.h, 0, 0, this->szr, this->y * colision.size() ) ) ///kolizje kafelków
       
{
           
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 ) ) ///kolizja pojedyńczego kafelka
                   
{
                       
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 ) ) ///kolizje z paletką
               
{
                   
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 ///kolizja z oknem
   
{
       
if( b.y >= this->wys + 100 )
       
{
           
dol = true; ///zmienna powodująca restart pozycji piłki
       
}
       
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;
           
       
}
    }
   
P-179732
pekfos
» 2022-10-18 23:28:50
Doprecyzuj "nie działa za dobrze". Żeby nie zgadywać jaki jest problem.
P-179734
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.
C/C++
bool collide_paletka( Ball & b, Platform & p ) //kolizja z paletką
{
   
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
P-179735
pekfos
» 2022-10-19 18:02:40
Ten warunek jest poprawny?
C/C++
if( b.x >= p.x || b.x <= p.x - p.w ) // "poza paletką" w osi X??? przedział -------]    [------>
{
   
b.velocityY = - b.velocityY;
}
P-179736
« 1 » 2
  Strona 1 z 2 Następna strona