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

Offline Zarejestruj

  • Użytkownik

# Listopad 06, 2016, 21:01:29
Też mnie to dziwiło, że się nie zgadzało jak proporcjonalnie obliczałem x i y na podstawie dx i dy. Widocznie musiały działać jeszcze inne siły, z tego co widać przyspieszenie i grawitacja.

Offline Mr. Spam

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

Offline czaffik

  • Użytkownik

# Listopad 07, 2016, 19:27:17
Przekombinowane macie jakieś te domysły. Zeor, w twoim kodzie z góry zakładamy miejsce uderzenia piłki, więc bez sensu później obliczać gdzie ta piłka spadnie. Na początku za dużo wchodzi zmiennych, żeby liczyć jak będzie się piłka poruszać trzeba mieć jakieś dane początkowe, czyli położenie piłki w miejscu startu i prędkość piłki w miejscu startu, dopiero na tej podstawie będziemy mogli liczyć dokąd piłka zmierza. Ja bym te dx i dy zinterpretował jako prędkość piłki w kierunku osi x i y dla jednostkowego czasu, czyli: x = x0 + Vx*t przechodzi w x = x0 + dx, chociaz lepiej y było te zmienne nazwać Vx i Vy dla przykładu.

#include <iostream>
using namespace std;

struct pilka
{
    int x, y, dx, dy;
};

struct obiekt
{
    int x, y;
    int speed;
    int width;
    int height;
};

int main(int argc, char* argv[])
{
    int x = 0;
    int y = 0;

    pilka p;
    obiekt o;

    p.x = 100;
    p.y = 1;
    p.dx = 1;
    p.dy = 1;

    o.x = 200;
    o.y = 100;
    o.width = 1;
    o.height = 1;

    x = p.x;
    for (y = p.y; y < o.y - o.height; y += p.dy)
    {
        x += p.dx;
    }

    cout << x << " " << y << endl;

    return 0;
}

Offline czaffik

  • Użytkownik

# Listopad 07, 2016, 19:35:18
Przyspieszenie to możesz sobie dodać do równań kinematyki dla tej piłki, np możesz dodać wspomnianą siłę grawitacji, możesz dodać opór powietrza, może jeszcze mógłbyś coś dodać, ale żadna inna siła mi do łba nie przychodzi... a nie, chyba że jeszcze efekt coriolisa, ale to zależy od tego jak chcesz modelować ruch piłki, jeżeli nie potrzebujesz tych sił, wprowadzasz tylko prędkość, jeśli chcesz bardziej urealnić obliczenia, wtedy musiałbyś wprowadzić nowe wartości, ale to by trochę równania pokomplikowało.

Offline Zarejestruj

  • Użytkownik

# Listopad 07, 2016, 20:31:43
Jedyna siła jaka działa na piłkę to grawitacja. Zamierzam jeszcze spróbować obliczyć na podstawie dx i dy prędkość początkową piłki z tw. Pitagorasa a wtedy będzie można wykorzystać wzór na zasięg rzutu poziomego.

Offline czaffik

  • Użytkownik

# Listopad 07, 2016, 21:24:54
Może powinniśmy zacząć od uzgodnienia co wogóle znaczy dokładnie dx i dy, bo w tej chwili to wygląda tak jakby to było przesunięcie piłki w jednej jednostce czasu od początkowego, więc to co pisał Zeor w tym kontekście ma sens, tylko z tym jego dx*speed coś chyba nie tak jest. No możesz sprubować tak zrobić, ale najważniejsze to dobrze dobrać początkowe zmienne, ja bym zaczął od takiego zestawu jak początkowe położenie piłki i prędkość początkowa piłki, wtedy równania ruchu były by prościutkie.

Offline Zarejestruj

  • Użytkownik

# Listopad 07, 2016, 21:40:57
Dx i dy to przesunięcie piłki w x i y, które nastąpi następnym razem. W najprostszym razie można ją obliczyć tak: x = x + dx, y = y + dy. To można prosto obliczyć gdy piłka ma zawsze tę samą prędkość np. 1. Niestety gdy spróbujemy proporcjonalnie obliczać x i y tym sposobem podczas gdy na piłkę działa grawitacja to wyniki będą złe.

