Domanda

Altrimenti noto come un bordo duro, questa è una linea su cui il mouse non può attraversare. Utile nei giochi e simili.

Attualmente, ho una funzione che restituisce se il mio cursore del mouse si trova in un poligono disegnato sullo schermo. Se non lo è, muovo il cursore sull'ultimo punto memorizzato che era nel poligono.

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

Non mi piace questo per un paio di ragioni:

  • A causa di tempi di aggiornamento lente o per qualsiasi motivo, sono a volte in grado di rompere fuori dalla scatola. Questo quindi memorizza tale posizione come safepoint, al di fuori del poligono. Il mio mouse viene poi bloccato in questa posizione.

  • bordi inclinati dovrebbero PUST il mouse nella direzione della pendenza. Spingendo il mouse destra againts un "/" muro forma dovrebbe finire con il cursore in alto a destra. Ma a causa della natura di questo approccio, andando oltre la linea ripristinerà il cursore dove in precedenza era. Continuando a spingere destra servirà solo a mantenere resettare il cursore, e non spingerlo "su per il pendio."

Ci sono altri approcci per affrontare questo problema? Sono soprattutto preoccupato per l'ultimo numero: questo comportamento pendenza trasversale è l'obiettivo principale del mio programma e ho bisogno di farlo funzionare. Anche se io uso questo metodo di base, qualche idea per un'ottimizzazione di quel comportamento specifico?


EDIT:

E 'stato suggerito da Reed che invece tornare al punto che è più vicino alla corrente punto fuori dal campo. Dati i 4 punti d'angolo di un quadrilatero, come faccio a trovare il punto più vicino nella / sulla forma?

È stato utile?

Soluzione 3

  1. Trova l'equazione della linea di bordo utilizzando i due punti finali.
  2. -. (1 / slope) dà la pendenza della retta perpendicolare
  3. Risolvere per la linea equazione della linea perpendicolare con il punto noto attraverso il bordo (posizione del vero topo)
  4. risolvere per intersezione della linea bordo e asse perpendicolare.
  5. Posizionare il cursore falso in quella posizione.

Altri suggerimenti

Invece di tracciare un "safepoint", vorrei fare quanto segue:

Se trovate il vostro al di fuori del poligono, invece di un ritorno ad un ultimo punto sicuro noto, mettere il mouse fino al punto più vicino / nel poligono nella posizione corrente del mouse. Questo aiuterà la sensazione, così, dal momento che il cursore tenderà a (lentamente) seguite da sci sul bordo di poligoni, ecc.

Inoltre, elimina la necessità di salvare lo stato tra le chiamate (safepoint).

Come vincolare punto P all'interno di un convessa poligono (non convesso è un po 'più difficile) in 2-D (assumere senso orario avvolgimento):

Per ogni bordo (Pi, Pj) del poligono ...

Trova il vettore normale N del bordo (versore punta da Pi Pj , ruotato di 90 gradi)

Trova spostamento D dal bordo al punto P nella N ( D = (P - Pi) dot N )

Se D è positivo (o negativo per antiorario di scioglimento), allora P = P - N * D

end loop:)

Punto più vicino:

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

// same for Y.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top