Frage

sonst als harte Kante bekannt ist, ist dies eine Leitung, über die die Maus nicht überqueren können. Nützlich in Spielen und dergleichen.

Zur Zeit habe ich eine Funktion, dass die Renditen, wenn mein Mauszeiger in einem Polygon auf dem Bildschirm gezeichnet ist. Wenn dies nicht der Fall, ich meinen Cursor auf den zuletzt gespeicherten Punkt bewegen, die im Polygon war.

    if (!PointInPolygon(local, polyGon))
    {
        Cursor.Position = safePoint;
    }
    else
    {
        safePoint = Cursor.Position;
    }

Ich weiß nicht, wie dies für ein paar Gründe:

  • Durch langsame Aktualisierungszeiten oder aus irgendeinem Grund, ich bin manchmal in der Lage der Box auszubrechen. Diese speichert dann die Position als Sicherungspunkt außerhalb des Polygons. Die Maus wird dann in dieser Position fest.

  • Sloped Kanten sollten die Maus in der Neigungsrichtung pust. Drücken der rechte Maus againts eine „/“ geformte Wand mit dem Cursor in der oberen rechten Ecke enden soll. Aber aufgrund der Natur dieses Ansatzes geht über die Linie wird zurückgesetzt, um den Cursor auf, wo sie vorher war. Fortsetzung rechts drücken halten nur den Cursor Reseting, und es wird nicht schieben „den Hang hinauf.“

Gibt es andere Ansätze, dieses Problem zu lösen? Ich bin in erster Linie über die letzte Ausgabe besorgt: dieses Steigung Quer Verhalten das Hauptziel meines Programms ist und ich brauche es zum Laufen zu bringen. Auch wenn ich diese grundlegende Methode verwenden, irgendwelche Ideen für eine Optimierung des spezifischen Verhaltens?


EDIT:

Es wurde von Reed vorgeschlagen, dass ich stattdessen zu dem Punkt zurück, das am nächsten an dem aktuellen Out-of-bounds Punkt. In Anbetracht der vier Eckpunkte eines Vierecks, wie würde ich den nächsten Punkt in / an der Form finden?

War es hilfreich?

Lösung 3

  1. Sie die Gleichung der Randlinie, die beiden Endpunkte verwenden.
  2. -. (1 / Steigung) ergibt die Neigung der senkrechten Linie
  3. Löst für Geradengleichung von senkrechter Linie über die Kante des bekannten Punkt unter Verwendung von (Ort der wahren Maus)
  4. Löse für Kreuzung der Kantenlinie und senkrechten Linie.
  5. Setzen Sie den falschen Cursor an dieser Stelle.

Andere Tipps

Statt einen "Sicherungspunkt" von Tracking, würde ich Folgendes tun:

Wenn Sie außerhalb Ihres Polygon finden, statt zu einem letzten bekannten sicheren Punkt zurückkehrt, legen Sie die Maus an den nächsten Punkt auf / in dem Polygon der aktuellen Mausposition. Dadurch wird das Gefühl helfen, als auch, da die Cursor auf (langsam) dazu neigen, folgen Pisten am Rande von Polygonen, etc.

Es entfällt auch die Notwendigkeit, den Zustand zwischen Anrufen (Sicherungspunkt) zu speichern.

Wie constrain Punkt P innen a konvexe Polygon (nicht-konvex ist etwas härter) in 2-D (annimmt Uhrzeigersinn Wickel Reihenfolge):

Für jede Kante (Pi, Pj) des Polygons ...

, um ein Normalvektor N der Kante (Einheitsvektor zeigt von Pi Pj , um 90 Grad gedreht)

Finden die Verschiebung D vom Rande zum Punkt P entlang N ( D = (P - Pi) Punkt N )

D ist positiv (oder negativ für im Gegenuhrzeigersinn Wickel Reihenfolge), dann P = P - N * D

End-Schleife:)

Nächster Punkt:

if(mouse.x > maxX) 
    mouse.x = maxX;
else if(mouse.x < minX)
    mouse.x = minX;

// same for Y.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top