Pregunta

Si no conocido como un borde duro, esto es una línea sobre la que el ratón no puede cruzar. Útil en juegos y similares.

Actualmente, tengo una función que devuelve si mi cursor del ratón está en un polígono dibujado en la pantalla. Si no lo es, muevo el cursor hasta el último punto almacenado que se encontraba en el polígono.

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

No me gusta esto para un par de razones:

  • Debido a los tiempos de actualización lentos o por cualquier razón, a veces soy capaz de salir de la caja. Esta continuación, almacena esa posición como el punto seguro, fuera del polígono. El ratón es entonces atrapado en esta posición.

  • bordes inclinadas deben Pust el ratón en la dirección de la pendiente. Al pulsar el botón derecho del ratón againts una pared "/" en forma debe terminar con el cursor en la esquina superior derecha. Pero debido a la naturaleza de este enfoque, va en la línea se restablecerá el cursor a donde estaba anteriormente. Continúa empujando derecho sólo mantendrá reseting el cursor, y no va a empujarlo "por la pendiente."

¿Hay otros enfoques para hacer frente a este problema? Estoy sobre todo preocupado por el último número: este comportamiento transversal pendiente es el objetivo principal de mi programa y que necesito para que funcione. Incluso si utilizo este método básico, alguna idea para una optimización de que el comportamiento específico?


EDIT:

Se ha sugerido por Reed que en lugar de llegada al punto que está más cerca del punto de salida de los límites actuales. Dadas las 4 esquinas de un cuadrilátero, ¿cómo puedo encontrar el punto más cercano en / sobre la forma?

¿Fue útil?

Solución 3

  1. Encuentre la ecuación de la línea de borde utilizando los dos puntos finales.
  2. -. (1 / pendiente) da la pendiente de la línea perpendicular
  3. Resolver para la ecuación de línea de la línea perpendicular con el punto conocido a través del borde (ubicación de la verdadera ratón)
  4. Resuelve para intersección de línea de borde y la línea perpendicular.
  5. Coloque el cursor falsa en ese lugar.

Otros consejos

En lugar de seguir un "punto seguro", me gustaría hacer lo siguiente:

Si encuentra que su parte exterior de su polígono, en lugar de volver a un último punto seguro y conocido, poner el ratón hasta el punto más cercano de / en el polígono a la ubicación actual del ratón. Esto ayudará a la sensación, también, puesto que el cursor tenderá a (lentamente) siguen pendientes en el borde de polígonos, etc.

También elimina la necesidad de guardar el estado de una llamada (punto seguro).

Cómo restringir punto P dentro de un convexa polígono (no convexo es un poco más duro) en 2-D (asumir orden a la derecha de bobinado):

Para cada borde (Pi, Pj) del polígono ...

Encuentre el vector normal N del borde (vector unitario que apunta desde Pi a Pj , gira 90 grados)

Encuentra el desplazamiento D desde el borde a punto P a lo largo N ( D = (P - Pi) dot N )

Si D es positivo (o negativo para antihorario orden de disolución), entonces P = P - N * D

bucle End:)

punto más cercano:

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

// same for Y.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top