Enveloppe convexe marche de jarvis problème

Liste des GroupesRevenir à fcl python 
Sujet : Enveloppe convexe marche de jarvis problème
De : nospam_loic.durieu (at) *nospam* gmail.com.invalid (ldrieu)
Groupes : fr.comp.lang.python
Date : 12. Jan 2022, 00:34:16
Autres entêtes
Organisation : !No_Organization!
Message-ID : <YaadnZ55Qo11mEP8nZ2dnUU7_83NnZ2d@giganews.com>
Bonjour,
je suis débutant en python, je dois réaliser un programme me permettant a terme
de trouver l' enveloppe convexe d'une liste de points.
j'ai essayé de coder l'algorithme de la marche de Jarvis mais celui-ci, ne
fonctionne pas.
Je ne vois pas comment faire pour avancer.
je ne dois pas utiliser de variable globale( à terme le programme aura une  IHM
affin de choisir un fichier csv).
Je n'ai pas non plus vu la notion de récursivité.
Auriez vous des pistes d'améliorations ?
merci d'avance.


La fonction envellopeconvexe3 est la plus aboutie les versions précédentes
ayant encore plus de soucis.
##Imports:
from math import cos,acos,sqrt
import matplotlib.pyplot as plt

##liste test
liste1= [[150, 200], [122, -232], [-200, 80], [138, 157], [-148, 75], [82,
-178], [129, 126], [-112, 73], [57, -142], [121, 100], [-84, 70], [40, -114],
[112, 80], [-61, 68], [28, -91], [104, 63], [-43, 65], [20, -72], [96, 49],
[-28, 61], [14, -56], [87, 38], [-16, 58], [11, -43], [80, 29], [-5, 54], [9,
-32], [72, 23], [3, 50], [9, -22], [65, 18], [9, 46], [9, -14], [59, 14], [15,
42], [10, -8], [54, 12], [19, 39], [11, -3], [49, 10], [22, 35], [12, 2], [45,
9], [24, 32], [14, 5], [42, 9], [26, 30], [15, 8], [39, 9], [28, 27], [17, 10]]

##fonctions intermédiaires
def coords(A, B):                     #on calculs les coordonnées d'un vecteur
avec les deux points
    vab=[B[0]-A[0],B[1]-A[1]]
    return vab


def Normevecteur(a,b):                               #on calculs la norme d'un
vecteur/la distance entre les deux points.
    Nab=sqrt((b[0]-a[0])**2+(b[1]-a[1])**2)
    return Nab
def pscalairecoords(A,B):                            #on calculs le produit
scalaire entre deux vecteurs par
    P=A[0]*B[0]+A[1]*B[1]
    return P

def angleentretroispoints(A,B,C):
    # Vab=[]
    # Vac=[]
    # Nab=0
    # Nac=0
    Vab=coords(A,B)
    Vac=coords(A,C)
    Nab=Normevecteur(A,B)
    Nac=Normevecteur(A,C)
    PS=pscalairecoords(Vab,Vac)
    CosX=PS/(Nab*Nac)
    X = acos(CosX)
    # print(Vab,Vac,Nab,Nac,PS,CosX,X)
    return     [A,B,X]


def pointleplusagauche1(liste):
    k = [0,0]
    indice = 0
    for i in range (len(liste)):
        if liste[i][0]< k[0]:
            k[0]=liste[i][0]
            indice = i
        A=liste[indice]
    return A

def envellopeconvexe(liste):
    pointàrelier=[]
    A=pointleplusagauche1(liste)
    B=[A[0],A[1]-1]
    pointàrelier.append(A)
    j=0
    while j!= pointleplusagauche1(liste):
        H=[]
        for i in range (len(liste)):
            z=angleentretroispoints(A,B,liste[i])
            H.append([z[0],z[1],[liste[i][0],liste[i][1]],z[2]])
        for i in range (len(H)):
            max=H[0]
            p=[0]
            if H[i][3]>max:
                max=H[i][3]
                p=H[i]
        A=p[2]
        B=p[0]
        pointàrelier.append(A)
        j=p[2]
    return pointàrelier




##test



def angleentretroispoints1(A,B,C):#bonne version de verif d'angle
    # Vab=[]
    # Vac=[]
    # Nab=0
    # Nac=0
    Vab=coords(A,B)
    Vac=coords(A,C)
    Nab=Normevecteur(A,B)
    Nac=Normevecteur(A,C)
    if Nab==0 or Nac==0 or Nac==Nab:
        return
    PS=pscalairecoords(Vab,Vac)
    CosX=PS/(Nab*Nac)
    X = acos(CosX)
    # print(Vab,Vac,Nab,Nac,PS,CosX,X)
    return     [A,B,X]



def envellopeconvexe3(liste):
    pointàrelier=[]
    A=pointleplusagauche1(liste)
    B=[A[0],A[1]-1]
    pointàrelier.append(A)
    j=0
    while j!= pointleplusagauche1(liste):
        H=[]
        m=liste.index(A)
        k=liste
        del k[m]
        print (k)
        for i in range(len(k)):
            z=angleentretroispoints1(A,B,liste[i])
            H.append([z[0],z[1],[liste[i][0],liste[i][1]],z[2]])
            # print(H)
        for i in range (len(H)):
            max=H[0][3]
            p=H[0]
            if H[i][3]>max:
                max=H[i][3]
                p=H[i]
                print(p)
            print(p)
        A=p[2]
        B=p[0]
        pointàrelier.append(A)
        j=p[2]
    print(pointàrelier)
    return pointàrelier

def affichage(liste):
    envellopeconvexe3(liste)
   

plt.plot([-200, 150, 122, 17,28,138,-148],[80 ,200,-232,10,27,157,75],'-gs')#
green carré
# plt.plot([-7,3,2.5,-7],[3.5,1,3.5,1.5],'-gs')# green carré
plt.show()



# def testx():
#     liste=[1,2,3,4,5,6,7]
#     point=5
#     compteur = 0
#     for i in range (len(liste)):
#         if point==liste[i]:
#             compteur = i
#     for i in range(0,compteur):
#         print(liste[i])
#     for i in range(compteur+1,len(liste)):
#         print(liste[i])
#     #print(compteur)
#
# def testxy():
#     listeo=[1,2,3,4,5,6,7,8,9]
#     P=5
#     i=listeo.index(P)
#     k=listeo.del[i]
#     print (k)
#     return
#
#
# def testxyz():
#     listeo=[1,2,3,4,5,6,7,8,9]
#     P=5
#     i=listeo.index(P)
#     k=listeo
#     del k[i]
#     for point in k:
#         print (point)

Date Sujet#  Auteur
12 Jan 22 o Enveloppe convexe marche de jarvis problème1ldrieu

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal