2009-11-06 4 views
6

마우스의 마지막 위치와 현재 위치를 기준으로 마우스 방향 (왼쪽, 오른쪽, 위, 아래)을 얻을 수 있습니까? 두 벡터 사이의 각도를 계산하는 코드를 작성했지만 올바른지 확실하지 않습니다.마우스 좌표에서 기본 마우스 방향을 얻는 방법

나를 올바른 방향으로 안내해 줄 수 있습니까?

public enum Direction 
    { 
     Left = 0, 
     Right = 1, 
     Down = 2, 
     Up = 3 
    } 

    private int lastX; 
    private int lastY; 
    private Direction direction; 

    private void Form1_MouseDown(object sender, MouseEventArgs e) 
    { 
     lastX = e.X; 
     lastY = e.Y; 
    } 
    private void Form1_MouseMove(object sender, MouseEventArgs e) 
    { 
     double angle = GetAngleBetweenVectors(lastX, lastY, e.X, e.Y); 
     System.Diagnostics.Debug.WriteLine(angle.ToString()); 
     //The angle returns a range of values from -value 0 +value 
     //How to get the direction from the angle? 
     //if (angle > ??) 
     // direction = Direction.Left; 
    } 

    private double GetAngleBetweenVectors(double Ax, double Ay, double Bx, double By) 
    { 
     double theta = Math.Atan2(Ay, Ax) - Math.Atan2(By, Bx); 
     return Math.Round(theta * 180/Math.PI); 
    } 
+0

저는 각도 방법이 정확하지 않다고 말하기까지했습니다. 두 벡터의 각도 차이는 점이 이동 한 실제 방향 (데카르트 평면에서)에 대해서는 알려주지 않습니다. –

+0

마우스 지터를 수용하려고합니까? - 예를 들어 사용자가 100 픽셀을 오른쪽으로 일관되게 이동했지만 중간 픽셀이 몇 픽셀 정도 앞뒤로 움직이면 전체 사진이 그렇지 않기 때문에 실수로 그 지터를 샘플링하고 다른 방향으로 가고 싶지는 않습니다. 그 결론에 도움이된다 –

+0

아니, 나는 형태의 이미지가 마우스의 방향을 따라야하는 게임을 writting하고있다 – Ioannis

답변

12

각도 계산이 지나치게 복잡해 보입니다. 다음과 같이하면 안됩니다.

int dx = e.X - lastX; 
int dy = e.Y - lastY; 
if(Math.Abs(dx) > Math.Abs(dy)) 
    direction = (dx > 0) ? Direction.Right : Direction.Left; 
else 
    direction = (dy > 0) ? Direction.Down : Direction.Up; 
+0

당신의 도움에 당신에게 모두 감사드립니다 - 이것은 잘 작동합니다 – Ioannis

5

각도를 계산할 필요가 없습니다. 두 지점 P1과 P2가 주어지면 P2.x> P1.x인지 확인하고 왼쪽 또는 오른쪽으로 갔는지 확인할 수 있습니다. 그런 다음 P2.y> P1.y를보고 위 또는 아래로 갔는지 알 수 있습니다.

그런 다음 델타의 절대 값 중 큰 값, 즉 abs (P2.x - P1.x)와 abs (P2.y - P1.y) 중 더 큰 값을 확인하십시오. "더 수평 적"또는 "더 수직적"으로 설정 한 다음 상향으로 올라간 것이 상향 또는 상향되었는지를 결정할 수 있습니다.

0

대략적으로 말하면, 최종 위치와 현재 위치 사이의 수평 이동 (X 좌표의 차이)의 크기 (절대 값)가 수직 이동의 크기 (절대 값)보다 큰 경우)를 마지막 위치와 현재 위치 사이에 놓으면 이동이 왼쪽 또는 오른쪽입니다. 그렇지 않으면 위 또는 아래입니다. 그런 다음 이동 방향의 부호를 확인하여 이동이 위 또는 아래 또는 왼쪽 또는 오른쪽인지 알려줍니다.

각도를 염려 할 필요는 없습니다.

1

0,0은 왼쪽 상단입니다. 현재 x> last x이면 올바르게 진행됩니다. 현재 y> last이면 현재 다운됩니다. 각도를 계산할 필요가 없다. 단지 \ up, down \ left에 관심이 있다면.

관련 문제