IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

point dans un polygone + object is not suscriptable


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2016
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2016
    Messages : 32
    Par défaut point dans un polygone + object is not suscriptable
    bonjour à tous,
    un probléme avec ce code chargé de vérifier si un point est à l'intérieur d'un polygone

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    import numpy
    import math
    # P1 et P2 sont représentés par des listes sous la forme :
    P1=[[0 ,0],[10 ,0],[20,10],[10,20],[0,20],[-10,10],[-10,0]]    #[A,B]
    P2=[[0 ,0 ],[0 ,10 ],[5,10],[0,0]]
     
    m=len(P1)
    n=len(P2)
     
    A=P1[:]          #on prend tout P1 dans A puisqu'on a besoin du dernier vecteur pour retourner à [0,0]
    B=P1[1:]         #on doit placer le dernier point B à l'origine
    B.append([0,0]) #on ajoute donc [0,0] à la fin de la liste B
     
    C=P2[:]          #on prend tout P2 dans C puisqu'on a besoin du dernier vecteur pour retourner à [0,0]
    D=P2[1:]         #on doit placer le dernier point D à l'origine
    D.append([0,0]) #on ajoute donc [0,0] à la fin de la liste D
     
    def Orientation (M,N,P):
        angle_rad=[]
        for i in range (len(P)):    # P permet d'utiliser la fonction pour P1 et P2
            angle_rad.append(math.atan2(N[i][1]-M[i][1],N[i][0]-M[i][0]))   #retourne atan(y / x). Le vecteur du plan allant de l’origine vers le point (x, y) forme cet angle avec l’axe X positif. 
        return angle_rad
     
    def Norme (M,N,P):
        norme=[]
        for i in range (len(P)):    # P permet d'utiliser la fonction pour P1 et P2
            norme.append(math.sqrt((N[i][0]-M[i][0])**2+(N[i][1]-M[i][1])**2))
        return norme
     
    #Q11
    segNFP=[]
    for i in range (m):
        segNFP.append([Orientation(A,B,P1)[i], Norme(A,B,P1)[i]])
    for i in range (n):
        segNFP.append([Orientation(C,D,P2)[i], Norme(C,D,P2)[i]])
    print ('segNFP=''\n',numpy.around(segNFP,3))
     
    #tri par insertion des segments
    def tri_ins(L):
        for k in range(1,len(L)):
            temp=L[k]
            j=k
            while j>0 and temp<L[j-1]:
                L[j]=L[j-1]
                j-=1
            L[j]=temp
        print ('liste triée','\n',numpy.around(L,3))
        return L
     
    segNFP_tri=tri_ins(segNFP)
     
    # Q14
    n=len(segNFP_tri)
    NFP=[]
    coord=[]
    for i in range(n):
        angle=segNFP_tri[i][0]  # on reprend les angles et les normes dans le tableau
        norme=segNFP_tri[i][1]  #des segments triés à la question précédente
        coord.append([[norme*math.cos(angle)],[norme*math.sin(angle)]]) #calcul du point suivant
        NFP.append([coord[i][0],coord[i][1]])#on ajoute les coordonnées (x,y) dans un tableau NFP
    print ('coordonnées des points du polygone''\n',numpy.around(NFP))
     
    #Q16
    def TestPoly(M,poly):
        n=len(poly)             #n points
        angle_tot=0
        for i in range(n-1):    #n-1 segments 
            angle_deb=Orientation(M,poly[i],P1)    #si un point est strictement à l’intérieur d’un polygone, alors la somme des angles orientés formés par ce point et chacun des sommets consécutifs du polygone est nulle (ou égale à 2pi)
            angle_fin=Orientation(M,poly[i+1],P1)
            angle_tot=angle_tot+(angle_fin-angle_deb)
        resultat=False  #valeur de resultat par défaut
        if abs(angle_tot)<1e-10 or  abs(angle_tot-2*pi)<1e-10: #valeur proche de 0 ou 2.pi a cause des erreurs d'arrondis
            resultat=True
        return resultat
     
    TestPoly(P2[0],P1)
    La console me retourne

    angle_rad.append(math.atan2(N[i][1]-M[i][1],N[i][0]-M[i][0]))
    TypeError: 'int' object is not subscriptable

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par segolsed Voir le message
    Merci d'avance pour votre aide.
    Relisez votre code TestPoly(P2[0],P1), P2[0] est une liste à 2 entiers puisque P2=[[0 ,0 ],[0 ,10 ],[5,10],[0,0]]
    Donc la liste L = [0, 0] (votre P2[0]) n'a qu'une dimension et L[0][1] va planter.
    Après, je ne sais pas ce que vous cherchez à faire...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2016
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2016
    Messages : 32
    Par défaut
    ok merci,
    en fait je souhaite trouver un angle entre un point M et un point du polygone P, d'où mon opération.

  4. #4
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2016
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2016
    Messages : 32
    Par défaut
    de cette manière, je prends chaque point puisque par exemple poly2[i] est une liste à 2 éléments comme mon point M de la fonction Orientation.
    Pourtant, l'erreur subsiste.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    import numpy
    import math
    # P1 et P2 sont représentés par des listes sous la forme :
    P1=[[0 ,0],[10 ,0],[20,10],[10,20],[0,20],[-10,10],[-10,0]]    #[A,B]
    P2=[[0 ,0 ],[0 ,10 ],[5,10],[0,0]]
     
    m=len(P1)
    n=len(P2)
     
    A=P1[:]          #on prend tout P1 dans A puisqu'on a besoin du dernier vecteur pour retourner à [0,0]
    B=P1[1:]         #on doit placer le dernier point B à l'origine
    B.append([0,0]) #on ajoute donc [0,0] à la fin de la liste B
     
    C=P2[:]          #on prend tout P2 dans C puisqu'on a besoin du dernier vecteur pour retourner à [0,0]
    D=P2[1:]         #on doit placer le dernier point D à l'origine
    D.append([0,0]) #on ajoute donc [0,0] à la fin de la liste D
     
    def Orientation (M,N,P):
        angle_rad=[]
        for i in range (len(P)):    # P permet d'utiliser la fonction pour P1 et P2
            angle_rad.append(math.atan2(N[i][1]-M[i][1],N[i][0]-M[i][0]))   #retourne atan(y / x). Le vecteur du plan allant de l’origine vers le point (x, y) forme cet angle avec l’axe X positif. 
        return angle_rad
     
    def Norme (M,N,P):
        norme=[]
        for i in range (len(P)):    # P permet d'utiliser la fonction pour P1 et P2
            norme.append(math.sqrt((N[i][0]-M[i][0])**2+(N[i][1]-M[i][1])**2))
        return norme
     
    #Q11
    segNFP=[]
    for i in range (m):
        segNFP.append([Orientation(A,B,P1)[i], Norme(A,B,P1)[i]])
    for i in range (n):
        segNFP.append([Orientation(C,D,P2)[i], Norme(C,D,P2)[i]])
    print ('segNFP=''\n',numpy.around(segNFP,3))
     
    #tri par insertion des segments
    def tri_ins(L):
        for k in range(1,len(L)):
            temp=L[k]
            j=k
            while j>0 and temp<L[j-1]:
                L[j]=L[j-1]
                j-=1
            L[j]=temp
        print ('liste triée','\n',numpy.around(L,3))
        return L
     
    segNFP_tri=tri_ins(segNFP)
     
    # Q14
    n=len(segNFP_tri)
    NFP=[]
    coord=[]
    for i in range(n):
        angle=segNFP_tri[i][0]  # on reprend les angles et les normes dans le tableau
        norme=segNFP_tri[i][1]  #des segments triés à la question précédente
        coord.append([[norme*math.cos(angle)],[norme*math.sin(angle)]]) #calcul du point suivant
        NFP.append([coord[i][0],coord[i][1]])#on ajoute les coordonnées (x,y) dans un tableau NFP
    print ('coordonnées des points du polygone''\n',numpy.around(NFP))
     
     
    #Q16
    def TestPoly(poly1,poly2):
        n=len(poly1)             #n points
        angle_tot=0
        for i in range(n-1):    #n-1 segments 
            angle_deb=Orientation(poly2[i],poly1[i],poly1)    #si un point est strictement à l’intérieur d’un polygone, alors la somme des angles orientés formés par ce point et chacun des sommets consécutifs du polygone est nulle (ou égale à 2pi)
            angle_fin=Orientation(poly2[i],poly1[i+1],poly1)
            angle_tot=angle_tot+(angle_fin-angle_deb)
        resultat=False  #valeur de resultat par défaut
        if abs(angle_tot)<1e-10 or  abs(angle_tot-2*pi)<1e-10: #valeur proche de 0 ou 2.pi a cause des erreurs d'arrondis
            resultat=True
        return resultat
     
    TestPoly(P2,P1)

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par segolsed Voir le message
    Pourtant, l'erreur subsiste.
    De toutes façons, si vous passez à vos fonctions Orientation et Norme un seul point, ce devra être une liste des listes (i.e. L = [ [0, 0] ] histoire que L[0][1] fonctionne).

    en fait je souhaite trouver un angle entre un point M et un point du polygone P, d'où mon opération
    .

    Il y a du boulot: vos fonctions Orientation et Norme supposent trouver un même nombre de points/listes dans les listes passées en arguments...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. [C] présence d'un point dans un polygone
    Par adiiii dans le forum Développement 2D, 3D et Jeux
    Réponses: 15
    Dernier message: 16/11/2019, 09h14
  2. Point dans un polygone
    Par kerinel dans le forum Mathématiques
    Réponses: 5
    Dernier message: 17/10/2007, 12h23
  3. Point dans un polygone
    Par titelisette dans le forum ASP
    Réponses: 7
    Dernier message: 03/05/2007, 17h08
  4. Point dans un polygone
    Par titelisette dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 27/04/2007, 11h51
  5. Réponses: 4
    Dernier message: 14/02/2007, 18h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo