Laden...

zurückgelegte Strecke der Maus

Erstellt von Lyserg vor 18 Jahren Letzter Beitrag vor 18 Jahren 6.282 Views
L
Lyserg Themenstarter:in
14 Beiträge seit 2005
vor 18 Jahren
zurückgelegte Strecke der Maus

Guten Tag,
schreibe derzeitig aus Lust und Laune ein Programm welches eine STatistik über meine Benutzung der Maus führt.

Nun bräucht ich aber ne ordentliche Rechnung für den zurückgelegten Weg.

Zum Programm erst mal:
Ich benutze einen Timer mit nem Value von 50 (schätze mal Millisekunden >.>), welcher dann nach Ablauf der Zeit jedes Mal ein Event aufruft, wo Mausposition ect. abgefragt wird und dann auch die Rechnung für die zurückgelegten Pixel enthält. Einige Variablen wie Laufzeit des Programms, Anzahl Klicks und zurückgelegte Strecke werden in eine Variable gespeichert.

Als derzeitigen Weg nutze ich: Zurückgelegte Strecke Y + Zurückgelegte Strecke X

Vorher hab ichs mit dem Pythagoras versucht 😉, glaub auch nicht ganz funktioniert.

So schon Mal Danke ^^

S
8.746 Beiträge seit 2005
vor 18 Jahren

Um den Pythagoras kommt du m.E. nicht drumrum. Wo war das Problem?

Und wie ist eigentlich die Frage?

Ansonsten. Ich würde einen globalen Mouse-Hook einrichten, der sämtliche Mausbewegungen in dein Programm leitet. Dein Timer produziert in jedem Fall Streckenverlust wegen der Quantisierung.

N
750 Beiträge seit 2004
vor 18 Jahren

hab mal ne allgemeine frage:

was "misst" du denn?
zurückgelegte mm? inch? pixel??

ansonsten denke ich das dir nur der gute alte Pythagoras helfen wird.

?( wer suchet, der findet auch! :]

L
Lyserg Themenstarter:in
14 Beiträge seit 2005
vor 18 Jahren

Sicher wirds kein Streckenverlust geben 😉. Eher zuviel, da man auch ebend schräg gehen kann und das im grunde ja nur eine pixelbewegung wär statt 2 pixel.
Zudem werden die alten Positionen der Maus gespeichert und bei Aufruf des Events nach Änderung abgefragt und wenn Position geändert wurden, halt die Strecke berechnet wird.
Werds nochmal mittem Pythagoras versuchen. Hab die ZEile dafür immerhin ja nur auskommentiert.

Messen tue ich die pixel 😉, da es bei cm/inch ect. nicht genau genug werden würde.

S
8.746 Beiträge seit 2005
vor 18 Jahren

Ich meinte eher, dass dein Timer tendenziell dazu führt, dass du bestimmte Bewegungen verpaßt. Besser ist es, wirklich jede Änderung, die auch Windows erkennt, direkt zu verarbeiten. Arbeite auf der besten Datengrundlage und du bekommst das beste Ergebnis. Dein Ansatz geht zwar auch irgendwie, ist aber suboptimal.

1.271 Beiträge seit 2005
vor 18 Jahren

Ich würds auch mit Mouse-Hook und Pythagoras machen. Pseudocode:
Funktion GlobalMouseHook
Strecke zwischen letztem Punkt und aktuellem Punkt berechnen (Pythagoras)
errechnete Strecke an Gesamtstrecke anfügen
aktuellen Punkt als letzten Punkt speichern
Ende Funktion

A wise man can learn more from a foolish question than a fool can learn from a wise answer!
Bruce Lee

Populanten von Domizilen mit fragiler, transparenter Außenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
Wer im Glashaus sitzt, sollte nicht mit Steinen werfen.

830 Beiträge seit 2005
vor 18 Jahren

Hallo,

korregiert mich, wenn ich mich irre, aber versagt Pythagoras nicht bei dieser Aufgabe?
Was ist, wenn die Maus in der Zeit eine Kurve beschreibt (ich weiss, nur bei sehr schneller Mausbeweugung möglich)? Die zurückgelegte Strecke ist doch etwas anderes als der Abstand von 2 Punkten in einer Ebene.

Oder:
Die Maus wird in 25ms von (0,0) nach (0,10) gezogen und in den weiteren 25ms von (0,10) nach (0,5). Dann ist die zurückgelegte Strecke 15 Pixel und nicht 5, oder ?

Gruss
Friedel

Ohne Ziel ist auch der Weg egal.

S
8.746 Beiträge seit 2005
vor 18 Jahren

Natürlich ist auch der Pythagoras hier nicht perfekt, aber auch Windows macht es ja nicht anders. Windows tastet eben die Maus alle paar ms (was auch immer) ab und macht gerade Bewegungen zwischen den beiden Korrdinaten bzw. positioniert einfach den Mauszieger neu . Ob du in dieser Zeit die Maus wirklich gerade bewegt hast weiss auch Windows nicht. Eine Kurve (generell die Bewegung) ergibt sich nur im Auge des Betrachters.

830 Beiträge seit 2005
vor 18 Jahren

Original von svenson
Ob du in dieser Zeit die Maus wirklich gerade bewegt hast weiss auch Windows nicht. Eine Kurve (generell die Bewegung) ergibt sich nur im Auge des Betrachters.

Will hier nicht kleinlich erscheinen, aber das interessiert mich.
Windows muss sich doch Pixel für Pixel die Mausposition "merken".
Wir haben einen Mauszeiger, dessen Position wir abfragen können, Windows nicht. Wenn die Maus bewegt wird, muss Windows das doch verfolgen (abfangen), oder nicht?
Was nützt es wenn Windows nur alle <50ms nach der Maus "schaut"? Es hat doch dann keine Ahnung, wie weit die Maus nach links/rechts, oben/unten verschoben wurde.
Das Zeichnen des Mauszeigers ist wiederum dann eine andere Sache.

