• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed C++, SFML, Gra, matematy, fizyka, HARDY. Proszę o pomoc przy sterowaniu jednostka ;)

Object Storage Arubacloud
+10 głosów
1,639 wizyt
pytanie zadane 12 kwietnia 2015 w C i C++ przez szmq Pasjonat (22,770 p.)
zamknięte 13 kwietnia 2015 przez szmq

Witam, mam mały problem z obliczeniem ruchu jednostki pod danym kątem. Na początku pobieram rotacje tzn kąt. postać jest skierowana w góre równo z osią y i to jej punkt 0. Załóżmy, że mamy sytuacje iż nasza jednostka obraca się pod kątem 45(zgodnie ze wskazowkami zegara czyli w prawo). Kąt 45 przeliczamy na radiany. 45*3.14/180= 0.785 rad i w sumie nie wiem co zrobić dalej ponieważ muszę to podać w innych jednostkach. Cały kod który znalazłęm w necie wygląda tak: 

    

float rotacja = sprite.getRotation();
 
float vx = sin(( rotacja * M_PI ) / 180.0f );

float vy = -cos(( rotacja * M_PI ) / 180.0f );

sprite.move (speed*vx,speed*vy);

Wiem, że sin jest związany z osią x, a cos z y a jest ujemny ponieważ w programowaniu oś y zwiększa wartość w dół. Ale moje pytanie brzmi: Dlaczego sin odnosi wlasnie sie do x a cos do y? wiem ze sin=przypostokatna na przeciw kata a/przeciwprostokatna ale nie wiem co dalej z tego wywnioskowac. Zresszta sin(rad) wiec nie wiem jak sie do tego w ogole odniesc. I dlaczego w poruszaniu jest szybkość * sin załózmy a nie + czy / :) Liczę na dobrą odpowiedź :) Z góry dzięki :) 

komentarz zamknięcia: Rozwiązane :)

2 odpowiedzi

+2 głosów
odpowiedź 12 kwietnia 2015 przez Mateusz Dalgiewicz Mądrala (5,270 p.)
wybrane 12 kwietnia 2015 przez szmq
 
Najlepsza

Witam,

Postaram się wytłumaczyć to na przykładzie . Poniżej rysunek pomocniczy

Załózmy że twoja postać początkowo znajduje się w punkcie A o wspolrzednych (Xp=10, Yp=10)

Xp=10
Yp=10

Aby określic położenie postaci w innym miejscu musimy określic jakieś przesunięcie tej postaci. W twoim przypadku przesunięciem jest zmienna speed. W moim przykładzie jako speed jest przyjęte d. Założmy że:

speed = d = 1

oraz kąt poruszania się postaci do 45 stopni

B = 45 stopni

Do obliczenia wartości wspołrzednych po jakims przesunięciu służy taki wzór (Co wynika z funkcji trygonometrycznych)

dY =  d * cos(B)
dX = d * sin(B)

AXk = AXp + dX
AYk = AYp - dY 
(jest tutaj minus ponieważ wspołrzedne rosna w dół)

sin(45) = sqrt(2)/2 = 0,707
cos(45) = sqrt(2)/2 = 0,707

A więc postać po przesunięciu o 1 będzie znajdować się w pozycji

AXk = 10 + (1 * 0,707) = 10,707
AYk = 10 - (1 * 0,707) = 9,293

W twoim algorytmie speed określa (tak mi się wydaje) wektor przesunięcia tej postaci o jakąs wartość. Czyli np. jeśli zaprogramował byś poruszanie się postaci za pomocą strzałek będzie to działało w taki sposób, (nawiązując do powyższego przypadku) że trzymając np. klawisz starzałki do góry oraz w prawy bok odpowiednia funkcja będzie przeliczała wartośc przesunięcia o zadaną speed przez cały czas trzymania klawiszy i ustawiała postac po każdym obliczeniu wartości w nowej pozycji  ustalonej za pomocą powyższych wzorów .

To by bylo chyba wszystko :)
 

komentarz 12 kwietnia 2015 przez szmq Pasjonat (22,770 p.)

z jakiej definicji wychodzi wzór 

dY = d * cos(B) dX = d * sin(B) ? :)

