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

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour,
peux-tu préciser à quelle ligne se produit l'erreur?
que veux-tu faire en ligne 50?
0
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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > neirdah
 
peut-être ainsi:
import matplotlib
import matplotlib.pyplot
matplotlib.pyplot.figure()
0
neirdah > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
J'ai beau essayer plusieurs méthodes dont la votre, cela ne marche pas.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > 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
neirdah > yg_be Messages postés 23541 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
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
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
et à quoi correspond ce nom,
figure
?
ce pourrait-il que tu ne nous montres pas tout ton code?
0
neirdah > yg_be Messages postés 23541 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
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
Bonjour,

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

"programmation d'un circuit"
0