Oblicznie trajektorii lotu - pytanie

gienek
2011-05-13 17:28
gienek
0

Witam! Skorzystałem z wszechwiedzącej Wikipedii i napisałem wzór w C++ na przebytą drogę punktu. Nie wiem tylko w jakich jednostkach wychodzi wynik. Jezeli podaje wszystko w podstawowych, to powinien w metrach, ale nie wiem co z tym kątem. Kod:

#include <iostream>
#include <cmath>

using namespace std;

const double g = 9.81;
double kat, v, h, s;

int main()
{
    cout << "Wprowadz kat: ";
    cin >> kat;
    cout << "Wprowadz predkosc: ";
    cin >> v;
    cout << "Wprowadz wysokosc poczatkowa: ";
    cin >> h;
    s = (v * (PI * sin(kat) / 180)) / g * (v * (PI * sin(kat) / 180) + sqrt(pow(v * (PI * sin(kat) / 180), 2) + 2 * g * h )); //wzór
    cout << "Dystans przebyty przez pocisk: " << s; //wynik
    return 0;
}

Tam zamieniłem stopnie na radiany, ale nie wiem czy tak ma być. Same stopnie wychodził duzy wynik. Proszę o odpowiedź w jakich jednostkach jest wynik i czy dobrze zrobiłem zamieniając na radiany. Tylko mi tu nie krzyczeć! Ja dopiero w gimnazjumi o takich rzeczach jeszcze pojęcia nie mam :)

Pozostało 580 znaków

2011-05-13 18:30

Rejestracja: 15 lat temu

Ostatnio: 4 tygodnie temu

0

a co to? PI * sin(kat) / 180
jeżeli kąt podajesz w stopniach to liczysz *sin(katPI/180)**

Pozostało 580 znaków

2011-05-13 18:30

Rejestracja: 8 lat temu

Ostatnio: 1 rok temu

Lokalizacja: Białystok

0

Rozumiem, że chodzi Ci o http://upload.wikimedia.org/m[...]0501561519415962ddda5e85e.png

Nieco się pomyliłeś z zamianą ;-)

Konstrukcja (PI * sin(kat) / 180) nie zwróci ci sinusa kąta.
Najpierw określ co pobierasz od użytkownika. Domyslam się, że to ma być kąt w stopniach.

Potem zamień go na radiany za pomocą kat= (PI * kat / 180) , a potem przekaż wartość w radianch do funkcji sin()</code> albo <code>cos().

#include <iostream>
#include <cmath>
#define PI                3.14159265358979323846

//użyłem define, bo mój Code::Blocks nie wyciągnął z <cmath> stałej PI
using namespace std;

const double g = 9.81;
double kat, v, h, s;

int main()
{
    cout << "Wprowadz kat (w stopniach): ";
    cin >> kat;
    kat=PI * kat / 180;
    cout << "Wprowadz predkosc (w m/s): ";
    cin >> v;
    cout << "Wprowadz wysokosc poczatkowa (w m): ";
    cin >> h;
    s =( ( v* cos(kat) ) / g )  *  (v * sin(kat) +  sqrt( pow(v * sin(kat), 2) + 2*g*h )  );
    cout << "Dystans przebyty przez pocisk (w m): " << s; //wynik
    return 0;
}

Proponuję coś takiego, chyba działa ( na 100% nie dla każdego kąta, ale to szczegół). Wydaje się podawać rzeczywiste wyniki, gdy podrzuciłem mu przykładowe parametry.
Jednostki będą takie, w jakich określasz przyspieszenie. Skoro G podałeś w metrach/ sekunda^2 ,to pobieraj prędkość w metrach/sekunda, a wynik jakby nie patrzeć wyjdzie w metrach.

Pozdrawiam,
Jadeszek

edytowany 1x, ostatnio: Jadeszek, 2011-05-13 18:32

Pozostało 580 znaków

gienek
2011-05-13 18:47
gienek
0

Dzięki, juz rozumiem. Faktycznie pochrzaniłem z tą zamianą, a nie pierwszy raz zamieniam radiany > stopnie :P Poprawię błędy i będzie działać :)

Poprawiłem błędy, ale wychodzi za dużo. Prędkość początkowa pocisku z AK74 = 900m/s. Podaję wysokość = 2, i kąt 90, czyli tak jakbyśmy mniej więcej strzelali w realu. Wychodzi mi z tego, że droga == 16000 w przybliżeniu. To nawet jak to metry są to nie możliwe, 5km nie przeleci a 16 ;D To samo kąt = 45, wysokość = 0, prędkość 900, i mam ~80km :P Mówisz, że tobie wychodzą realne, mi niestety nie. Chyba, że coś źle rozumiem pod postacią "droga". Proszę o pomoc.

Pozostało 580 znaków

2011-05-13 19:22

Rejestracja: 8 lat temu

Ostatnio: 1 rok temu

Lokalizacja: Białystok

0

Spójrz na trzeci wzór.

d=v^2 / g

To specyficzny przypadek gdy kąt=45*, a wysokość startowa wynosi 0.
Dla kuli z kałacha powinno dać ~82 km.
I tyle daje program.

W realu masz jeszcze opory powietrza - i po mojemu to na nich spoczywa wina z drastyczny spadek odległości.

Pozostało 580 znaków

gienek
2011-05-13 19:28
gienek
0

To wychodzi ~82km to pewnie w próżni, ale aż tyle powietrze by zachamowało? Dobra poszukam czegoś co opór powietrza uwzględnia ;)

Pozostało 580 znaków

2011-05-13 19:29

Rejestracja: 8 lat temu

