nsi:tds:maths:splines:catmull_rom
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| nsi:tds:maths:splines:catmull_rom [2023/01/22 19:09] – [Les données fournies] goupillwiki | nsi:tds:maths:splines:catmull_rom [2023/01/22 19:32] (Version actuelle) – goupillwiki | ||
|---|---|---|---|
| Ligne 14: | Ligne 14: | ||
| À l' | À l' | ||
| + | |||
| + | $\tau$ est appelé **tension**. | ||
| ===== Problème des extrémités ===== | ===== Problème des extrémités ===== | ||
| Ligne 63: | Ligne 65: | ||
| </ | </ | ||
| - | ==== Une classe | + | ==== Une classe |
| - | 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, | + | def __init__(self, |
| ''' | ''' | ||
| pts: liste de paires (x,y) représentant les points | pts: liste de paires (x,y) représentant les points | ||
| - | | + | |
| ''' | ''' | ||
| 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), | ||
| self.points = [Point(x,y) for x,y in pts] | self.points = [Point(x,y) for x,y in pts] | ||
| - | self.vecteurs | + | |
| + | | ||
| | | ||
| - | def curve_points(self): | + | def get_point(self, i): |
| ''' | ''' | ||
| - | renvoie | + | renvoie |
| ''' | ''' | ||
| + | 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, | def calc_coeffs(self, | ||
| ''' | ''' | ||
| 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 | + | la courbe de Bézier est calculée avec les points |
| 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) + (3 - 2 tau) P(i+1) + (tau -3) P(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 i et i+1 dans les points | + | # récupérer les P(i-1), P(i), P(i+1) et 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: 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 | + | from 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)] | ||
| - | h = Hermite(pts, vecteurs) | + | spline |
| # tracé de la courbe | # tracé de la courbe | ||
| - | pts = h.plot_points() | + | plot_pts |
| # 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, | plt.scatter(x, | ||
nsi/tds/maths/splines/catmull_rom.1674410961.txt.gz · Dernière modification : de goupillwiki
