N° | Fonction | Catégorie | Version |
---|---|---|---|
BIG 04 | BiG_Inside | Fonction Géométrique | 1.0 - Janvier 2007 |
But | Détermine si un point est à l'intérieur d'un polygone. |
Prototype | (BiG_Inside Pt? L_Sommets) |
Argument | Pt? - Point à tester - Liste - L_Sommets - Liste des coordonnées des sommets - Liste - |
Retours | Nil ou T |
Var. globales | Néant |
Description | La fonction vérifie si un point se trouve à l'intérieur d'une zone définie par une liste de coordonnées de points. |
Notes | Les lignes qui joignent les points ne doivent pas être des courbes. En principe la zone est définie par une polyligne fermée, composée de segments de droites, dont on recherche les sommets par la fonction BiB_Vertices. Attention : Si le point se trouve sur le pourtour de la polyligne, il n’est pas considéré à l’intérieur et le retour est nil. |
Exemples | Commande: _pline Du point: etc... Commande: (setq Pol1 (entlast)) |
1- (defun BiG_Inside (*Pt1 *l_Vert / Cpt_Inter Pt_Inf Cpt_Vert Nb_Vert) 2- (setq Pt_Inf (list 32000.0 (cadr *Pt1)) 3- Cpt_Vert 0 4- Cpt_Inter 0 5- Nb_Vert (1- (length *l_Vert)) 6- ) 7- (repeat Nb_Vert 8- (if (inters (nth Cpt_Vert *l_Vert) 9- (nth (1+ Cpt_Vert)*l_Vert) 10- *Pt1 11- Pt_Inf 12- ) 13- (setq Cpt_Inter (1+ Cpt_Inter)) 14- ) 15- (setq Cpt_Vert (1+ Cpt_Vert)) 16- ) 17- (if (inters (nth Nb_Vert *l_Vert) (car *l_Vert) *Pt1 Pt_Inf) 18- (setq Cpt_Inter (1+ Cpt_Inter)) 19- ) 20- (= (rem Cpt_Inter 2) 1) 21- )
Ligne 2 : On détermine un point qui a toute chance de se retrouver à l’extérieur, à l’horizontale du point *Pt1 Lignes 3 -4: Initialisation des compteurs. Ligne 5 : Nb_Vert = Nombre de sommets de la polyligne moins 1. Ligne 7 : Répéter les lignes 8 à 15, un nombre de fois égal à Nb_Vert Lignes 8-12 : S’il y a une intersection avec la ligne formée par le sommet n° Cpt_Vert et son suivant et la ligne formée par le point *Pt1 à tester et le point défini ligne 2, Ligne 13 : Incrémente le compteur d’intersection Cpt_Inter de 1 si oui. Ligne 15 : Passe au sommet de la polyligne suivant. Ligne 17 : Vérifie s’il y a une intersection avec le dernier segment de la polyligne Ligne 18 : Incrémente le compteur d’intersection Cpt_Inter de 1 si oui. Ligne 20 : Retourne le reste de la division par 2 du compteur d’intersection. Si 1(ou impair) = T, si 0 (pair)= nil