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

Mały hosting, OGROMNE możliwości
+10 głosów
1,960 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 1,813 wizyt
pytanie zadane 13 września 2016 w C i C++ przez prownnie Początkujący (280 p.)
0 głosów
2 odpowiedzi 409 wizyt
pytanie zadane 16 maja 2020 w C i C++ przez oski. eskimoski Początkujący (380 p.)
0 głosów
1 odpowiedź 359 wizyt
pytanie zadane 8 kwietnia 2016 w C i C++ przez Munvik Dyskutant (9,350 p.)

93,718 zapytań

142,631 odpowiedzi

323,262 komentarzy

63,266 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...