Mierzenie dystansu pokonanego przez kursor.

0

Witam. Robię program, który podaje różne statystyki z obsługi komputera. Chciałbym zrobić opcje, która mierzy dystans jaki pokonała myszka. Wiem ze są takie programy, które to mierzą, mógłby mnie ktoś nakierować w jaki sposób? :)

Bardzo prosze o pomoc,
Pozdrawiam.

0

Wydaje mi się, że możesz mieć problem z zliczaniem dystansu myszki, ponieważ zależy to od czułości myszki i ustawień w Windows. Dużo prościej będzie zmierzyć odległość, jaką pokonał kursor. A przy okazji takie dane bywają ciekawe, chętnie zobaczyłbym je dla swojego komputera ;)

0
  1. Mouse.CursorPos
  2. sqrt(dxdx+dydy); // gdze dx:=X1-X2; dy:=Y1-Y2;
1

jak chcesz mieć w cm, m czy km to poczytaj co to jest DPI, jak je pobrać i jak się przelicza dystans w punktach na cale (do tego jest DPI) i ile mm ma jeden cal. Wszystko było tu na forum a i w google jest tego od metra

0

@furious programming po pierwsze nie da się zmierzyć dystansu jaki pokonuje mysz jako fizyczne urządzenie podpięte do kompa - jak ją ktoś podniesie i postawi metr dalej to co wtedy? A jak ktoś ma touchpada? albo trackballa? Co do tego kiedy mierzyć to nie wiem czy wiesz ale jak ruszasz myszą to w windowsie wysyłane są odpowiednie komunikaty - wystarczy je przechwycić. Wcale nie trzeba co 3 ms odczytywać położenia kursora i sprawdzać czy się nie zmieniło

1
abrakadaber napisał(a)

po pierwsze nie da się zmierzyć dystansu jaki pokonuje mysz jako fizyczne urządzenie podpięte do kompa - jak ją ktoś podniesie i postawi metr dalej to co wtedy?

@abrakadaber - oczywiście, że się da to obliczyć - trzeba tylko zmierzyć ile pikseli pokona kursor, jeśli przesunie się mysz o np. 1mm, co jest niemożliwe w ustaleniu uniwersalnego sposobu; Nie znam i pewnie nie poznam uniwersalnego sposobu dla każdej myszy na wszystkich komputerach i z różnymi konfiguracjami bo najprawdopodobniej nie są one ustandaryzowane, jednak dla swojej myszy potrafiłbym to obliczyć, bo mogę zmierzyć fizyczny dystans jaki pokona i obliczyć ilość pikseli; Więc się da, ale tylko dla własnej (pod warunkiem, że ma się mysz, a nie touchpad'a);

Np. czułość mojej myszy z obecną konfiguracją w idealnym linijkowym poziomie to ~100px/10mm (5 pomiarów), czyli ~10px/1mm, stąd mogę zmierzyć przybliżony dystans na bazie współrzędnych;

Pytacz napisał: "Chciałbym zrobić opcje, która mierzy dystans jaki pokonała myszka." - myszka, nie kursor myszy, a chyba każdy na tym forum wie jaka jest między nimi (ogromna) różnica, dlatego pytam czego to dystans ma być;

abrakadaber napisał(a)

jak ją ktoś podniesie i postawi metr dalej to co wtedy?

Dokładność pomiaru będzie taka sama, jak z licznikiem kilometrów w samochodzie - przecież nie można mieć pretensji o to, że do ilości przejechanych kilometrów nie zostaną dodane kilometry przejechane na lawecie;

Może i zadaje retoryczne pytania, jednak to nie my mamy domyślać się o co chodzi pytaczowi - to on musi zadawać takie pytania, żeby wszyscy go rozumieli i mogli sprawnie pomóc ;)

0

Wiadomo że chodzi o mierzenie kursora bo myszki się przecież nie da. Chodźby na touchpadzie te same odległości na płytce są inne na kursorze w zależności od nacisku lub prędkości poruszania palcem.

Właśnie zastanawialem się czy zrobić to łapiąc komunikaty tylko czy ktoś wie jak to działa, ja jeszcze nie testowałem.
Wydaje mi sie także że mierzenie tego w interwałach nie ma sensu, gdyż zapisując pozycje x,y w danej sekundzie, i w następnej również zapisując to obliczenia mogą być inne z racji że krsor mógł w tym czasie zawrócić ;) Można zrobić to w wątku i obliczać co kilka milisekud, no zobacze. a jak to jest z komunikatami? jak one sa wysyłane?

//edit
Z tego co sprawdziłem to nawet zwykła myszka (przynajmniej moja, zwykła) Także reagje na tempo poruszania się nią. przesuwając powoli kursor pokonuje mniejsza odległość na ekranie względem pokonanej odległości myszki na blacie.

0

nie co każdy. To jest dokładnie to samo co dostaniesz w zdarzeniu onMouseMove dla formy - wstaw sobie np. memo i w obsłudze tego zdarzenia zapisuj położenie X i Y myszki + wyliczony dystans (po przednie XY do aktualnego XY). Zobaczysz, że im wolniej poruszasz myszką tym "dokładniejsze" (co mniejszą ilość pikseli) dostaniesz komunikaty. Jednak nie ma się co tym przejmować bo są to dane, które dostaje cały system i każda aplikacja, która je potrzebuje i nie ma żadnych magicznych sposobów aby dostawać informację o zmianie co 1px. Najważniejsze to zapamiętać ostatnią pozycję, po przyjściu kolejnego komunikatu obliczyć odległość i dodać do sumy oraz zapamiętać aktualną pozycję jako ostatnią i tak dalej aż do końca prądu w gniazdku.

0

no chyba to jedyna sensowna metoda, dzisiaj ja sprawdze. Dzieki za porady :)

0
_13th_Dragon napisał(a):

Mouse.CursorPos

sqrt(dxdx+dydy); // gdze dx:=X1-X2; dy:=Y1-Y2;

Nie bardzo rozumiem jak to wykorzystać, mógłbyś jakoś to wyjaśnić? pokombinowałem jednak mi nic sensownego nie wychodzi.

// Edit:

Ok zrobiłem i działa pięknie. Dziekuję wszystkim za pomoc i sugestie, szczególnie _13th_Dragon za nakierowanie oraz szopenfx za nakierowanie nakierowania :), Kod:

     GetCursorPos(Kursor);
     x1 := kursor.X;
     y1 := kursor.Y;
     wynik := wynik + Round( Sqrt( Sqr(x2-x1) + Sqr(y2-y1)) );
     x2 := x1;
     y2 := y1;
3
//W klasie:
P:TPoint;
Distance:Double;

//W metodzie:
var Q:TPoint;

Q:=Mouse.CursorPos;
Distance:=Distance+sqrt(sqr(P.X-Q.X)+sqr(P.Y-Q.Y));
P:=Q;

1 użytkowników online, w tym zalogowanych: 0, gości: 1