Autor Wątek: Najlepszy ruch obiektu  (Przeczytany 2578 razy)

Offline Zarejestruj

  • Użytkownik

# Listopad 04, 2016, 11:43:08
Witam

Mamy do dyspozycji pomieszczenie opisywane współrzędnymi x i y, piłkę A i obiekt B, który przyjmijmy, że jest wysoki tylko na 1 jednostkę i długi  też na 1.

Czy mając do dyspozycji stałe:
  • grawitacja piłki
  • max prędkość piłki
  • prędkość obiektu B (zawsze taka sama)
i zmienne:
  • x i y piłki
  • dx i dy piłki
  • prędkość początkowa piłki
  • x obiektu B (może się poruszać tylko poziomo)
można obliczyć, do jakiej pozycji x powinien iść obiekt B, żeby mieć jak największe szanse na to żeby piłka spadła prosto na niego, a jak tak to jakie wzory będą tu potrzebne? Obiekt B znajduje się na początku na środku pomieszczenia, może poruszać się w lewo i w prawo a piłka jest na niego rzucana z góry z przypadkowego miejsca.

W skrócie pisząc jak obliczyć w którym miejscu x upadnie piłka?  Czas jej upadku i prędkość obiektu B możemy pominąć bo nic to nie pomoże w obliczeniach, jak obiekt B zdąży to zdąży a jak nie zdąży to trudno.
« Ostatnia zmiana: Listopad 04, 2016, 13:52:03 wysłana przez Zarejestruj »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline jarou

  • Użytkownik

# Listopad 04, 2016, 19:01:12
Rzut poziomy, jeśli dobrze zrozumiałem?

Offline Zarejestruj

  • Użytkownik

# Listopad 04, 2016, 22:47:50
Trudno powiedzieć czy to jest dokładnie to, mam obliczyć w jakim miejscu x i y spadnie piłka mając do dyspozycji jej x, y, dx i dy. Właściwie grawitacja, max speed i tym podobne rzeczy nie są istotne bo nie interesuje mnie czas spadnięcia piłki tylko jego miejsce w x i y.

Offline jarou

  • Użytkownik

# Listopad 05, 2016, 09:39:05
A to nie jest zależne? :O

Offline Zarejestruj

  • Użytkownik

# Listopad 05, 2016, 11:21:48
Moim zdaniem nie, czy piłka spadnie za sekunde czy za rok i czy z prędkością 40 czy 400, to jak nie napotka innych przeszkód, spadnie w tym samym miejscu :D

Offline deadeye

  • Użytkownik

# Listopad 05, 2016, 12:13:14
ale ona porusza się torem liniowym? czy parabolą w której jej pęd jest "wychylany" przez grawitację? Jeśli to drugie, to jej obecna prędkość i grawitacja ma oczywiście wpływ na to gdzie piłka wyląduje.

Offline Zarejestruj

  • Użytkownik

# Listopad 05, 2016, 13:40:39
Działają tylko te siły i występują zmienne i stałe, które napisałem w pierwszym poście. Nic nie zakłóca grawitacji. Piłka np. spada pod jakimś kątem i mam obliczyć gdzie spadnie, ale kąty też tu nie mają znaczenia bo mam do dyspozycji x, y, dx i dy piłki.

Offline laggyluk

  • Użytkownik
    • http://laggyluk.com

# Listopad 05, 2016, 15:32:15
jeżeli jest zrzucana na niego z góry tak jak napisałeś to nie trzeba nim poruszać ;)

Offline Patrulek

  • Użytkownik

# Listopad 05, 2016, 16:53:16
Cytuj
W skrócie pisząc jak obliczyć w którym miejscu x upadnie piłka?

Oblicz czas jaki potrzebuje piłka aby pokonać różnicę wysokości między nią, a obiektem, a później odległość jaką pokona w tym czasie na osi x.

Offline Zarejestruj

  • Użytkownik

# Listopad 05, 2016, 18:42:11
Na razie próbowałem obliczyć gdzie upadnie piłka przez wzór x = x + dx, ale to nie bardzo działa, trzeba jeszcze uwzględnić czas upadku? W sensie, że ten wzór jest tylko na np. jedno 10 ms?
« Ostatnia zmiana: Listopad 05, 2016, 19:36:32 wysłana przez Zarejestruj »

