Autor Wątek: Ruch po okręgu  (Przeczytany 3057 razy)

Offline tomaszwir

  • Użytkownik

# Lipiec 29, 2013, 14:58:18
Witam!

Żeby uzyskać ruch po okręgu wystarczy coś takiego:
x += 1 * cos( rad * 3.14 );
y += 1 * sin( rad * 3.14 );
Ale jak uzyskać ruch po określonym promieniu ?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Xirdus

  • Redaktor

# Lipiec 29, 2013, 15:15:28
x = r * cos(k*t);
y = r * sin(k*t);
Gdzie r to promień, k to prędkość kątowa, a t to czas. A jak koniecznie musi być inkrementacyjnie, to zapisz se wektor kierunku i obracaj go o stały kąt co klatkę, czy jak tam chcesz.

Offline tomaszwir

  • Użytkownik

# Lipiec 29, 2013, 17:02:33
Dzięki, ale jak chcę uzyskać kąt z położenia, to muszę skorzystać z funkcji acos lub a sin albo z jednej i drugiej jednocześnie:

Skoro tak wygląda ruch po promieniu:
x = r * cos(k*t);
y = r * sin(k*t);
To tak powinno wyglądać określenie kąta na podstawie pozycji:
acos(x/t)/r = k;
asin(y/t)/r = k;
Zgadza się ? Tylko jest przypadkiem tak że wartość k może być różna dla jednakowej pozycji ? Jeżeli punt jest ka górze lub na dole wartość x jest taka sama dla tych dwóch położeń, jak to odróżnić ?

Offline koirat

  • Użytkownik

# Lipiec 29, 2013, 17:22:08
Jeśli:
x = r * cos(k*t)

to:
x / r = cos(k*t)
acos(x/r) = k*t
k = acos(x / r) / t

k to prędkość kątowa, a nie jakaś tam wartość k.
« Ostatnia zmiana: Lipiec 29, 2013, 17:25:01 wysłana przez koirat »

Offline bagiet

  • Użytkownik

# Lipiec 29, 2013, 17:28:38
Z tego co rozumiem, to chcesz znaleźć kąt, a nie prędkość kontową, więc szukasz k*t, a nie k. Możesz to zrobić przy pomocy atan2 (który zwróci faktyczny kąt z przedziału (-pi, pi])

http://www.cplusplus.com/reference/cmath/atan2/

Offline tomaszwir

  • Użytkownik

# Lipiec 29, 2013, 17:37:36
Chodzi mi o to że ustawiam sobie na okręgu w jakimś miejscu punkt, i chcę poruszać tym punktem po tym okręgu, więc najpierw muszę wyliczyć kąt a później poruszać tym punktem

Offline Xender

  • Użytkownik

# Lipiec 29, 2013, 17:46:22
Dzięki, ale jak chcę uzyskać kąt z położenia, to muszę skorzystać z funkcji acos lub a sin albo z jednej i drugiej jednocześnie:
Atan2. Jeśli w ogóle potrzebujesz tego kąta - jeśli wystarczy jedynka trygonometryczna, to nie katuj procka.
https://fgiesen.wordpress.com/2010/10/21/finish-your-derivations-please/

A jak koniecznie musi być inkrementacyjnie, to zapisz se wektor kierunku i obracaj go o stały kąt co klatkę, czy jak tam chcesz.
Warto dodać, że jeśli krok jest stały, to nie trzeba liczyć cały czas sin i cos, wystarczy odpowiednie mnożenie.

Chodzi mi o to że ustawiam sobie na okręgu w jakimś miejscu punkt, i chcę poruszać tym punktem po tym okręgu, więc najpierw muszę wyliczyć kąt a później poruszać tym punktem
Ale na jakim okręgu i skąd ten kąt, ew. jak wyznaczasz punkt? W tym zdaniu są 3 symbole i 2 niewiadome, trochę nie wiadomo, co chcesz osiągnąć.

Offline tomaszwir

  • Użytkownik

# Lipiec 29, 2013, 17:48:36
Już tłumaczę, mam pewien okrąg o stałym promienu r, ustawiam sobie na nim pewien punkt w pozycji x, y, i teraz chcę poruszać tym punktem w stałej prędkości po tym okręgu od miejsca w którym ustawiłem ten punkt.