komentarz 12 kwietnia 2015 przez Mateusz Dalgiewicz Mądrala (5,270 p.)

Z funkcji trygonometrycznych :

cos(przyprostokatna przy kacie do przeciprostokatnej)

cosB = dY/d (mnozymy obostronnie przez d aby obliczy dY)

dY = d * cosB

Analogicznie z drugim wzorem/

komentarz 12 kwietnia 2015 przez Mateusz Dalgiewicz Mądrala (5,270 p.)
Przeanalizuj to sobie na rysunku najlepiej
komentarz 12 kwietnia 2015 przez szmq Pasjonat (22,770 p.)
ok, dzięki wielkie :)
+3 głosów
odpowiedź 12 kwietnia 2015 przez Kabotyn Mądrala (5,650 p.)

Nie do końca jest tak jak napisałeś z tym sinusem. Sinus to funkcja trygonometryczna, jako argument przyjmuje wartość kąta między przyprostokątną a przeciwprostokątną, a z definicji

sin <alfa> = | przyprostokątna na przeciw kąta | / |przeciwprostokątna|

gdzie znaki ||  określają długość tych odcinków.

Jeszcze jedna informacja - radian to jest jednostka miary kąta, podobnie jak stopień. Analogicznie mozna to odnieść do tego jak np. cal i centymetr to są jednostki miary długości.

Wygląda na to, że potrzebujesz utrwalenia wiedzy z trygonometrii, nie wiem czy Wikipedia bedzie dobra ale zawsze coś na początek http://pl.wikipedia.org/wiki/Funkcje_trygonometryczne :)

 

Ale wracając do problemu. Twoja postać ma jakąś prędkość poruszania się. I np. jeżeli jest ustawiona do góry, i jej prędkość wyniesie np. 20 jednostek na sekundę, to po sekundzie będzie 20 jednostek wyżej.

A więc <pokonana droga> = <prędkość> * <czas>

Podobnie będzie jak Twoja postać bedzie ustawiona poziomo, będzie poruszała się np. w prawo. Przejdzie o 20 jednostek w prawo.

"Schody" zaczynają się, w przypadku gdy postać chce iść "na ukos", np. pod kątem 45 stopni, w stronę prawego górnego rogu ekranu. Jej prędkość nadal będzie wynosiła 20, przejdzie 20 jednostek, ale "na ukos". Przy pomocy funkcji trygonometrycznych (sin i cos) jesteś wstanie obliczyć ile jednostek przejdzie Twoja postać w pionie i poziomie (na ukos jest to 20 jednostek w sekundę).

I po to używasz sin i cos aby obliczyć o ile przesunie się postać po osi poziomej i pionowej, aby obliczyć jej nową pozycję i tam ją wstawić (bo postać wstawiasz w odpowiednich pozycjach x i y).

A teraz obrazek (z internetu, ja go nie robiłem).

Twoja postać porusza się z predkością v0 pod kątek 45 stopni (alfa), aby wiedzieć ile przeszedł na osi X i Y (aby obliczyć miejsce gdzie nalezy wstawić obrazek z postacią) należy obliczyć prędkości V0y i V0x (czyli "po osiach"). I włąsnie po to jest sin i cos w Twoim zapisie.

A przeliczania na radiany, w sin i cos robi się dlatego, że te funkcje w językach programowania najczęściej przyjmują kąty własnie w radianach.

Mam nadzieję, że się nie pomyliłem i mniej więcej jasno napisałem :)

komentarz 12 kwietnia 2015 przez szmq Pasjonat (22,770 p.)
z jakiej definicji to wynika?
komentarz 12 kwietnia 2015 przez Kabotyn Mądrala (5,650 p.)
Definicja funkcji trygonometrycznych, na wikipeddi  (link podałem) jest to opisane.

Podobne pytania

0 głosów
2 odpowiedzi 850 wizyt
pytanie zadane 13 września 2016 w C i C++ przez prownnie Początkujący (280 p.)
0 głosów
2 odpowiedzi 206 wizyt
pytanie zadane 16 maja 2020 w C i C++ przez oski. eskimoski Początkujący (380 p.)
0 głosów
1 odpowiedź 197 wizyt
pytanie zadane 8 kwietnia 2016 w C i C++ przez Munvik Dyskutant (9,350 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...