Offline zeor

  • Użytkownik

# Listopad 05, 2016, 20:50:32
Założenia:
Posiadamy piłkę w pozycji x,y która będzie spadała w kierunku "ziemi". Obiekt B znajduje się na naszej umownej "ziemi" na pozycji x. Zadanie polega na obliczeniu w które miejsce 'x' spadnie piłka.

Jeżeli założenie są poprawne to powinniśmy wykorzystać wektory.

Rozwiązanie:

// nasza pilka
struct pilka {
double x, y;
double dx, dy;
double speed;
};
pilka P;

struct obiekt {
double x, y;
};
obiekt B;


// sprawdzamy w ktore miejsce spadnie pilka
double check_x() {
// zmienne temp x i y - nie bedziemy modyfikowac x i y pilki
double x = P.x;
double y = P.y;

// skoro wiemy na jakiej wysokosci jest nasza 'ziemia' i obiekt B
// sprawdzamy w petli kiedy y pilki osiagnie pozycje obiektu B

do {
x += P.dx * P.speed; // nie uwzgledniamy grawitacji, przyspieszenia
y += P.dy * P.speed;
} while (y < B.y);

return x;
}




int main()
{
srand(time(NULL));
// ustaw obiekt B
B.y = 500;
B.x = 250;

// wylosuj pozycje x pilki; y rowne 0 - gora ekranu
P.x = rand() % 500;
P.y = 0;
P.speed = 1; // predkosc pilki

       // wylosuj pozycje x w ktora ma trafic pilka
double dest_x = rand() % 500;

// oblicz wektor
P.dx = dest_x - P.x;
P.dy = B.y - P.y;

double d = sqrt(P.dx * P.dx + P.dy * P.dy);

P.dx /= d;
P.dy /= d;

cout << check_x();
system("pause");
}



Offline Zarejestruj

  • Użytkownik

# Listopad 06, 2016, 18:28:42
@zeor tylko że w tym programie jest już z góry określone gdzie spadnie piłka ("// wylosuj pozycje x w ktora ma trafic pilka"), a ja właśnie chcę to obliczyć nie znając tego z góry.

Offline zeor

  • Użytkownik

  • +1
# Listopad 06, 2016, 18:36:57
Więc zamień:

P.dx /= d;

dla przykładu na:

P.dx = 0.05;

Piłka musi zmierzać w którąś stronę. Jeżeli dx będzie 0 to piłka spadnie pionowo w dół.
« Ostatnia zmiana: Listopad 06, 2016, 19:11:28 wysłana przez zeor »

Offline Zarejestruj

  • Użytkownik

# Listopad 06, 2016, 19:48:38
Nie zgadzał mi się x piłki obliczony na podstawie x i dx pewnie dlatego, że prędkość piłki była coraz szybsza a więc i dx był coraz większy.

Da się określić następną prędkość piłki na podstawie dx i dy czy jest to ze sobą niezwiązane i trzeba znać tę prędkość z innego źródła?  Bo np. mamy pierwszą informację o piłce x = 50 y = 0 dx = -10 dy = 10. A więc następne x i y piłki to będą x = 40 y = 10. A jeszcze następne, zakładając że piłka przyspiesza pod wpływem grawitacji? Dla dalszych pozycji przydałoby się coś w rodzaju x = x + dx * speed i jeszcze z uwzględnieniem grawitacji.
« Ostatnia zmiana: Listopad 06, 2016, 20:38:07 wysłana przez Zarejestruj »

Offline zeor

  • Użytkownik

# Listopad 06, 2016, 20:31:51
Przecież dx jest obliczony tylko raz i nie jest później modyfikowany. Jak mógł wzrastać wraz z prędkością?

Wszelkie manipulacje prędkością, "wygięciem" pod wpływem grawitacji itp przeprowadza się mnożąc dx i dy przez zmienne: x = x + ( dx * speed * gravity * kolorowy_kwadrat).