Frage

ist es möglich, die Maus, um Richtung zu bekommen (links, rechts, oben, unten), basierend auf der Maus letzte Position und die aktuelle Position? Ich habe den Code geschrieben, um den Winkel zwischen zwei Vektoren zu berechnen, aber ich bin nicht sicher, ob es richtig ist.

Kann mir bitte jemand in die richtige Richtung?

    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);
    }
War es hilfreich?

Lösung

den Winkel Computing scheint zu komplex. Warum nicht einfach so etwas wie:

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;

Andere Tipps

Ich glaube nicht, dass Sie den Winkel berechnen müssen. Gegeben sind zwei Punkte P1 und P2 können Sie überprüfen, um zu sehen, ob P2.x> P1.x und Sie wissen, ob es ging nach links oder rechts. Schauen Sie sich P2.y> P1.y und Sie wissen, ob es ging nach oben oder unten.

Schauen Sie sich die größere der absoluten Werte des Delta zwischen ihnen, dh abs (P2.x - P1.x) und abs (P2.y - P1.y) und je nachdem, was größer sagt Ihnen, ob es " mehr horizontal“oder‚mehr vertikal‘und dann können Sie entscheiden, ob etwas, das UP-LEFT ging, war UP oder links.

0,0 ist die obere linke Ecke. Wenn Strom x> letzte x, wirst du richtig. Wenn Strom y> letzten y, Sie gehen nach unten. Keine Notwendigkeit, den Winkel zu berechnen, wenn Sie in bis \ nur interessiert sind, unten, links \ rechts.

Grob gesagt, wenn der Betrag (Absolutwert) der horizontalen Bewegung (Differenz in X-Koordinaten), die zwischen der letzten Position und die aktuelle Position größer ist als der Betrag (Absolutwert) der vertikalen Bewegung (die Differenz in Y-Koordinaten) zwischen der letzten Position und der aktuellen Position, dann wird die Bewegung nach links oder rechts; nach oben oder unten sonst ist es. Dann alles, was Sie tun müssen, ist das Vorzeichen der Bewegungsrichtung zu überprüfen, Ihnen zu sagen, wenn die Bewegung nach oben oder nach unten oder nach links oder rechts.

Sie sollten nicht über Winkel besorgt sein müssen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top