Question

Autrement connu comme un bord dur, c'est une ligne sur laquelle la souris ne peut pas traverser. Utile dans les jeux et autres.

À l'heure actuelle, j'ai une fonction qui retourne si le curseur de la souris est dans un polygone dessiné sur l'écran. Dans le cas contraire, je déplace mon curseur sur le dernier point mémorisé qui était dans le polygone.

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

Je n'aime pas cela pour plusieurs raisons:

  • En raison des temps de mise à jour lente ou pour une raison quelconque, je suis parfois en mesure de sortir de la boîte. Cela mémorise alors cette position comme SafePoint, en dehors du polygone. Ma souris est alors coincé dans cette position.

  • bords inclinés doivent PUST la souris dans la direction de la pente. Pousser la souris à droite againts un mur en forme de « / » devrait se retrouver avec le curseur dans le coin supérieur droit. Mais en raison de la nature de cette approche, en passant sur la ligne réinitialisera le curseur à l'endroit où il était auparavant. En continuant à pousser droit ne gardera reseting le curseur, et ne pousser « la pente. »

Y at-il d'autres approches pour lutter contre ce problème? Je suis surtout inquiet au sujet de la dernière question: ce comportement transversal de la pente est l'objectif principal de mon programme et je dois le faire fonctionner. Même si j'utilise cette méthode de base, des idées pour une optimisation de ce comportement spécifique?


EDIT:

Il a été suggéré par Reed que je retourne à la place au point que se rapproche le plus courant hors limites points. Compte tenu des 4 points d'angle d'un quadrilatère, comment pourrais-je trouver le point le plus proche dans / sur la forme?

Était-ce utile?

La solution 3

  1. Trouver l'équation de la ligne de bord en utilisant les deux points d'extrémité.
  2. -. (1 / pente) donne la pente de la ligne perpendiculaire
  3. Solve pour l'équation de ligne de la ligne perpendiculaire en utilisant le point connu à travers le bord (emplacement de la vraie souris)
  4. Résoudre pour intersection de la ligne de bord et la ligne perpendiculaire.
  5. Placez le curseur faux à cet endroit.

Autres conseils

Au lieu de suivre un "SafePoint", je ferais ce qui suit:

Si vous trouvez votre extérieur de votre polygone, au lieu de revenir à un dernier point sûr connu, mettez la souris au point le plus proche / dans le polygone à l'emplacement de la souris. Cela aidera la sensation, aussi bien, puisque le curseur aura tendance à (lentement) suivre les pentes sur le bord des polygones, etc.

Il élimine également la nécessité de sauvegarder l'état entre les appels (SafePoint).

Comment contraindre le point P dans un convexe polygone (non-convexe est un peu plus difficile) dans du 2-D (en supposant que l'ordre d'enroulement dans le sens horaire):

Pour chaque arête (Pi, Pj) du polygone ...

Trouver le vecteur normal N du bord (vecteur unitaire pointant de Pi Pj , tourné de 90 degrés)

Trouver le déplacement D à partir du bord pour pointer P en N ( D = (P - Pi) dot N )

Si D est positif (ou négatif pour une commande d'enroulement anti-horaire), puis P = P - N * D

boucle de fin:)

point le plus proche:

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

// same for Y.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top