Offline bagiet

  • Użytkownik

# Lipiec 29, 2013, 17:53:41
Nie trzymaj w ogóle pozycji x, y swojego punktu. Zamiast tego trzymaj sam kąt (teta) i co klatkę zwiększaj go o jakąś tam prędkość kątową k. Współrzędne kartezjańskie wyliczasz potem tylko przy rysowaniu:
x = c_x + r * cos(teta);
y = c_y + r * sin(teta);
gdzie c_x, c_y to współrzędne środka okręgu.

Offline Xender

  • Użytkownik

# Lipiec 29, 2013, 17:57:09
Jeśli środek okręgu jest środkiem układu współrzędnych, to tu masz wzór (w wersji macierzowej i skalarnej):
https://en.wikipedia.org/wiki/Rotation_matrix#In_two_dimensions

Jeśli środek okręgu nie jest środkiem układu, to musisz odjąć od punktu współrzędne środka okręgu, dokonać obrotu tym wzorem, i z powrotem dodać współrzędne środka okręgu - innymi słowy, należy przejść z przestrzeni świata do przestrzeni okręgu, dokonać tam rotacji i wrócić do przestrzeni świata. Kolejność dokonywania tych transformacji mapuje się 1:1 na kolejność mnożenia macierzy.

Offline tomaszwir

  • Użytkownik

# Lipiec 29, 2013, 17:57:59
@bagiet Tak, tylko że na wejściu mam pozycję x i y a ten własnie kąt (teta) muszę wyliczyć.

Offline tomaszwir

  • Użytkownik

# Lipiec 29, 2013, 18:22:51
@Xender Więc, mam jakąś pozycję która znajduje się na okręgu pos(x, y), promień wynosi r = 50

Obliczam kąt teta:
teta = acos(pos.x / r);
// Jeżeli okrąg nie znajduje się w środku układu
teta = acos( (pos.x- okrag.x) / r);
Tylko czy asin nie jest też potrzebne ?

I teraz już normalnie liczę położenie:
x = r * cos(teta*t);
y = r * sin(teta*t);

Offline bagiet

  • Użytkownik

# Lipiec 29, 2013, 18:42:43
Nie. Jeżeli na początku masz swój punkt na pozycji (x0, y0), to żeby znaleźć początkowy kąt, używasz funkcji atan2 (o której wcześniej wspominaliśmy). A przy wyliczaniu x i y nie mnożysz już niczego przez czas...

Xender dał ci inny sposób: trzymasz pozycję punktu w wektorze i co klatkę obracasz ten wektor o stały kąt (jeżeli używasz fixed time step). Wtedy operujesz tylko współrzędnymi kartezjańskimi. Rotację wektora uzyskuje się poprzez przemnożenie go przez odpowiednią macierz obrotu, wszystko jest ładnie opisane w tym artykule na wiki.

Offline Adam27

  • Użytkownik

# Lipiec 29, 2013, 18:54:07
x = pos.x - srodek_okregu.x;
y = pos.y - srodek_okregu.y;
kat = atan2(y, x); //w radianach

kat += dt;
pos.x = cos(kat) * promien + srodek_okregu.x;
pos.y = sin(kat) * promien + srodek_okregu.y;

Pisane z głowy, może nie działać ;)

Offline tomaszwir

  • Użytkownik

# Lipiec 29, 2013, 19:33:25
Ok działa, dzięki za pomoc. Ale teraz mam inne pytanie, a dokładniej jak uzyskać wektor przemieszczenia tego punktu, nie chcę tutaj korzystać z macierzy, jak na podstawie kąta uzyskać taki wektor ?
vec.x = cos(kat) * dlugosc_wektora;
vec.y = sin(kat) * dlugosc_wektora;
Wektor przemieszczenia ma swój początek w miejscu położenia punktu a jego koniec oznacza wartość przemieszczenia i jest on równoległy/przylegający do kierunku przemieszczenia, więc dlugosc_wektora oznacza wartość przemieszczenia, ale to nie jest ważne chodzi o to jak uzyskać taki wektor ?