Como posso testar se existe um ponto entre duas linhas paralelas?


9

No jogo que estou criando, há uma explosão que dispara de um ponto de origem na direção do mouse. A largura dessa explosão sempre será a mesma.

Ao longo da parte inferior da tela (o que está atualmente), os quadrados se movem sobre o que deve ser efetuado pela explosão que o jogador controla.

Atualmente, estou tentando descobrir uma maneira de descobrir se os cantos desses quadrados estão dentro das duas linhas delimitadoras da explosão. Eu pensei que a melhor maneira de fazer isso seria girar os cantos do quadrado em torno de um ponto de origem como se a explosão fosse completamente horizontal e ver se os valores Y dos cantos eram menores ou iguais à largura da explosão que seria significa que eles estão dentro da região afetada, mas eu não consigo malhar

Respostas:


11

O ponto está entre as duas linhas paralelas, se for um lado de uma linha e o outro lado da outra linha (fornecendo as linhas apontam na mesma direção).

Você pode usar a resposta principal desta pergunta no stackoverflow para descobrir em que lado de uma linha (definida por 2 pontos) um ponto.


Um método alternativo seria calcular a distância do ponto à linha do meio e compará-la à metade da espessura da sua explosão.


2

É assim que eu faço (com uma verificação adicional se os planos fornecidos são realmente paralelos. Os objetos Plane contêm a equação do plano nesta forma: Ax + By + Cz + D = 0, que você pode gerar facilmente a partir de 3 dados pontos, ou de um ponto e de um normal (consulte esta página se não tiver certeza sobre a matemática: 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;
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.