Courbes de Béziers

neirdah -  
 neirdah -
Bonjour,

je cherche à créer un circuit grâce à un assemblage de courbe de Béziers. Je rencontre néanmoins un problème lorsque j'exécute le code. J'ai en effet l'erreur "name 'figure' is not defined".

voici le code :

def vecteur_unitaire(P1,P2):
    Ux = P2[0]-P1[0]
    Uy = P2[1]-P1[1]
    norme = math.sqrt(Ux*Ux+Uy*Uy)
    if norme!=0:
        return [Ux/norme,Uy/norme]
    else:
        return False

def test_alignement_4pts(points,epsilon):
    U1 = vecteur_unitaire(points[0],points[1])
    U2 = vecteur_unitaire(points[1],points[2])
    U3 = vecteur_unitaire(points[2],points[3])
    if U2:
        x = 2.0-(U1[0]*U2[0]+U1[1]*U2[1]+U2[0]*U3[0]+U2[1]*U3[1])
    else:
        x = 1.0-(U1[0]*U3[0]+U1[1]*U3[1])
    if abs(x) < epsilon:
        return True
    else:
        return False

def division_courbe_bezier_3(points_control):
    P01 = interpolation_lineaire(points_control[0],points_control[1],0.5)
    P12 = interpolation_lineaire(points_control[1],points_control[2],0.5)
    P23 = interpolation_lineaire(points_control[2],points_control[3],0.5)
    P01_12 = interpolation_lineaire(P01,P12,0.5)
    P12_23 = interpolation_lineaire(P12,P23,0.5)
    Q = interpolation_lineaire(P01_12,P12_23,0.5)
    return ([points_control[0],P01,P01_12,Q],[Q,P12_23,P23,points_control[3]])

def courbe_bezier_3_recursif(points_control,epsilon,pile_points_courbe):
    if test_alignement_4pts(points_control,epsilon):
        pile_points_courbe.append(points_control[0])
    else:
        (points_1,points_2) = division_courbe_bezier_3(points_control)
        courbe_bezier_3_recursif(points_1,epsilon,pile_points_courbe)
        courbe_bezier_3_recursif(points_2,epsilon,pile_points_courbe)

def courbe_bezier_3_recursif_init(points_control,epsilon):
    pile_points_courbe = []
    courbe_bezier_3_recursif(points_control,epsilon,pile_points_courbe)
    pile_points_courbe.append(points_control[-1])
    return pile_points_courbe

P0 = [0,0]
P1 = [0.3,1]
P2 = [1,1]
P3 = [1,0]
figure()
epsilon=5e-3
points = courbe_bezier_3_recursif_init([P0,P1,P2,P3],epsilon)
plot_points(points,style='.')
plot_points(points,style='r-')
plot_points([P0,P1,P2,P3],style='o')
axis([0,2,0,2])
grid()


Je suis preneur de toute piste, merci !

Configuration: Windows / Edge 88.0.705.81

3 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour,
    peux-tu préciser à quelle ligne se produit l'erreur?
    que veux-tu faire en ligne 50?
    0
    1. neirdah
       
      Je te met ici le code d'une autre manière de coder la courbe de Bézier et ou je rencontre le même problème

      import math
      from matplotlib import*
      
      def courbe_bezier_3_recursif(points_control,epsilon,pile_points_courbe):
          if test_alignement_4pts(points_control,epsilon):
              pile_points_courbe.append(points_control[0])
          else:
              (points_1,points_2) = division_courbe_bezier_3(points_control)
              courbe_bezier_3_recursif(points_1,epsilon,pile_points_courbe)
              courbe_bezier_3_recursif(points_2,epsilon,pile_points_courbe)
      
      def courbe_bezier_3_recursif_init(points_control,epsilon):
          pile_points_courbe = []
          courbe_bezier_3_recursif(points_control,epsilon,pile_points_courbe)
          pile_points_courbe.append(points_control[-1])
          return pile_points_courbe
      
      class Courbe:
          def __init__(self,P0,P1,P2,P3,epsilon):
              self.points_courbe = []
              self.epsilon = epsilon
              self.bezier_3_recursif_init([P0,P1,P2,P3])
              self.points_control = [P0,P1,P2,P3]
          def bezier_3_recursif_init(self,points_control):
              courbe_bezier_3_recursif(points_control,self.epsilon,self.points_courbe)
              self.P2 = points_control[2]
              self.P3 = points_control[3]
          def ajouter(self,P2,P3):
              P0 = self.P3
              P1 = [P0[0]+P0[0]-self.P2[0],P0[1]+P0[1]-self.P2[1]]
              self.bezier_3_recursif_init([P0,P1,P2,P3])
              self.points_control.append(P1)
              self.points_control.append(P2)
              self.points_control.append(P3)
              self.dernier_point = P3
          def liste_points(self):
              self.points_courbe.append(self.dernier_point)
              return self.points_courbe
          def liste_points_control(self):
              self.points_control.append(self.dernier_point)
              return self.points_control
              
      courbe = Courbe([0,0],[0,1],[1,1],[1,0],5e-3)
      courbe.ajouter([2,0],[3,0])
      courbe.ajouter([3,1],[2,1.5])
      points = courbe.liste_points()
      points_control = courbe.liste_points_control()
      figure(figsize=(8,8))
      plot_points(points,style='.')
      plot_points(points,style='r-')
      plot_points(points_control,'o')
      axis([0,4,-2,2])
      grid()
      0
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > neirdah
       
      peut-être ainsi:
      import matplotlib
      import matplotlib.pyplot
      matplotlib.pyplot.figure()
      0
    3. neirdah > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      J'ai beau essayer plusieurs méthodes dont la votre, cela ne marche pas.
      0
    4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > neirdah
       
      "cela ne marche pas": que se passe-t-il?
      le petit programme de trois lignes que j'ai montré donne un message d'erreur?
      0
    5. neirdah > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Non mais en l'insérant dans le gros programme j'ai toujours l'erreur "name 'figure' is not defined".
      0
  2. neirdah
     
    eh bien l'erreur se situe justement à la ligne 50 ou je veux faire en sorte de créer le graph pour afficher la courbe.
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      et à quoi correspond ce nom,
      figure
      ?
      ce pourrait-il que tu ne nous montres pas tout ton code?
      0
      1. neirdah > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        effectivement je n'avais pas montré tout le code car je n'étais pas sûr que c'était ce qu'il me fallait et effectivement, je vais préférer la deuxième méthode que je vous ai montré plus haut.
        0
  3. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    Bonjour,

    Du coup, tu peux fermer ton appel du 2 février :

    "programmation d'un circuit"
    0