2011-01-30 21 views
6

come posso trovare la velocità verticale istantanea del mouse sul esatto momento che il mouse viene rilasciato? ho gli utenti che trascinano un controllo personalizzato e quando rilasciano ho bisogno di sapere queste informazioni così posso continuare l'oggetto che stavano trascinando usando il componente verticale della velocità ...Trovare la velocità del mouse in C#

quindi, per esempio, se stavano trascinando ad angolo, usa trig per determinare la velocità verticale e poi usa quella ..

non posso fare solo la distanza nel tempo, perché il mouse può essere spostato a velocità irregolari e questo non rappresenta affatto la velocità corretta.

Stavo pensando che potrebbe esserci un intervallo specifico tra i trigger di MouseMove che potrei usare, ma non sono sicuro.

risposta

8

Come posso trovare la velocità verticale istantanea del mouse nel momento esatto in cui viene rilasciato il mouse?

Non è possibile. Come Zeno ha chiarito secoli fa, la velocità è significativa solo per un periodo di tempo. Se dovessi farlo, probabilmente userei una media mobile ponderata, così (per esempio) ho calcolato la distanza/tempo per ciascuno degli ultimi 5 messaggi movimento del mouse, ma la loro importanza è "decaduta" nel tempo. Ad esempio, potrei moltiplicare il più recente di 1, il successivo di .8, il successivo di .6 e così via. In questo modo se (ad esempio) capita di rallentare (o accelerare) il movimento proprio come rilasciare il pulsante, è ancora ottenere una ragionevole approssimazione di quello che erano fare proprio prima di quella.

+0

immagino Zeno ha fatto il commento prima di inveted matematica allora. A proposito, in questo caso hai un passo temporale discreto. – stefan

+0

@stefan: cosa pensi esattamente che stia parlando? –

+0

@Jerry Coffin Solo perché hai bisogno di frame temporali non significa che non puoi dire la velocità nel momento esatto in cui il pulsante viene rilasciato. Non accadrà mai al momento = 0 né al tempo <0. Non può! Quindi ti rimane molto prety in qualsiasi altro momento, e la matematica farà il trucco per te. ps un moderno "mouse" non è un apparato di alimentazione bidimensionale con coordinate pixel. – stefan

0

si sta chiedendo per calcolare la velocità alla fine della curva nella curva distanza-tempo che non è possibile nel calcolo

vi suggerisco u meglio prendere qualche breve periodo di tempo al termine della curva che suite u il meglio e calcolare la velocità sarebbe quasi la stessa

1

Quello che vorrei fare è campionare costantemente il movimento del mouse e tenere traccia di -say- le ultime 10 posizioni. Quindi, quando si rilascia il pulsante del mouse, si otterrebbe una serie di misurazioni che consentiranno di stimare la velocità del mouse quando il mouse viene rilasciato.

Ho scritto una rapida app Winform per giocare con questa idea. Questo calcola la velocità per ogni mossa del mouse. Hai bisogno di giocare con la lunghezza della coda.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Collections; 

namespace MouseVelocity 
{ 
    public partial class Form1 : Form 
    { 
     System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); 
     Queue timePoints; 

     public Form1() 
     { 
      sw.Start(); 
      timePoints = new Queue(100); 
      InitializeComponent(); 
     } 

     private void Form1_MouseMove(object sender, MouseEventArgs e) 
     { 
      addPoint(e); 
     } 

     private void addPoint(MouseEventArgs e) 
     { 
      timePoints.Enqueue(new TimePoint(new Point(e.X, e.Y), sw.ElapsedMilliseconds)); 
      if (timePoints.Count == 40) timePoints.Dequeue(); 
      object[] array = timePoints.ToArray(); 
      TimePoint tip = (TimePoint)array[array.Length - 1]; 
      TimePoint end = (TimePoint)array[0]; 
      long deltaX = tip.point.X - end.point.X; 
      long deltaY = tip.point.Y - end.point.Y; 

      long distance = deltaX * deltaX + deltaY * deltaY; 

      long deltaT = tip.time - end.time; 
      double velocity_modulo = Math.Sqrt(distance)/deltaT; 
      double velocity_X = deltaX/(double)deltaT; 
      double velocity_Y = deltaY/(double)deltaT; 
      label1.Text = string.Format("|V| = {0}; Vx = {1}; Vy = {2}", velocity_modulo, velocity_X, velocity_Y); 
     } 

    } 
    public class TimePoint 
    { 
     public Point point; 
     public long time; 

     public TimePoint(Point pt, long ms) 
     { 
      point = pt; 
      time = ms; 
     } 
    } 
} 
5

Prendere in considerazione il richiamo di GetMouseMovePointsEx(). Può darti la cronologia delle mosse fino a 64 punti. Ogni punto ha un timestamp, che consente di calcolare con precisione la velocità. Ti dà molta più precisione dal momento che il timestamp non è influenzato da eventuali ritardi dovuti al fatto che i messaggi di spostamento del mouse vengano memorizzati nella coda dei messaggi. E puoi ottenere punti in unità mouse native invece di pixel. Visita pinvoke.net per le dichiarazioni.

+0

Ho provato a farlo, ma ho incontrato alcuni problemi. Vedi la mia domanda [GetMouseMovePointsEx: Bound/MOUSEMOVEPOINT in (mp_in) problemi] (http://stackoverflow.com/q/25170813/2596334). –

Problemi correlati