Autor Wątek: Algorytm na obliczanie różnicy kątów  (Przeczytany 1150 razy)

Offline gmpro

  • Użytkownik

# Styczeń 23, 2010, 01:08:07
Podczas robienia nowej gierki przytrafił mi się mały problem z którym męczę się już trochę...
otóż chodzi mi o to że nie wiem jak obliczyć różnicę dwóch kątów
1. player
2. kąt kursora względem gracza
celem obliczania różnicy jest ustalenie czy dany kąt jest dostępny dla danego ustawienia gracza

problem w ogóle by się nie pojawił gdyby nie przeskok 360-0
obecnie korzystam z tego:

bActive = 0;

if((fPlayerAngle-90-fCursorAngle) < fMaxAttackAngle/2) { bActive = 1; }
if((fPlayerAngle+90-fCursorAngle) < fMaxAttackAngle/2) { bActive = 1; }

gdzie:
fPlayerAngle - kąt gracza (0-360)
fCursorAngle - kąt kursora względem gracza (0-360) wyliczane z funkcji atan2 przekonwertowane na stopnie
fMaxAttackAngle - dopuszczalna rozwartość kąta dostępności do ataku
bActive - dostępność

niestety ten algorytm nie działa ;/
« Ostatnia zmiana: Styczeń 23, 2010, 01:09:49 wysłana przez gmpro »

Offline Mr. Spam

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

Offline DrUiD

  • Użytkownik
    • HaCra Team

# Styczeń 23, 2010, 01:39:06
może po prostu przyjrzyj się iloczynowi skalarnemu: http://pl.wikipedia.org/wiki/Iloczyn_skalarny

miedzy dwoma wektorami zachodzą ścisłe zależności które pomagają rozwiązywać właśnie tego typu problemy w bardzo prosty sposób no i bez użycia 'złych' katów..
1) tworzysz 2 wektory: pierwszy będący osią główną twojej postaci, drugi od kursora do twojej postaci;
2) normalizujesz oba;
3) liczysz dot(A,B)>=0 ( 0 wzięło się z cos(90) )
4) jeśli spełniony warunek - masz co chciałeś - leży w zasięgu kątowym


PS. używanie kątów boli cale życie.. :-P

Offline gmpro

  • Użytkownik

# Styczeń 23, 2010, 04:42:19
Dzięki ale postanowiłem jednak użyć w tym projekcie kątów - wydaje mi się że bd wygodniejsze bo praktycznie co chwile bym musiał konwertować wektory na kąty ;]

Postawiłem na "być" a nie nie na "być wydajnie" <lol2>
i wymyśliłem to:
inline float DegLength(float fAlfa, float fBeta) {
float fLen = fabs(fAlfa - fBeta);

fAlfa -= 360;
if(fAlfa < -180) { fAlfa += 720; }
if(fabs(fAlfa - fBeta) < fLen) { fLen = fabs(fAlfa - fBeta); }

return fLen;
}
i podpiąłem sobie to tutaj:
if(DegLength(fPlayerAngle-90,fCursorAngle) < fMaxAttackAngle/2) { bStrength = true; }
if(DegLength(fPlayerAngle+90,fCursorAngle) < fMaxAttackAngle/2) { bStrength = true; }

i teraz działa ;] jestem happy...