문제

마우스 마지막 위치와 현재 위치에 따라 마우스 방향 (왼쪽, 오른쪽, 위, 아래)을 얻을 수 있습니까? 두 벡터 사이의 각도를 계산하기 위해 코드를 작성했지만 그것이 옳은지 확실하지 않습니다.

누군가 나를 올바른 방향으로 가리킬 수 있습니까?

    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);
    }
도움이 되었습니까?

해결책

각도를 계산하는 것은 지나치게 복잡해 보입니다. 왜 다음과 같은 일을하지 않겠습니까?

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;

다른 팁

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

그런 다음 델타 사이의 절대 값 중 더 큰 값, 즉 ABS (P2.X -P1.X) 및 ABS (P2.Y -P1.Y)를 살펴보고 "더 큰 수평"인지 여부를 알려줍니다. 또는 "더 수직"이면 왼쪽 위로 올라간 것이 올라 갔는지 여부를 결정할 수 있습니다.

0,0은 왼쪽 상단 코너입니다. 현재 x> Last X 인 경우 제대로됩니다. 현재 y> 마지막 y 인 경우, 당신은 내려갑니다. Up Down, Left 오른쪽에 관심이있는 경우 각도를 계산할 필요가 없습니다.

대략적으로 말하면, 마지막 위치와 현재 위치 사이의 수평 이동 (x 좌표 차이)의 크기 (절대 값)가 마지막 위치 사이의 크기 (절대 값)보다 큰 경우 (마지막 위치 사이의 y 좌표) 위치와 전류 위치, 그런 다음 움직임이 왼쪽 또는 오른쪽입니다. 그렇지 않으면 위 또는 아래입니다. 그런 다음 움직임 방향의 표시를 확인하여 움직임이 위 또는 아래로 또는 왼쪽 또는 오른쪽인지 알려주는 것입니다.

각도에 대해 걱정할 필요는 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top