Outils pour utilisateurs

Outils du site


nsi:tds:maths:splines:catmull_rom

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
nsi:tds:maths:splines:catmull_rom [2023/01/22 19:09] – [Les données fournies] goupillwikinsi:tds:maths:splines:catmull_rom [2023/01/22 19:32] (Version actuelle) goupillwiki
Ligne 14: Ligne 14:
  
 À l'usage, on réalise que cette méthode donne de bons résultats mais les courbes obtenues sont un peu trop tordues. On bricole un peu et on décide de choisir comme vecteur tangent $\tau\overrightarrow{P_{i-1}P_{i+1}}$ où $\tau$ est un réglage à choisir entre $0$ et $1$. $\tau = 0,5$ est par exemple un bon choix. À l'usage, on réalise que cette méthode donne de bons résultats mais les courbes obtenues sont un peu trop tordues. On bricole un peu et on décide de choisir comme vecteur tangent $\tau\overrightarrow{P_{i-1}P_{i+1}}$ où $\tau$ est un réglage à choisir entre $0$ et $1$. $\tau = 0,5$ est par exemple un bon choix.
 +
 +$\tau$ est appelé **tension**.
  
 ===== Problème des extrémités ===== ===== Problème des extrémités =====
Ligne 63: Ligne 65:
 </code> </code>
  
-==== Une classe Hermite ====+==== Une classe Catmullrom====
  
-Cette classe aura la responsabilité des calculs liés à la spline de Hermite.+Cette classe aura la responsabilité des calculs liés à la spline de Catmull-Rom.
  
 Ajoutez le module suivant à votre projet et complétez les fonctions. Ajoutez le module suivant à votre projet et complétez les fonctions.
  
 <code python> <code python>
-bezier.py+carmullrom.py
  
 from point import Point from point import Point
  
-class Hermite+class Catmullrom
-    def __init__(self, pts, vecteurs):+    def __init__(self, pts, tau = 0.5):
         '''         '''
         pts: liste de paires (x,y) représentant les points         pts: liste de paires (x,y) représentant les points
-        vecteursliste de paires (x,y) représentant les vecteurs+        tautension de la spline. Par défaut 0.5
         '''         '''
         assert len(pts) >= 2, "Il faut au moins deux points dans la spline."         assert len(pts) >= 2, "Il faut au moins deux points dans la spline."
-        assert len(pts) == len(vecteurs), "pts et vecteurs doivent être de même taille" 
         self.points = [Point(x,y) for x,y in pts]         self.points = [Point(x,y) for x,y in pts]
-        self.vecteurs [Point(x,y) for x,y in vecteurs]+        assert 0 <= tau <= 1 
 +        self.tau tau
          
-    def curve_points(self):+    def get_point(self, i):
         '''         '''
-        renvoie la liste des points de self.points qui sont des points de la courbe+        renvoie le point d'indice iSi i =0 ou len(pts), calcule un symétrique
         '''         '''
 +        n = len(self.pts)
 +        assert -1 <= i <= n
 +        if i == -1:
 +            return self.pts[0] * 2 - self.pts[1]
 +        if i == n:
 +            return self.pts[n-1] * 2 - self.pts[n-2]
 +        return self.pts[i] 
 +       
  
     def calc_coeffs(self, i:int):     def calc_coeffs(self, i:int):
         '''         '''
         i:indice de l'arc considéré         i:indice de l'arc considéré
-        la courbe de Bézier est calculée avec les points P0P1P2P3 de l'arc l'arc+        la courbe de Bézier est calculée avec les points P(i-1)P(i)P(i+1)P(i+2)
         on calcule 4 coefficients :         on calcule 4 coefficients :
-        c0 = P0 +        c0 = P(i) 
-        c1 = v0 +        c1 = tau (P(i+1) - P(i-1)) 
-        c2 = 3(P1 P0) -v1 -2v0 +        c2 = -tau P(i+2) + (- 2 tau) P(i+1) + (tau -3P(i) + 2 tau P(i-1) 
-        c3 = v0 v2 + 2(P0 P1)+        c3 = tau P(i+2) (tau - 2) P(i+1) +  (2 - tau) P(i) - tau P(i-1)
         La fonction renvoie c0, c1, c2, c3         La fonction renvoie c0, c1, c2, c3
         remarque: chaque coefficient est de type Point.         remarque: chaque coefficient est de type Point.
         '''         '''
         # vérifie que i est bien une valeur valide : 0 <= i <= n-2         # vérifie que i est bien une valeur valide : 0 <= i <= n-2
-        # récupérer les P0 et P1 aux rangs et i+1 dans les points +        # récupérer les P(i-1), P(i), P(i+1et P(i+2)
-        # récupérer les v0 et v1 aux rangs i et i+1 dans les vecteurs+
         # calculer les coefficients et les renvoie         # calculer les coefficients et les renvoie
                  
Ligne 113: Ligne 122:
         renvoie c0 + c1*t + c2*t**2 + c3*t**3 avec c0, c1, c2, c3         renvoie c0 + c1*t + c2*t**2 + c3*t**3 avec c0, c1, c2, c3
         les coeffs de la fonction précédente.         les coeffs de la fonction précédente.
 +        '''
 +        # obtenir les valeurs des coefficients
 +        # renvoie le résultat du calcul
 +
 +    def tangent(self, t:float, i:int):
 +        t: flottant entre 0 et 1, compris
 +        i: rang de l'arc considéré
 +        renvoie c1 + 2*c2*t + 3*c3*t**2 avec c0, c1, c2, c3
         '''         '''
         # obtenir les valeurs des coefficients         # obtenir les valeurs des coefficients
Ligne 139: Ligne 156:
  
 <code python> <code python>
-demoplot.py+democatmullrom.py
 # démonstration en utilisant matplotlib # démonstration en utilisant matplotlib
  
 import matplotlib.pyplot as plt import matplotlib.pyplot as plt
-from hermite import Hermite+from catmullrom import Catmullrom
  
 pts = [(10,50), (200, 400), (300, 300), (500, 200)] pts = [(10,50), (200, 400), (300, 300), (500, 200)]
-vecteurs = [(50,20), (60, -10), (10, -50), (30,0)] 
  
-Hermite(pts, vecteurs)+spline Catmullrom(pts)
  
 # tracé de la courbe # tracé de la courbe
-pts h.plot_points()+plot_pts spline.plot_points()
 # dans matplotlib, il faut placer les x et les y dans deux listes séparées # dans matplotlib, il faut placer les x et les y dans deux listes séparées
-x = [pt.x for pt in pts+x = [pt.x for pt in plot_pts 
-y = [pt.y for pt in pts]+y = [pt.y for pt in plot_pts ]
 plt.plot(x, y) plt.plot(x, y)
  
 # tracé des points : # tracé des points :
-pts_curve = h.curve_points() +x = [x for x, y in pts] 
-x = [pt.x for pt in pts] +y = [y for x, y in pts]
-y = [pt.y for pt in pts]+
 plt.scatter(x, y, c='b') plt.scatter(x, y, c='b')
  
nsi/tds/maths/splines/catmull_rom.1674410961.txt.gz · Dernière modification : de goupillwiki