Gruss
Friedel

Ohne Ziel ist auch der Weg egal.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Friedel,

ich denke es ist so, wie svenson sagt. Deine Problem sind m.E. nur Scheinprobleme.

herbivore

830 Beiträge seit 2005
vor 18 Jahren

Sorry, aber wenn der Titel "zurückgelegte Strecke der Maus" heisst, sind diese Antoworten so nicht richtig.
Richtig wäre "Abstand von zwei Mauspositionen berechnen".
Und was heisst hier Scheinprobleme ?
Habe oben geschrieben, es interessiert mich, mehr nicht. Habe nicht von Problemen gesprochen, oder.

Interessant könnte die Frage werden, wenn man sich überlegt wie das ein Zeichenprogramm realisiert. Da reicht Pythagoras nicht aus, es sei den man ist mit vielen zusammenhängenden Linien zufrieden.
In Paint, einem doch sehr einfachen Zeichen- (Mal-) Programm ist es egal wie schnell ich die Maus ziehe, die Pixel stimmen (aufs Pixel genau).

Das realisieren mit einem Timer ... ?

Gruss
Friedel

Ohne Ziel ist auch der Weg egal.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Friedel,

also Paint bestätigt svensons und meine Vermutung. Wenn man die Maus sehr schnell bewegt, kann man deutlich die geraden Abschnitte sehen, aus denen eine "Kurve" zusammengesetzt ist.

Scheinproblem war nicht böse gemeint. Mit Scheinproblem meinte ich nur, dass du Probleme siehst, wo keine sind, weil du von falschen Voraussetzungen ausgehst. Es gibt ja z.B. den Maustreiber, der auf unterster Ebene natürlich genauer die Kurve mitbekommt, die die Maus beschreibt. Aber Windows fragt nur zu bestimmten Zeiten ab und bekommt daher nur die pythagoräische Annäherung, die man auch in Paint sieht.

herbivore

S
8.746 Beiträge seit 2005
vor 18 Jahren

Nochmal zur internen Funktionsweise:

Jede Mausbewegung löst einen Interrupt im Maustreiber aus. In diesem Maus-Treiber werden die Pixelveränderungen gezählt und zu einem absoluten Wert verrechnet. Windows fragt nun von Zeit zu Zeit den Maustreiber ab (wenn Windows Zeit und Lust hat) und holt sich die absolute Position (aus Sicht des Maustreibers) und berechnet einfach die Differenz x/y zum Vorgängerwert. Diese Differenz bestimmt die Bewegung der Maus und damit die absolute Position des Mauszeigers (!) auf dem Bildschirm. Manchmal kann man dieses Verhalten sehr gut nachvollziehen, wenn man die Maus bewegt aber Windows gerade irgendwas macht und das System blockiert. Dann springt der Zeiger quer über den Schirm.

D.h. Windows (anders als der Treiber) hat nur eine Momentaufnahme der Mausbewegungen. Das ist schon aus Performancegründen notwendig, denn bei 800dpi ist die Zahl der Interrrupts enorm hoch (eben 800 Stück alle 2,54 cm). Die alle als Windows-Botschaften in das System zu bringen würde wohl noch ein paar GhZ mehr erfordern. 😉

Daher ist der Pythagros in Verbindung mit einem MouseHook die bestmögliche Implementierung. Damit bekommst du die Strecke, die die Maus auf dem Bildschirm vollzieht.

Wenn du noch besser sein willst, müßtest du dir einen eigenen Maustreiber schreiben. Da hättest du Zugriff auf wirklich jede Bewegung und könntest noch genauer messen. Würde aber ordentlich Systemlast ziehen.

830 Beiträge seit 2005
vor 18 Jahren

Danke für eure Antworten herbivore und svenson auf meine, in euren Augen vielleicht sinnlose, Frage. Freut mich das man trotzdem eine vernüftige Antwort bekommt, mit der man was anfangen kann.

Gruss
Friedel

Ohne Ziel ist auch der Weg egal.

L
Lyserg Themenstarter:in
14 Beiträge seit 2005
vor 18 Jahren

Danke für die Antworten 😉, werd mich wohl mal mit Mouse-Hooks beschäftigen müssen.
Und naja hab das Programm jetzt erstmal so erstellt das der Time nen Interval von 1 hat >.> und auch den Pythagoras erst mal reingenommen.

Hab im Grunde fast den gleichen Pseudocode wie progger es machen würde 😉, bis auf das er durch den Timer aufgerufen wird. Und lastet auch nicht das System aus.
Aber mal mit Mouse-Hooks rumprobieren.

Funktion GlobalMouseHook
Strecke zwischen letztem Punkt und aktuellem Punkt berechnen (Pythagoras)
errechnete Strecke an Gesamtstrecke anfügen
aktuellen Punkt als letzten Punkt speichern
Ende Funktion

S
8.746 Beiträge seit 2005
vor 18 Jahren

Hört sich wild an, sind aber nur ein paar Zeilen Code und du bekommst jede Maus-Bewegung, die Windows auch selbst erkennt. Der Rest deinen Codes bleibt so wie er ist. Der Timer ist dann natürlich obsolet. Du arbeitest ja dann ereignisgesteuert.

Das Lastverhalten wird sich allerdings ein wenig ändern: Wenn du die Maus viel bewegst, dann hast du viel Last, bewegest du die Maus gar nicht, macht dein Programm auch nix und produziert Null Last.

Die Timer-Variante erzeugt eine konstante Last unabhängig ob und wieviel bewegt wird.