Autor Wątek: Kat miedzy dwoma wektorami  (Przeczytany 1193 razy)

Offline Frondeus

  • Użytkownik

# Maj 15, 2011, 14:57:28
Witam. Staram się stworzyć funkcje która wykryje gdy myszka zmieni diametralnie zmieni swój kierunek.
Lecz nie jestem pewien czy robie to właściwie  - jeśli chodzi o wektory jestem samoukiem , w szkole miałem tylko na fizyce jak je rysować i nic wiecej. Gdy funkcja wykryje roznice - narysuje punkt w tym miejscu.

Najpierw tworzę Delte pozycji myszki:
static int OldX = X;
static int OldY = Y;
int DX = X - OldX;
int DY = Y - OldY;

OldY = Y;
OldX = X;
Otrzymuje wektor predkosci myszki.
Nastepnie wyznaczam jego długośc:
 float LD = sqrt((DX * DX) + (DY * DY));
Nastepnie myślałem aby stworzyć delte delty - gdzie oldDX byłby aktualizowany przy tworzeniu kropki.
static int OldDX = DX;
static int OldDY = DY;
int DDX = DX - OldDX;
int DDY = DY - OldDY;

[.. to podam zaraz]
if(abs(KAT > 10))
{
OldDX = DX;
OldDY = DY;
RYSUJPUNKT(X,Y);
}
Wyznaczyłem też delty odległość:
float LD2 = sqrt((DDX * DDX) + (DDY * DDY));
float LD3 = (LD * LD2);
oraz przemnazylem ją przez odległość 1.

Nastepenie obliczyłem kąt:
float KAT = 0;
if(LD3 != 0) KAT = acos(((DDX * DX) + (DDY * DY))/LD3);

Zgodnie ze wzorem:
cos alpha = w*w2 / |w| * |w2|
gdzie w*w2 to iloczyn skalarny.

Niestety z tego co zauważyłem wychodzi kąt NAN.
Siedzę już nad tym trochę czasu, próbowałem od nowa pisać, lecz nie wiem gdzię popełniłem błąd.
Może w ogóle da się to zapisać szybko i schludnie a ja ide na około?

Z gory dziekuje za pomoc.

Offline Mr. Spam

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

Offline bartekm

  • Użytkownik
    • Wordpress Blog

# Maj 15, 2011, 16:16:07
Żeby policzyć jak szybko zmienił się ruch myszki musisz mieć dwa wektory ruchu myszy - jeden z aktualnej klatki i jeden z poprzedniej. Potem sprawdzasz ich iloczyn skalarny. Jeśli jest równy 1 to oznacza, że mysz nie zmieniła kierunku (tzn. wektory są równoległe i zwrócone w tą samą stronę). Jeśli iloczyn jest mniejszy od 1 to oznacza, że wektory są nachylone trochę pod kątem (zmienił się kierunek). Nie trzeba liczyć żadnych cosinusów.

Offline Frondeus

  • Użytkownik

# Maj 15, 2011, 17:43:18
Hym ale da się w ten sposób "wytłumić" nieznaczne ruchy myszką?  Bo chyba linijki do tabletu nie bede używać :D
Liczą dla mnie się większe zmiany kąta np o 10 gdzie wektor jest mocno różniący się od poprzedniego.

Offline Xirdus

  • Redaktor

# Maj 15, 2011, 17:51:54
No np. sprawdzasz czy iloczyn jest mniejszy niż 0.9

Offline Frondeus

  • Użytkownik

# Maj 15, 2011, 18:31:32
Dzieki :) Działa :D