Commençons par les polygones finis.
Pour croiser un polygone, une ligne doit croiser l'un de ses côtés. L'intersection entre la ligne et un bord n'est possible que si deux points se trouvent sur des côtés différents de la ligne.
Cela peut être facilement vérifié avec sign(cross_product(Ep-Lp,Ld))
pour deux points du bord. Ep
- pointe, Lp
- un point sur la ligne, Ld
- vecteur de direction de la ligne, cross_product(A,B)=Ax*By-Ay*Bx
.
Pour traiter des polygones infinis, nous pouvons introduire des "points infinis". Si nous avons un demi-bord infini avec le point E1
et la direction Ed
, son "deuxième point" est quelque chose comme E1+infinity*Ed
, où infinity
est "assez grand nombre".
Pour « infinis points » le chèque sera légèrement différent: cross_product(Ep-Lp,Ld)= =cross_product(E1+infinity*Ed-Lp,Ld)= =cross_product(E1-Lp+infinity*Ed,Ld)= =cross_product(E1-Lp,Ld)+cross_product(infinity*Ed,Ld)= =cross_product(E1-Lp,Ld)+infinity*cross_product(Ed,Ld)
Si cross_product(Ed,Ld)
est égal à zéro (la ligne est parallèle au bord), le signe sera déterminé par le premier composant. Sinon, le second composant dominera et déterminera le signe.
Eh bien pas vraiment raison? Le diagramme sur la gauche a le même signe pour le produit scalaire de tous les sommets avec la normale, mais il croise le polyèdre. – elexhobby
@elexhobby. Merci - tout à fait raison; Je l'avais en tête et j'ai oublié de l'inclure. Voir éditer. – Keith