Comment puis-je tester si un point se situe entre deux lignes parallèles?

9

Dans le jeu que je conçois, il y a une explosion qui jaillit d'un point d'origine vers la direction de la souris. La largeur de cette explosion sera toujours la même.

Au bas de l'écran (ce qui est actuellement) se déplacent des carrés qui devraient être affectés par l'explosion que le joueur contrôle.

Actuellement, j'essaie de trouver un moyen de découvrir si les coins de ces carrés sont dans les deux limites de l'explosion. Je pensais que la meilleure façon de le faire serait de faire pivoter les coins du carré autour d'un point d'origine comme si le souffle était complètement horizontal et de voir si les valeurs Y des coins étaient inférieures ou égales à la largeur du souffle qui serait signifie qu'ils se trouvent dans la région affectée, mais je ne peux pas travailler

Harold
la source

Réponses:

11

Le point se situe entre les 2 lignes parallèles si c'est un côté d'une ligne et l'autre côté de l'autre ligne (à condition que les lignes pointent dans la même direction).

Vous pouvez utiliser la première réponse de cette question sur stackoverflow pour déterminer de quel côté d'une ligne (défini par 2 points) un point se trouve.


Une autre méthode serait de calculer la distance du point à une ligne médiane et de la comparer à la moitié de l'épaisseur de votre explosion.

George Duckett
la source
2

Voici comment je le fais (avec une vérification supplémentaire si les plans fournis sont réellement parallèles ou non. Les objets Plane contiennent l'équation de plan sous cette forme: Ax + By + Cz + D = 0, que vous pouvez facilement générer à partir de 3 étant donné points, ou à partir d'un point et d'une normale (voir cette page si vous n'êtes pas sûr du calcul: 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;
}
Jeroen Baert
la source