Np. mamy początkowe dane piłki x = 290, y = 0, dx = -10, dy = 10. Grawitacja 0.04. Prędkość początkowa piłki z tw. Pitagorasa wychodzi 0.6. Piłka znajduje się na samej górze i zmierza w dół na lewo. Dół możemy określić y = 480. Jedyne dane o tym zadaniu mam takie, że piłka napotkała przeszkodę na wysokości y = 394. Trzeba obliczyć na jakiej pozycji x znajdowała się piłka w momencie zderzenia. Mam już odpowiedź do tego zadania, stało się to na x = 172. No ale chodzi mi o to żeby wiedzieć jak rozwiązać takie zadanie.
« Ostatnia zmiana: Listopad 07, 2016, 23:16:59 wysłana przez Zarejestruj »

Offline zeor

  • Użytkownik

# Listopad 07, 2016, 23:32:19
@czaffik: swoje obliczenia oparłem na wektorach, niestety żadne dane wejściowe nie zostały podane więc pozostało wylosowanie x,y.
W moim programie dx i dy to przesunięcie cząstkowe w osiach x i y. Tych wartości nie powinno się zmieniać w trakcie ruchu (chyba że nastąpiła kolizja i chcemy zmienić wektor).
Mimo wszystko w tym przypadku Twój sposób jest lepszy.

Wracając do zadania to się pogubiłem.

Podstawiając wartości, które podałeś z jakiegoś powodu nie uzyskuję wyniku 172. Sprawdzone sposobem czaffika. Z grawitacją dostaję x = 250 a bez x = -110.
Panie Zarejestruj. Czy mógłbyś podać dokładną treść zadania?

Cytuj
Dx i dy to przesunięcie piłki w x i y, które nastąpi następnym razem. W najprostszym razie można ją obliczyć tak: x = x + dx, y = y + dy. To można prosto obliczyć gdy piłka ma zawsze tę samą prędkość np. 1. Niestety gdy spróbujemy proporcjonalnie obliczać x i y tym sposobem podczas gdy na piłkę działa grawitacja to wyniki będą złe.

Co masz na myśli pisząc, że wyniki będą złe? Jeżeli zadziała grawitacja to jasne, że będą inne ale nie złe. Chyba, że założenia i obliczenia są nie takie jak powinny być.

Offline Zarejestruj

  • Użytkownik

# Listopad 08, 2016, 09:07:36
Miałem na myśli to, że x i y na podstawie dx i dy bez uwzględnienia grawitacji, będzie zmieniał się proporcjonalnie do siebie, a wiadomo, że przynajmniej w przypadku tego zadania x będzie zmieniał się dużo mniej niż y. W x pokona tylko 290 - 172 = 118 jednostek a w y 0 + 394 = 394 jednostki. Panie @zeor mi wyszło, że zasięg rzutu poziomego to 84, a więc x = 290 - 84 = 206. 172 w rozwiązaniu zadania a 206 w moim wyniku to zbyt duża różnica, więc jeszcze coś musi być nie tak. Jak Panu wyszło co innego a poza tym jest to inny wynik niż w rozwiązaniu zadania to już nic z tego nie rozumiem.

Dokładna treść zadania:
Mamy dwuwymiarowe pomieszczenie o szerokości od x = 30 w lewym rogu do x = 630 w prawym, od y = 0 na górze do y = 480 na dole. Piłka A zostaje rzucona z góry z początkowymi danymi x = 290, y = 0, dx = -10, dx = 10. Grawitacja piłki g = 0.04. Oblicz miejsce x, w którym zetknęła się z przeszkodą, jeżeli stało się to na wysokości y = 394.
« Ostatnia zmiana: Listopad 08, 2016, 13:54:02 wysłana przez Zarejestruj »

Offline Patrulek

  • Użytkownik

  • +1
# Listopad 08, 2016, 15:36:23
Dla mnie to wygląda jak wałek w zadaniu. Zastanawia mnie grawitacja, wydaje mi się dziwnie mała. Wynik wychodzi 172 (w przybliżeniu), ale podstawiając pod grawitację wartość 4.

Kod

Offline czaffik

  • Użytkownik

  • +1
