Найти скорость мыши в C#

Как я могу найти мгновенную вертикальную скорость мыши на точно момент, когда мышь выпущена? у меня есть пользователи, перетаскивающие пользовательский элемент управления, и когда они выпускают, мне нужно знать эту информацию, чтобы я мог продолжить объект, который они перетаскивали, используя вертикальную составляющую скорости...

например, если они перетаскивались под углом, используйте trig для определения вертикальной скорости, а затем используйте что..

Я не могу просто сделать расстояние с течением времени, потому что мышь может перемещаться с нерегулярной скоростью, и это не будет представлять правильную скорость вообще.

Я думал, что между триггерами MouseMove может быть определенный интервал, который я мог бы использовать, но я не уверен.

4 ответов


Как я могу найти мгновенную вертикальную скорость мыши в тот самый момент, когда мышь выпущена?

вы не можете. Как Зенон ясно дал понять столетия назад, скорость имеет значение только в течение определенного периода времени. Если бы мне пришлось это сделать, я бы, вероятно, использовал взвешенную скользящую среднюю, поэтому (например) я вычислил расстояние/время для каждого из последних 5 сообщений о движении мыши, но их важность "распалась" со временем. Например, я мог бы умножить самое последнее на 1, затем обратно .8, следующий обратно .6, и так далее. Таким образом, если (например) они замедляют (или ускоряют) движение, как только они отпускают кнопку, вы все равно получаете разумное приближение того, что они были делать непосредственно перед этим.


рассмотрим pinvoking GetMouseMovePointsEx(). Это может дать вам историю перемещения до 64 очков. Каждая точка имеет отметку времени, позволяющую точно рассчитать скорость. Это дает вам гораздо больше точности, так как отметка времени не зависит от каких-либо задержек, которые вы можете получить от перемещения мыши сообщения буферизованы в очереди сообщений. И вы можете получить очки в собственных единицах мыши вместо пикселей. Визит pinvoke.net за декларации.


то, что я бы сделал, это постоянно пробовать движение мыши и отслеживать, скажем, последние 10 позиций. Затем, когда кнопка мыши отпущена, у вас будет массив измерений, который позволит вам оценить скорость мыши, когда мышь отпущена.

Я написал быстрое приложение winform, чтобы играть с этой идеей. Это вычисляет скорость для каждого движения мыши. Вам нужно играть с длиной очереди.

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;
        }
    }
}

вы просите рассчитать скорость в конце кривой в Кривой расстояния-времени, что невозможно в исчислении

Я предлагаю вам лучше взять короткий промежуток времени в конце кривой, который лучше всего подходит для U и рассчитать скорость, она будет почти такой же