Ostatnio: 1 rok temu

Lokalizacja: Białystok

0

BTW - kąt mierzysz od poziomu, nie od pionu. Więc normalny strzał z AK47 to będzie 0, nie 90.
90* to strzelanie bezpośrednio w górę, które powinno dać wynik 0, a daje w programie błąd, jakieś przekroczenie wartości (mówiłem, że nie będzie działać zawsze ;-) ).

//Mnie osobiście też na pierwszy rzut oka dziwi tak duże zwiększenie się w warunkach teoretycznych, ale nie mam pomysłu na nic innego co by hamowało lot pocisku.

edytowany 1x, ostatnio: Jadeszek, 2011-05-13 19:31

Pozostało 580 znaków

2011-05-13 19:30

Rejestracja: 11 lat temu

Ostatnio: 5 lat temu

0

@Jadeszek Nie myl mu. Ma dobry wzór a już Ci tłumaczę dlaczemu. Wzór który podałeś tak prawdę mówiąc jest trochę inny i wyraża się wzorem:
*d = (v v / g) sin(2 kat)**. Ten wzór jest w porządku jeżeli rzucasz coś na równinie. Ale on może chcieć rzucić coś ze skały i wtedy ten wzór nie zadziała, gdyż kamień poleci dalej niż max który jest dla tego wzoru.

EDIT: Jeżeli chcesz stworzyć silnik z wykorzystaniem fizyki i potrzebujesz do tego oporu powietrza to wzór jest następujący:
*D = 0.5 C r S v v - gdzie:
D - siła oporu
C - współczynnik oporu aerodynamicznego
r - gęstość powietrza
S - pole przekroju poprzecznego, czyli w przypadku naboju to będzie koło
v - **prędkość


Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)
edytowany 1x, ostatnio: MJay, 2011-05-13 19:35

Pozostało 580 znaków

gienek
2011-05-13 19:41
gienek
0

Ale przy kącie równym 0 czyli poprawnie poziomo daje mi wynik 0 ;/ Nie mogę nigdzie znaleźć podłączenia do wzoru oporu powietrza. Wzór mam:

P = 0,5 * Cx * g * A * V[kwadrat]  w którym:

            g – gęstość powietrza w kg/m3 = 1,226 kg/m3

            A – pole powierzchni czołowej w m

            V – prędkość w km/h

            Cx = siła oporów / (dynamiczne ciśnienie powietrza * pole powierzchni czołowej) = 10 * P [N] * V [m/s] = 10*p*V [W]

I co z tym zrobić jak już obliczę ten opór powietrza? Dodać, odjąć, podzielić, pomnożyć?

Pozostało 580 znaków

2011-05-13 19:54

Rejestracja: 8 lat temu

Ostatnio: 1 rok temu

Lokalizacja: Białystok

0

@MJay, z całym szacunkiem, ale nic nie mylę chyba. Napisałem przecież, że wzór *d=vv/g* działa tylko dla specyficznego przypadku gdy kąt jest równy 45, a wysokość wynosi 0.
d = (v v / g) sin(2 kat) = (v v / g) sin(2 45) = (v v / g) sin(90) = (v v / g) 1 = v*v/g

Twój wzór pasuje dla ogólnego przypadku gdy wysokość jest równa zero, a mój dla tego szczególnego, na którym chciałem pokazać, że program podaje dobre teoretyczne wyniki.

A to, że kąt liczymy od "dołu" to prawda - dla 90 mamy wtedy odległość zero, a dla 0 - wzór na zasięg rzutu poziomego.

Pozostało 580 znaków

2011-05-13 20:00

Rejestracja: 11 lat temu

Ostatnio: 5 lat temu

0
  1. Bo ten wzór tak jak mówię jest gorszy, jest przekształceniem wzoru którego używasz na początku i uwzględnia rzut tylko na równinie. Dla kąta równego 0 to tak jakby odrazu zetknął się z ziemią, czyli nigdzie nie poleciał, podobnie dla 90 wynik też jest 0.

  2. Wiesz jak się dodaje wektory?
    user image
    Rozrysowałem Ci jak działają siły na pocisk, pomarańczowe (z uwzględnieniem oporu powietrza), czerwone, bez uwzględniania oporu powietrza (sama siła grawitacji).

@Jadeszek, ale tu chyba nie chodzi o obliczenie najdalszej odległości tylko wyznaczenie trajektorii lotu. I tak jak mówie nie uwzględnia ten wzór odległości dalszej niż dla kąta 45* (czyli nie uwzględnia róznicy poziomów).


Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)
edytowany 1x, ostatnio: MJay, 2011-05-13 20:05
Okej, zwracam honor w takim układzie. Ja się nigdzie nie upieram, że on będzie działał dla różnych poziomów, analizowałem tylko najprostszy przypadek, nie pomyślawszy o wzięciu na warsztat innych - bo myślałem, że autor ma zamiar liczyć tylko równinny lot ;-)<br /> PS W takim razie czym dokładnie jest "kąt pod jakim wystrzelony został pocisk"? To kąt pomiędzy prostopadłą do kierunku działania siły grawitacji a kierunkiem strzału? Czy jak go ładnie zdefiniować? - Jadeszek 2011-05-13 20:13
Wzór ten działa tylko dla przypadku takiego http://imageshack.us/m/827/746/loth.png . Kiedy poziom początkowy jest równy poziomowi końcowemu. Jeżeli chcesz policzyć od wystrzału poziomowego to musisz skorzystać v<sup>2 = v0</sup>2 + 2g(h - h0) - MJay 2011-05-13 21:47

Pozostało 580 znaków

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0