# Listopad 08, 2016, 16:03:09
Zgadza się, grawitacja wydaje się trochę za mała. Ponieważ nic lepszego nie wymyślę i wydaje mi się że nie da się wymyśleć, to ostatczne rozwiązanie powinno wyglądać tak:

#include <iostream>
using namespace std;

struct pilka
{
    float x, y, dx, dy;
};

int main(int argc, char* argv[])
{
    const int g = 4.0f;
    const float t = 0.01f;

    pilka p;

    p.x = 290;
    p.y = 0;
    p.dx = -10;
    p.dy = 10;

    while (p.y <= 394)
    {
        p.x += p.dx*t;
        p.dy += g*t;
        p.y += p.dy*t;
    }

    cout << p.x << " " << p.y << endl;

    return 0;
}

p.dx i p.dy to jednostkowa prędkość w kierunku osi x i y dla piłki biorąc pod uwagę fakt co panie Zarejestruj piszesz:
Cytuj
Dx i dy to przesunięcie piłki w x i y, które nastąpi następnym razem. W najprostszym razie można ją obliczyć tak: x = x + dx, y = y + dy
. Tyle że jak będziemy liczyć dla jednostkowego czasu otrzymamy niezbyt dokładne wartości, bo wartość y doda się za dużo w ostatnim obrocie pętli, w konsekwencji i x nie wyjdzie za dokładne, co można zrobić? Zwiększyć dokładność obliczeń zmniejszając czas i zwiększając tym samym liczbę obrotów pętli, dlatego wprowadziłem zmienną t i zmniejszyłem czas 100 razy.

Offline Zarejestruj

  • Użytkownik

# Listopad 08, 2016, 16:09:22
Mi też wychodzą prawidłowe wyniki w zaokrągleniu tylko gdy grawitacja wyniesie 4. Także @Patrulek znalazł rozwiązanie i przy okazji być może błąd w zadaniu (lub zachodzi jeszcze inna zależność nie podana w zadaniu).

Offline czaffik

  • Użytkownik

# Listopad 08, 2016, 16:19:58
A jak liczyłeś? wyliczając prędkość z tw. Pitagorasa z dx i dy i potem licząc ze wzoru na rzut poziomy? Fajnie jakbyś pokazał bo nie pamiętam tego wzoru. No na to wygląda że coś z tym g nie tak tylko, rzut poziomy to raczej nie jest aż tak skomplikowane zagadnienie żeby inne czynniki tu wchodziły w grę.

Offline Zarejestruj

  • Użytkownik

# Listopad 08, 2016, 16:27:09
A jak liczyłeś? wyliczając prędkość z tw. Pitagorasa z dx i dy i potem licząc ze wzoru na rzut poziomy? Fajnie jakbyś pokazał bo nie pamiętam tego wzoru.

Wyliczyłem prędkość z tw. Pitagorasa (wyszło 0.6) a potem podstawiłem dane do wzoru na zasięg rzutu poziomego. Z (zasięg) = V0 (prędkość początkowa) * pierwiastek z (2 * H0 (wysokość początkowa) / grawitacja). Wyszło, że Z = 84.

Offline czaffik

  • Użytkownik

# Listopad 08, 2016, 16:43:10
no i każde zadanie można rozwiązać na kilka sposobów, gdyby nie te g już byś miał dobrze... no powiedzmy prawie dobrze, skąd ci wychodzi prędkość początkowa 0.6?, bo mi wychodzi 14,14 ze wzoru v0 = sqrt(dx2 + dy2). I z tego wzoru na rzut poziomy też mi wychodzi ciągle coś nie tak mimo że g = 4, musiało by wyjść v0 = 8.4 by wyszło poprawnie, wtedy Z by wyszło około 118 i by pasowało, ale nijak nie pasuje.
« Ostatnia zmiana: Listopad 08, 2016, 18:04:50 wysłana przez czaffik »

Offline Zarejestruj

  • Użytkownik

# Listopad 08, 2016, 18:54:50
Rzeczywiście jak drugi raz policzyłem prędkość to wyszła 14,14, a ten wzór na zasięg rzutu poziomego daje zły wynik Z = 198 nawet przy grawitacji = 4. http://imgur.com/a/vzYDZ