Courbes de Béziers

Fermé
neirdah - 2 mars 2021 à 16:56
 neirdah - 9 mars 2021 à 16:26
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 23320 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 11 novembre 2024 Ambassadeur 1 552
2 mars 2021 à 16:59
bonjour,
peux-tu préciser à quelle ligne se produit l'erreur?
que veux-tu faire en ligne 50?
0
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 23320 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 11 novembre 2024 1 552 > neirdah
2 mars 2021 à 17:40
peut-être ainsi:
import matplotlib
import matplotlib.pyplot
matplotlib.pyplot.figure()
0
neirdah > yg_be Messages postés 23320 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 11 novembre 2024
2 mars 2021 à 18:31
J'ai beau essayer plusieurs méthodes dont la votre, cela ne marche pas.
0
yg_be Messages postés 23320 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 11 novembre 2024 1 552 > neirdah
2 mars 2021 à 18:40
"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 23320 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 11 novembre 2024
2 mars 2021 à 18:43
Non mais en l'insérant dans le gros programme j'ai toujours l'erreur "name 'figure' is not defined".
0
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 23320 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 11 novembre 2024 1 552
2 mars 2021 à 17:25
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 23320 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 11 novembre 2024
2 mars 2021 à 18:30
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 lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
5 mars 2021 à 11:38
Bonjour,

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

"programmation d'un circuit"
0