Oblicznie trajektorii lotu - pytanie

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 :)

0

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

0

Rozumiem, że chodzi Ci o http://upload.wikimedia.org/math/c/1/d/c1da5860501561519415962ddda5e85e.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

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.

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.

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 ;)

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.

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ść

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ć?

0

@MJay, z całym szacunkiem, ale nic nie mylę chyba. Napisałem przecież, że wzór d=v*v/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.

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 Od razu 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).

0

Nie wiem, może umiem nie pamiętam :P na razie to mam problem z oporem, żeby obliczyć ehh z tej strony biorę: http://www.rowerpoziomy.republika.pl/ROWER/OPOR.HTM Trochę kiepsko wytłumaczone i pomieszanie i chyba poszukam innej strony z wzorem. I opór wychodzi w niutonach.

0

No i bardzo dobrze, że wychodzi w Newtonach, bo to jest siła oporu. Aby coś spowolnić musi działać na ciało siła skierowana przeciwnie do zwrotu jazdy/lotu.

0

MJay, mógłbyś zajrzeć na tą stronę z wzorem? Bo mi wychodzi baaaaaardzo duża liczba, która się nie mieści w double o.O Tu mój kod:

const double g = 9.81;
const double r = 1.22; //gestosc powietrza
double kat;
double V; //predkosc
double h; //wyokosc
double s; //droga
double m; //masa pocisku
double A = 0.00005; //pole w metrach jak na stronie czyli 0,5cm2
double C; //aerodynamika
double P; //opor

int main()
{
    cout << "Wprowadz kat: ";
    cin >> kat;
    kat = PI * kat / 180;
    cout << "Wprowadz predkosc: ";
    cin >> V;
    cout << "Wprowadz wysokosc poczatkowa: ";
    cin >> h;
    cout << "Wprowadz wage pocisku: ";
    cin >> m;
    C = (10 * m * pow(V, 2)) / (1013 * A); //jak na stronie, obliczam Cx
    P = 0.5 * C * r * A * pow(V * 3.6, 2);
    s = ((V * sin(kat)) / g) * (V * sin(kat) + sqrt(pow(V * sin(kat), 2)) + 2 * g * h); //narazie ch* z tym
    cout << "opor:" << P;
    cout << "Dystans przebyty przez pocisk: " << s;
    return 0;
}

Już mnie od tego głowa boli.. Na tej stronie cos jest pomieszane P - siła, Cx - współczynnik, a Cx jest we wzorze na P i na odwrót P we wzorze Cx, do tego jeszcze jakaś moc oporów :( Też nie wiem z kąd to i gdzie to powinno być. Kurde że nie ma normalnej strony ze wzorem na opór powietrza!!

0
gienek napisał(a)

[...]Kurde że nie ma normalnej strony ze wzorem na opór powietrza!!
Bo zdaje mnie mi się, że takiej nie znajdziesz.
Trzeba by tu ułożyć równanie różniczkowe i numerycznie je rozwiązać.
Wbrew pozorom nie taki diabeł straszny

1

Dopóki nie tworzy projektu wartego kilka tysięcy złotych wydaje mi sie, że możemy tutaj przyjąć pewne wartości za domniemane, bo C dla pocisku to ok. 0.3 (bez uwzględniania, że po przekroczeniu bariery dzwięku, C się zwiększa).

0

Jak chcesz być taki dokładny i uwzględniać opór powietrza, to weź też pod uwagę fakt, że Ziemia jest kulą. Przy dużej prędkości początkowej wystrzelony pocisk nigdy nie spadnie.

0

Ta Wiki angielska widać dobrze jest tam opisane w miarę. Jutro zajrzę, bo dziś już mi garbage collector przestał działać w głowie i brakuje pamięci :D na razie dzielę sobie zwykły wzór na droge pocisku przez 36 i mniej więcej mam wynik dobry. :)

0
MJay napisał(a)

Kula wystrzelona z broni palnej nie ma szans wylecenia w kosmos, gdyż musiałaby dosyć długo lecieć z tą samą prędkością, co jest niemożliwe przez opór powietrza
Nie wyleciałaby w kosmos ponieważ nie ma takiej broni palnej, która wyrzuciłaby kule z prędkością przynajmniej 11,19 km/s.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.