Come posso verificare se un punto si trova tra due linee parallele?


10

Nel gioco che sto progettando c'è un'esplosione che spara da un punto di origine verso la direzione del mouse. La larghezza di questa esplosione sarà sempre la stessa.

Nella parte inferiore dello schermo (ciò che è attualmente) si muovono i quadrati che dovrebbero essere effettuati dall'esplosione che il giocatore controlla.

Attualmente sto cercando di trovare un modo per scoprire se gli angoli di questi quadrati si trovano all'interno delle due linee di demarcazione dell'esplosione. Ho pensato che il modo migliore per farlo fosse ruotare gli angoli del quadrato attorno a un punto di origine come se l'esplosione fosse completamente orizzontale e vedere se i valori Y degli angoli fossero inferiori o uguali alla larghezza dell'esplosione che significa che si trovano all'interno della regione effettuata, ma non riesco a capire


Questo mi è stato utile: stackoverflow.com/a/3461533/1599699
Andrew

Risposte:


11

Il punto è tra le 2 linee parallele se è un lato di una linea e l'altro lato dell'altra linea (fornendo le linee puntate nella stessa direzione).

Puoi usare la risposta migliore da questa domanda su StackOverflow per capire da che parte di una linea (definita da 2 punti su di essa) si trova un punto.


Un metodo alternativo sarebbe quello di calcolare la distanza da un punto a una linea mediana e confrontarla a metà dello spessore dell'esplosione.


2

Ecco come lo faccio (con un controllo aggiuntivo se i piani forniti sono effettivamente paralleli. Gli oggetti piano contengono l'equazione del piano in questa forma: Ax + By + Cz + D = 0, che puoi facilmente generare da 3 dati punti, o da un punto e un normale (vedi questa pagina se non sei sicuro della matematica: http://paulbourke.net/geometry/pointlineplane/ )

bool isPointBetweenParallelPlanes(const vec3 point, const Plane a, const Plane b){
// test if planes are parallel
vec3 cross = a.normal CROSS b.normal;
assert((a.normal CROSS b.normal) == vec3(0,0,0) && "These planes should be parallel.");
return ((a.normal DOT point) + a.D) * ((b.normal DOT point) + b.D) < 0.0;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.