FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Demande urgente en maths.
par JL35 Aujourd'hui à 21:21

» Compilateur FBPano
par jean_debord Aujourd'hui à 11:24

» Problème de math
par braveen Aujourd'hui à 10:53

» A propos des attributs de fichier
par papydall Hier à 14:33

» Problème de math
par Marc37 Sam 21 Oct 2017 - 23:04

» I Love You
par papydall Sam 21 Oct 2017 - 19:22

» Un petit "coucou" à tous les Panoramiciens !
par mindstorm Sam 21 Oct 2017 - 17:06

» MARK_ON déclenche un événement ON_CLICK à la place de ...
par Jean Claude Mer 18 Oct 2017 - 18:08

» mise a jour calculatrice
par joeeee2017 Mer 18 Oct 2017 - 15:57

» [solved] 3D_LINE How to ?
par Jicehel Mer 18 Oct 2017 - 11:01

» Convertisseur de base 10 de 2 à 36
par gigi75 Mar 17 Oct 2017 - 18:49

» calculatrice avec touches movibles
par joeeee2017 Dim 15 Oct 2017 - 1:11

» CORTANA
par gigi75 Sam 14 Oct 2017 - 16:32

» Calculatrice
par Jean Claude Sam 14 Oct 2017 - 12:30

» KGF_dll - nouvelles versions
par Klaus Mar 10 Oct 2017 - 18:49

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Octobre 2017
LunMarMerJeuVenSamDim
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
CalendrierCalendrier

Partagez | 
 

 Tester si un point est dans un polygone

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
Klaus

avatar

Nombre de messages : 10075
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Tester si un point est dans un polygone   Dim 21 Déc 2014 - 16:05

Question:
Sur un plan en deux dimensions, comment vérifier si un point quelconque se trouve à l'intérieur ou à l'extérieur d'un polygone irrégulier ?

Réponse:
Il faut construire une droite verticale passant par le point à tester et dénombrer les segments du polygone coupés par cette droite. On compte séparément les intersections au-dessus et en-dessous du point à tester. Ces nombres, quels qu'ils soient, sont soit pairs soit impairs. Si ces nombres sont impairs, le point à tester est dans le polygone, et en-dehors sinon.

J'ai fait un petit programme qui visualise cela. Un Scene2d prend presque toute la surface de l'écran. Il y a les boutons suivants:
"Ajouter un point" : passe le programme en mode "ajout". Tout clic dans la scene2d ajoute ensuite un point à la liste, en dessinant le polygone au fur et à mesure, en couleur noire. La liste des coordonnées s'affiche dans le mémo en haut à droite.
"Enlever un point": passe le programme en mode "suppression". Tout clic sur un point déjà dessiné l'enlève du dessin en redessinant le polygone résultant.
"Effacer tout": fait ce que le libellé indique.
"Point à tester": un point bleu est placé à l'endroit du prochain clic dans la scene2d. En cliquant ailleurs, le point bleu se déplace. Les coordonnées du point sont affichées en-dessous de ce bouton.
"Vérifier": affiche le résultat de la vérification pour la position du point bleu par rapport au polygone. Il n'est pas utile de fermer le polygone - le programme le fait automatiquement avec un trait rouge, évitant ainsi la difficulté de viser un pixel précis pour fermer le polygone.

Voici le code, le tout en Panoramic pur en 200 lignes:
Code:
' test_point_dans_polygone.bas

label add, del, test, eff, padd, pdel, ptest, verif

dim ptest%(1), polygon%(100,1), npoints%, x%, y%, s$, i%, j%
dim x1%,x2%, y1%, y2%, yp, nhaut%, nbas%, ferme%

full_space 0 : caption 0,"Verifier si un point est dans un polygone"

picture 1 : full_space 1 : height 1,height(1) - 100 : top 1,100

button 2 : top 2,10 : left 2,10 : caption 2,"Ajouter un point"
  width 2,100 : on_click 2,add

button 3 : top 3,40 : left 3,10 : caption 3,"Enlever un point"
  width 3,100 : on_click 3,del
 
button 31 : top 31,70 : left 31,10 : caption 31,"Effacer tout"
  width 31,100 : on_click 31,eff

memo 12 : top 12,10 : left 12,300 : width 12,width(0)-360 : bar_both 12
  height 12,80

button 4 : top 4,10 : left 4,150 : caption 4,"Point à tester"
  width 4,100 : on_click 4,test
alpha 14 : top 14,40 : left 14,150

button 5 : top 5,70 : left 5,150 : caption 5,"Vérifier"
  width 5,100 : on_click 5,verif

2d_target_is 1

end

add:
  off_click 1
  on_click 1,padd
  return
 
del:
  off_click 1
  on_click 1,pdel
  return
 
test:
  off_click 1
  on_click 1,ptest
  return

eff:
  npoints% = 0
  ptest%(0) = -1
  ptest%(1) = -1
  2d_clear
  clear 12
  caption 14,""
  off_click 1
  return

padd:
  if npoints%=100
    message "Trops de points !"
    return
  end_if
  if ferme%=1
    2d_pen_color 255,255,255
    2d_poly_from polygon%(npoints%,0),polygon%(npoints%,1)
    2d_poly_to polygon%(1,0),polygon%(1,1)
    2d_pen_color 0,0,0
    ferme% = 0
  end_if
  x% = mouse_x_left_down(1)
  y% = mouse_y_left_down(1)
  s$ = "("+str$(x%)+","+str$(y%)+")"
  if count(12)>0
    s$ = item_read$(12,1)+","+s$
    clear 12
  end_if
  item_add 12,s$
  npoints% = npoints% + 1
  polygon%(npoints%,0) = x%
  polygon%(npoints%,1) = y%
  if npoints%=1
    2d_point x%,y%
  else
    2d_poly_from polygon%(npoints%-1,0),polygon%(npoints%-1,1)
    2d_poly_to x%,y%
  end_if
  2d_circle x%,y%,3
  return
 
