Rotacja obiektu względem vectora

Rotacja obiektu względem vectora
Kamil9132
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 173
0

Witam
W jaki sposób mogę uzyskać kąt rotacji obiektu względem vectora 2D?
Np.
1. Vec = [1,0], Rotation = 90
2. Vec = [0,1], Rotation = 180
3. Vec = [2,3], Rotation = ?
user image

abrakadaber
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6610
0

matematyki w szkole nie miałeś? Nie wiesz co to sinus/cosinus?

Kamil9132
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 173
0

Matematykę miałem i nadal mam, jednak trygonometrię zaczęliśmy pod koniec ubiegłego roku i w tym będziemy ją kończyć (II klasa liceum).

Poszukałem trochę i funkcję napisałem, jednak obiekty znajdujące się po przeciwnej stronie są zwrócone tyłem.
Co w poniższym kodzie jest błędne?

Kopiuj
            float V_X = Enemy_B.get(Target).GetX() - X;
            float V_Y = Enemy_B.get(Target).GetY() - Y;
            float Distance = (float)Math.sqrt(V_X * V_X + V_Y * V_Y);
            float Percent = (Speed * Time) / Distance;

            X += V_X * Percent;
            Y += V_Y * Percent;

            float Tan = V_Y / V_X;

            Rotation = (float)Math.toDegrees(Math.atan(Tan));

Enemy_B.get(Target).GetX() - Współrzędna X przeciwnika
Enemy_B.get(Target).GetY() - Współrzędna Y przeciwnika
X - Współrzędna X pocisku
Y - Współrzędna Y pocisku

user image

Sopelek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 467
0

Nie wiem czy do końca rozumiem to co napisałeś i ten obrazek, ale chyba wystarczy, że odwrócisz współrzędną y przed wyliczeniem Tan.
Po prostu możesz mieć inny układ współrzędnych (zwroty osi) niż framework/biblioteka, którą rysujesz.

Kamil9132
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 173
0

Odwrócenie współrzędnej Y nie pomogło, jednak znalazłem prosty sposób na rozwiązanie problemu:
if (V_X >= 0) Rotation += 180;

  • Rejestracja: dni
  • Ostatnio: dni
MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
1

kąt między dwoma wektorami liczy się tak:

Kopiuj
atan2(ax*by-ay*bx, ax*bx+ay*by)

Mogłem pochrzanić znaki.
http://www.cplusplus.com/reference/cmath/atan2/

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1

Wg mnie wystarczy tak:

Kopiuj
Rotation=Math.toDegrees(Math.atan2(Enemy_B.get(Target).GetY()-Y,Enemy_B.get(Target).GetX()-X));

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.