Outils pour utilisateurs

Outils du site


itc:tps:tp4:exercice1

Différences

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

Lien vers cette vue comparative

Prochaine révision
Révision précédente
itc:tps:tp4:exercice1 [2021/12/03 13:52] – créée goupillwikiitc:tps:tp4:exercice1 [2021/12/13 13:36] (Version actuelle) goupillwiki
Ligne 1: Ligne 1:
 ====== Dessin du flocon de Von Koch ====== ====== Dessin du flocon de Von Koch ======
  
-===== Le type ''complex'' en Python =====+===== Le type complex en Python =====
  
 Pour travailler en Python avec les nombres complexes, on dispose du type natif ''complex'' que l'on complète en important le module ''cmath''. Pour travailler en Python avec les nombres complexes, on dispose du type natif ''complex'' que l'on complète en important le module ''cmath''.
Ligne 35: Ligne 35:
 </code> </code>
  
-===== Un motif =====+===== Tracer ===== 
 + 
 +On utilise le module ''pyplot'' de la bibliothèque ''matplotlib'' avec l'alias ''plt''
 + 
 +<code python> 
 +import matplotlib.pyplot as plt 
 +</code> 
 + 
 +**Rappel :** Pour tracer une ligne polygonale ABCD..., on utilise ''plt.plot''. Par exemple, si les points ont les coordonnées ''(1, 2)'', ''(3,4)'', ''(10,21)'', ''(5, 13)'', on écrira : 
 + 
 +<code python> 
 +plt.plot([1, 3, 10, 5], [2, 4, 21, 13], 'k'
 +# k pour noir. Autrement r pour rouge, b pour bleu 
 +</code> 
 + 
 +<WRAP tip> 
 +  * ''%%plt.axis('equal')%%'' force un affichage orthonormé 
 +  * ''plt.show()'' demande l'affichage de la fenêtre graphique. À placer en dernier. 
 +</WRAP> 
 + 
 +<WRAP box> 
 +**À faire :** écrire une fonction ''plot_complex(Z, color)'' qui reçoit un tableau ''Z'' de nombres complexes et un argument de couleur -- comme ''%%'k'%%'', ''%%'r'%%'' ou ''%%'b'%%'' --  La fonction trace la ligne polygonale dont les sommets ont les affixes de ''Z'', dans la couleur demandée. 
 + 
 +Vous pourrez tester avec ''Z = [1, 4+2j, 6+8j, 2+6j]'' 
 +</WRAP> 
 + 
 +====== Motif élémentaire =====
  
 On sait que dans le plan complexe l'image d'un point $M$ d'affixe $z$ par une rotation de centre $\Omega$ d’affixe $\omega$ et d’angle $\theta$ est le point $M'$ d'affixe $z'$ telle que $z' - \omega = \text{e}^{i\,\theta} (z - \omega)$, c'est-à-dire $z' = \omega + \text{e}^{i\,\theta} (z - \omega)$. On sait que dans le plan complexe l'image d'un point $M$ d'affixe $z$ par une rotation de centre $\Omega$ d’affixe $\omega$ et d’angle $\theta$ est le point $M'$ d'affixe $z'$ telle que $z' - \omega = \text{e}^{i\,\theta} (z - \omega)$, c'est-à-dire $z' = \omega + \text{e}^{i\,\theta} (z - \omega)$.
Ligne 43: Ligne 69:
 {{ :itc:tps:tp4:flocon_2.png?direct&400 |}} {{ :itc:tps:tp4:flocon_2.png?direct&400 |}}
  
-On utilise le module ''pyplot'' de la bibliothèque ''matplotlib'' et on précise que 
-  * le tracé d'un segment d'extrémités ''A1 = (x1, y1)'' et ''A2 = (x2, y2)'' s'obtient par ''%%plt.plot([x1,x2], [y1,y2],'k')%%'', avec ''%%'k'%%'' pour noir (//black//) 
-  * le tracé d'une ligne brisée ''A1A2...An'' , avec ''Ai = (xi, yi)'', s'obtient avec la commande 
-''%%plt.plot([x1,x2,...,xn],[y1,y2,...,yn], 'r')%%'' (en rouge). 
  
-On crée d'abord une fonction qui réalise une rotation plane connaissant son centre et son angle+Partant des points $A$ et $B$, on doit déterminer la position des points $C$, $D$ et $E$
-Avec un angle de $\frac{\pi}{3}$$Aet $Bétant donnés, on construit ainsi un point $C$ tel que $ABCsoit un triangle équilatéral qui tourne dans le sens trigonométrique positif.+  $C$ est tel que $\overrightarrow{AC} = \frac{1}{3} \overrightarrow{AB}$ 
 +  * $D$ est tel que $\overrightarrow{AD} = \frac{2}{3} \overrightarrow{AB}$ 
 +  * $Eest l'image de $Dpar la rotation de centre $C$ et d'angle $\frac{pi}{3}$.
  
 +<WRAP box>**À faire :** écrire une fonction ''decoupe(a, b)'' qui reçoit les affixes de $A$ et $B$ et qui renvoie les affixes $A$, $C$, $E$, $D$, $B$ dans cet ordre, dans un tableau.
 +</WRAP>
 +
 +===== Côté du flocon =====
 +
 +La fonction précédente remplace un segment par une ligne polygonale de 4 segments. On voudrait répéter ce processus sur les 4 segments.
 +
 +Autrement dit, nous sommes partis de $AB$ et sommes arrivés à la ligne $ACEDB$. On voudrait faire de même sur $AC$, $CE$, $ED$, $DB$.
 +
 +Et ainsi de suite jusqu'à une certaine limite -- mathématiquement on peut imaginer faire cela à l'infini, mais en informatique l'infini est hors de portée.
 +
 +On a une fonction récursive. Nous allons écrire une fonction ''decoupe_rec(affixes_in, n, extr)'' qui reçoit ''affixes_in'', un tableau d'affixes ; ''n'' indiquant la profondeur à atteindre dans la récursion. La fonction renvoie le tableau des affixes obtenues après découpage.
 +
 +<code lang-none linenums:1>
 +FONCTION decoupe_rec(affixes_in, n)
 +ENTRÉES:
 +  affixes_in: tableau d'affixes de la ligne à découper
 +  n: profondeur de la récursion
 +SORTIE: affixe_out, tableau des affixes résultant du découpage de affixe_in
 +DÉBUT
 +  SI n = 0 ALORS
 +    RENVOYER affixes_in
 +  FIN
 +  N = nombre d'items dans affixe_in
 +  affixes_out est tableau vide
 +  POUR i ALLANT DE 0 À N-2 FAIRE
 +    A est affixes_in[i]
 +    B est affixes_in[i+1]
 +    ACEDB est le résultat de decoupe(A, B)
 +    # on poursuit le découpage récursivement
 +    rec_AB est le résultat de decoupe_rec(ACEDB, n-1)
 +    ajouter les affixes de rec_AB au bout de affixes_out
 +      sauf le dernier
 +  FIN
 +  ajouter l'affixe du dernier points au bout de affixes_out
 +  RENVOYER affixes_out
 +FIN
 +</code>
 +
 +<WRAP box>**À faire :** écrivez la fonction ''decoupe_rec'' en Python.</WRAP>
 +
 +===== Dessiner le flocon =====
 +
 +<WRAP box>**À faire :** exécutez
 +<code python>
 +affixes = [0+0j, 3+0j, 6-j]
 +flocon = decoupe_rec(affixes, 2)
 +plot_complex(flocon, 'r')
 +</code>
  
 +Modifiez les affixes pour obtenir un flocon hexagonal.
 +</WRAP>
itc/tps/tp4/exercice1.1638535966.txt.gz · Dernière modification : de goupillwiki