BiG_Inside

Fonction Catégorie Version
BIG 04 BiG_Inside Fonction Géométrique 1.0 - Janvier 2007

Description

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))
	

Commande: (setq L_Pts (BiB_Vertices Pol1))
((7.0 7.0 0.0) (10.0 10.0 0.0) (13.0 8.0 0.0) (15.0 10.0 0.0) 	
    (15.0 4.0 0.0) (8.0 5.0 0.0))

Commande: (BiG_Inside (getpoint "Point à tester ? ") L_Pts)
	retourne      Point à tester ? T  
    Le point testé est à l'intérieur de la polyligne.

Commande: (BiG_Inside '(25 10) L_Pts)
	retourne	nil	    
le point testé étant en dehors de la polyligne.

La fonction


   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

List : : Regroupe plusieurs éléments en une liste.
Cadr : Equivaut à Car de Cdr soit le 2ème élément d’une liste.
Repeat : Ici, évalue les lignes 8 à 15 un nombre de fois égal au nombre de sommets de la polyligne moins 1.
Inters : Recherche l’intersection de 2 lignes.
Rem : Renvoie le reste d’une division.