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(katPI/180)**

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

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=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.

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