2011-01-30 2 views
6

정확히 마우스를 놓을 순간에 마우스의 순간 수직 속도를 어떻게 찾을 수 있습니까? 사용자가 사용자 지정 컨트롤을 드래그하여 놓았을 때 나는이 정보를 알고 있으므로 속도의 수직 구성 요소를 사용하여 끌고있는 개체를 계속할 수 있습니다.C에서 마우스의 속도 찾기

예를 들어 드래그하는 경우 각도로, trig를 사용하여 수직 속도를 결정한 다음 사용하십시오.

마우스가 불규칙한 속도로 움직일 수 있기 때문에 시간이 지남에 따라 거리가 멀어지며 이는 정확한 속도를 나타내지 않습니다.

내가 사용할 수있는 MouseMove 트리거 사이에 특정 간격이있을 수 있지만 확실하지는 않습니다.

답변

8

마우스를 놓은 정확한 순간에 마우스의 순간 수직 속도를 어떻게 찾을 수 있습니까?

수 없습니다. Zeno는 수세기 전에 분명 했으므로 속도는 일정 기간 동안 의미가 있습니다. 만약 내가해야만한다면, 아마도 가중 이동 평균을 사용할 것입니다. 그래서 (예를 들어) 지난 5 번의 마우스 이동 메시지 각각에 대해 거리/시간을 계산했지만 그 중요성은 시간이 지남에 따라 "부패"했습니다. 예를 들어, 가장 최근에 1을 곱하고, 다음에 .8을 곱하고, 다음에 .6을 곱하는 등의 작업을 수행 할 수 있습니다. 이 방법으로 (예를 들어) 버튼을 놓을 때처럼 움직임을 느리게하는 경우 (또는 속도를 높이면) 의 합리적인 근사값을 얻을 수 있습니다. 바로 이전에이었습니다.

+0

Zeno가 수학을하기 전에 의견을 말한 것으로 생각합니다. Btw,이 경우에는 이산 시간 단계가 있습니다. – stefan

+0

@stefan : 정확히 무슨 말을하는 것 같습니까? –

+0

@ Jerry Coffin 시간 프레임이 필요하다고해서 버튼을 놓은 순간의 속도는 말할 수 없다는 것을 의미하지는 않습니다. 그것은 시간 = 0이나 시간 <0에 결코 일어나지 않을 것입니다. 그럴 순 없어! 그래서 당신은 다른 어느 때보다도 프리티 (prety)가 남아 있고, 수학은 당신을 위해서 트릭을 할 것입니다. ps 현대 "마우스"는 2 차원 픽셀 좌표 공급 장치가 아닙니다. – stefan

0

당신은 내가 u는 더 나은 U 스위트 룸 곡선의 끝 부분에 약간의 짧은 시간을 보시기 바랍니다 미적분

에 수 없습니다 거리 - 시간 곡선에서 곡선의 끝에서 속도를 계산하기 위해 요구하는 최고 속도와 거의 같을 속도를 계산하십시오

1

내가하는 것은 마우스 움직임을 지속적으로 샘플링하고 마지막 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; 
     } 
    } 
} 
5

GetMouseMovePointsEx()를 고려해야합니다. 최대 64 점까지 이동할 수 있습니다. 각 포인트에는 타임 스탬프가있어 속도를 정확하게 계산할 수 있습니다. 타임 스탬프는 메시지 큐에 버퍼링 된 마우스 이동 메시지로 인한 지연으로 인해 영향을받지 않으므로 훨씬 정확합니다. 또한 픽셀 대신 기본 마우스 단위로 포인트를 얻을 수 있습니다. 선언에 대해서는 pinvoke.net을 방문하십시오.

+0

나는이 일을 시도했지만 몇 가지 문제가 발생했습니다. 내 질문 [GetMouseMovePointsEx : 경계/MOUSEMOVEPOINT (mp_in) 문제] 참조하십시오 (http://stackoverflow.com/q/25170813/2596334). –