pdel:
  if npoints%=0 then return
  x% = mouse_x_left_down(1)
  y% = mouse_y_left_down(1)
  for i%=1 to npoints%
    if abs(polygon%(i%,0)-x%)<5
      if abs(polygon%(i%,1)-y%)<5
        if i%<npoints%
          for j%=i% to npoints%
            polygon%(j%,0) = polygon%(j%+1,0)
            polygon%(j%,1) = polygon%(j%+1,1)
          next j%
        end_if
        npoints% = npoints% - 1
        2d_clear
        if npoints%>0
          2d_circle polygon%(1,0),polygon%(1,1),3
          if npoints%>1
            for j%=1 to npoints%-1
              2d_poly_from polygon%(j%,0),polygon%(j%,1)
              2d_poly_to polygon%(j%+1,0),polygon%(j%+1,1)
              2d_circle polygon%(j%+1,0),polygon%(j%+1,1),3
            next j%
          end_if
        end_if
        if ptest%(0)>=0
          2d_fill_color 0,0,255
          2d_fill_on
          2d_circle ptest%(0),ptest%(1),3
          2d_fill_off
          2d_fill_color 255,255,255
        end_if
      end_if
    end_if
  next i%
  return
 
ptest:
  x% = mouse_x_left_down(1)
  y% = mouse_y_left_down(1)
  s$ = "("+str$(x%)+","+str$(y%)+")"
  caption 14,s$
  if ptest%(0)>=0
    2d_pen_color 255,255,255
    2d_fill_on
    2d_circle ptest%(0),ptest%(1),3
    2d_fill_off
    2d_pen_color 0,0,0
  end_if
  ptest%(0) = x%
  ptest%(1) = y%
  2d_fill_color 0,0,255
  2d_fill_on
  2d_circle x%,y%,3
  2d_fill_off
  2d_fill_color 255,255,255
  return
 
verif:
' le point est "dedans" si une ligne horizontale ou verticale
' passant par le point coupe un nombre impair de segments du polygone.
' formule du segment:  yp=((y2-y1)/(x2-x1))*(xp-x1)+y1
' formule de la droite par le point à tester: x = xp
' il faut tester si min(y1,y2)<=yp<=max(y1,y2)
' si oui, la droite verticale par le point coupe le segment
  if ptest%(0)<0 then return
  if npoints%<3 then return
  nhaut% = 0
  nbas% = 0
  x% = ptest%(0)
  y% = ptest%(1)
  2d_pen_color 255,0,0
  2d_poly_from polygon%(npoints%,0),polygon%(npoints%,1)
  2d_poly_to polygon%(1,0),polygon%(1,1)
  2d_pen_color 0,0,0
  ferme% = 1
  for i%=1 to npoints%
    x1% = polygon%(i%,0)
    y1% = polygon%(i%,1)
    if i%<npoints%
      x2% = polygon%(i%+1,0)
      y2% = polygon%(i%+1,1)
    else
      x1% = polygon%(1,0)
      y1% = polygon%(1,1)
    end_if
    if min(x1%,x2%)<=x%
      if x%<=max(x1%,x2%)
        yp = ((y2%-y1%)/(x2%-x1%))*(x%-x1%)+y1%
        if min(y1%,y2%)<=yp
          if yp<=max(y1%,y2%)
'            message "segment "+str$(i%)+" est coupé."
            if yp>=y%
              nhaut% = nhaut%+1
            else
              nbas% = nbas% + 1
            end_if
          end_if
        end_if
      end_if
    end_if
  next i%
'  message "haut: "+str$(nhaut%)+"  bas: "+str$(nbas%)
  if odd(nhaut%)=1
    message "Le point à tester est à l'intérieur du polygone !"
  else
    message "Le point à tester est à l'extérieur du polygone !"
  end_if
  return
 
 
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
mindstorm

avatar

Nombre de messages : 537
Age : 48
Localisation : charente
Date d'inscription : 13/02/2013

MessageSujet: Re: Tester si un point est dans un polygone   Mar 23 Déc 2014 - 20:44

Bonsoir Klaus
je reçois un no correct expression line 136
2D_fill_on
cette commande n'est pas dans le manuel de référence!!
je suis actuellement en V0-9-25
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10075
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Tester si un point est dans un polygone   Mar 23 Déc 2014 - 21:22

Il faut que tu passes à la version V0.9.26i3 pour cela.

Maisl tu peux l'éviter en supprimant toutes les lignes 2D_FILL_ON et 2D_FILL_OFF. Tu obtiendras des poignées qui ne seront pas pleins, mais qui fonctionneront quand-même !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
mindstorm

avatar

Nombre de messages : 537
Age : 48
Localisation : charente
Date d'inscription : 13/02/2013

MessageSujet: Re: Tester si un point est dans un polygone   Mar 23 Déc 2014 - 22:12

merci Klaus
la coloration syntaxique m'a bien aidé
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: Tester si un point est dans un polygone   

Revenir en haut Aller en bas
 
Tester si un point est dans un polygone
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Tester si un point est dans un polygone
» coordonnées sur Nuvi 200
» [fermé]Points d'exclamation jaune dans gestionnaire de prérihpériques
» Créer une collection (répertoire) de waypoint dans un Nüvi.
» point gps ?

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: