Outils pour utilisateurs

Outils du site


tp:python:zoom_fractales

Warning: Undefined array key "lang" in /home/signac/doku/lib/plugins/wrap/helper.php on line 94

Warning: Undefined array key "id" in /home/signac/doku/lib/plugins/wrap/helper.php on line 117

Warning: Undefined array key "width" in /home/signac/doku/lib/plugins/wrap/helper.php on line 119

Warning: Undefined array key "dir" in /home/signac/doku/lib/plugins/wrap/helper.php on line 128

Warning: Undefined array key "lang" in /home/signac/doku/lib/plugins/wrap/helper.php on line 94

Warning: Undefined array key "id" in /home/signac/doku/lib/plugins/wrap/helper.php on line 117

Warning: Undefined array key "width" in /home/signac/doku/lib/plugins/wrap/helper.php on line 119

Warning: Undefined array key "dir" in /home/signac/doku/lib/plugins/wrap/helper.php on line 128

Warning: Undefined array key "lang" in /home/signac/doku/lib/plugins/wrap/helper.php on line 94

Warning: Undefined array key "id" in /home/signac/doku/lib/plugins/wrap/helper.php on line 117

Warning: Undefined array key "width" in /home/signac/doku/lib/plugins/wrap/helper.php on line 119

Warning: Undefined array key "dir" in /home/signac/doku/lib/plugins/wrap/helper.php on line 128

Warning: Undefined array key "lang" in /home/signac/doku/lib/plugins/wrap/helper.php on line 94

Warning: Undefined array key "id" in /home/signac/doku/lib/plugins/wrap/helper.php on line 117

Warning: Undefined array key "width" in /home/signac/doku/lib/plugins/wrap/helper.php on line 119

Warning: Undefined array key "dir" in /home/signac/doku/lib/plugins/wrap/helper.php on line 128

Warning: Undefined array key "lang" in /home/signac/doku/lib/plugins/wrap/helper.php on line 94

Warning: Undefined array key "id" in /home/signac/doku/lib/plugins/wrap/helper.php on line 117

Warning: Undefined array key "width" in /home/signac/doku/lib/plugins/wrap/helper.php on line 119

Warning: Undefined array key "dir" in /home/signac/doku/lib/plugins/wrap/helper.php on line 128

Warning: Undefined array key "lang" in /home/signac/doku/lib/plugins/wrap/helper.php on line 94

Warning: Undefined array key "id" in /home/signac/doku/lib/plugins/wrap/helper.php on line 117

Warning: Undefined array key "width" in /home/signac/doku/lib/plugins/wrap/helper.php on line 119

Warning: Undefined array key "dir" in /home/signac/doku/lib/plugins/wrap/helper.php on line 128

Warning: Undefined array key "lang" in /home/signac/doku/lib/plugins/wrap/helper.php on line 94

Warning: Undefined array key "id" in /home/signac/doku/lib/plugins/wrap/helper.php on line 117

Warning: Undefined array key "width" in /home/signac/doku/lib/plugins/wrap/helper.php on line 119

Warning: Undefined array key "dir" in /home/signac/doku/lib/plugins/wrap/helper.php on line 128

Warning: Undefined array key "lang" in /home/signac/doku/lib/plugins/wrap/helper.php on line 94

Warning: Undefined array key "id" in /home/signac/doku/lib/plugins/wrap/helper.php on line 117

Warning: Undefined array key "width" in /home/signac/doku/lib/plugins/wrap/helper.php on line 119

Warning: Undefined array key "dir" in /home/signac/doku/lib/plugins/wrap/helper.php on line 128

Warning: Undefined array key "lang" in /home/signac/doku/lib/plugins/wrap/helper.php on line 94

Warning: Undefined array key "id" in /home/signac/doku/lib/plugins/wrap/helper.php on line 117

Warning: Undefined array key "width" in /home/signac/doku/lib/plugins/wrap/helper.php on line 119

Warning: Undefined array key "dir" in /home/signac/doku/lib/plugins/wrap/helper.php on line 128

Zoom sur les fractales

Les frontières des ensembles de Mandelbrot ou de Julia (voir les autres TPs fractales) sont indéfiniment découpées. En zoomant sur ces frontières, de nouveaux détails apparaissent indéfiniment. Pouvoir zoomer sur ces ensembles permet d'illustrer le caractères fractal de ces ensembles. Zoom sur l'ensemble de Mandelbrot

Prérequis

Vous devez :

  • avoir tracé l'ensemble de Mandelbrot ou de Julia,
  • avoir pris connaissance de la documentation Graphismes en Python et en particulier la partie sur la gestion des évènements (voir le fichier clicsouris.py)

Si la gestion des évènements est mal comprise, ne passez pas à la suite et demandez de l'aide.

Comprendre ce qu'est la gestion des évènements en partant de l'exemple donné signifie :

  1. télécharger le fichier .py
  2. tester le fonctionnement du fichier, voir à quoi il sert
  3. lire le source et comprendre chaque ligne
  4. ne pas hésiter à apporter des modification au code pour en comprendre certains passages

La suite est découpée en étapes qu'il faut faire dans l'ordre. Vérifiez à chaque étape que vous avez fait le travail nécessaire avant de passer à la suite.

Références

Travail à rendre

  • Fichier login_zoom.py, commenté, docstringué LOL
  • Une image au format PNG (400×400, bien taillée, etc….)
  • Rapport au format PDF

Principe du zoom

Pour tracer les images, vous avez utilisé une fonction (probablement nommée conversion) qui utilise les bornes de tracé de l'ensemble ([-2;05]x[-1.25;1.25] dans le cas de Mandelbrot, probablement [-1.25;1.25]x[-1.25;1.25] pour un exeemble de Julia) pour convertir les coordonnées d'un pixel en nombre complexe utilisé dans le calcul des suites.

Etape 1 : passage des bornes en variables globales

Reprenez les formules qui figurent dans la fonction conversion et supprimez les valeurs numériques relatives à la zone de tracé [-2;0.5][-1.25;1.25]. À la place de ces valeurs, doivent figurer les variables «globales» _xmin,_xmax,_ymin,_ymax. Ces variables globales seront initialisées au début du script aux valeurs habituelles, -2, 2, -1.25, 1.25 (pour Mandelbrot). Testez pour vérifier que le programme fonctionne toujours.

Dans la fonction conversion, vous devez remplacer les valeurs numériques par des «formules» qui font intervenir les 4 variables _xmin,_xmax,_ymin et _ymax.

Puis, ces variables doivent être définies de manière globale. Un bon emplacement pour le faire est juste apr-s les import, en début de fichier.

Reportez vous à ces recommandations : [[stu:python:python_notes&#structure_de_programme_propre|Notes sur Python - Programme propre]] pour comprendre comment utiliser les variables globales.

Lorsque vous avez fait cette première modification et que le programme est bien fonctionnel, modifiez les 4 valeurs en : [-0.75; 0.5] x [0 ; 1.25] (vous pouvez choisir d'autres valeurs si vous savez ce que vous faites). Que constatez-vous ? Que faut-il faire pour zoomer ? Vous rédigerez la réponse à cette question le plus clairement possible dans votre rapport.

Etape 2 : formules du zoom

La modification des 4 variables globales ne modifie pas que la largeur des intervalles de variation de c, mais aussi le centre de ces intervalles. Pour vous en convaincre, remplacez [-0.75; 0.5] x [0 ; 1.25] par [-0.75; 0.5] x [-0.625; 0.625] (les intervalles ont ici la même largeur). Les deux images ont le même facteur de zoom, mais ne sont pas centrées au même endroit.

Lorsque l'utilisateur clique un point à l'écran, il est possible de faire correspondre à ce point un nombre complexe, dont la partie réelle sera comprise entre _xmin et _xmax et la partie imaginaire entre _ymin et _ymax.

À supposer que les parties réelles et imaginaires associées au point cliqué par l'utilisateur soient égales à xu et yu, quelle transformation doit on appliquer aux bornes pour réaliser un zoom X2 autour du point cliqué ? Cette transformation donnera les nouvelles valeurs de chaque borne en fonction de _xmin, _xmax, _ymin, _ymax, xu, et yu. Donnez l'algorithme correspondant à cette transformation dans votre rapport.

Étape 3 : Boucle des évènements

Nous allons à présent intégrer la gestion des évènements à votre programme. Pour cela, vous devez largement vous inspirer du programme clicsouris.py donné dans la documentation [[stu:python_gui:pygame|Graphismes en Python]].

Après avoir bien compris ce programme, reprenez en la boucle des évènements, ainsi que la fonction clic. Vous devez vous retrouver finalement avec un programme qui trace l'ensemble de Mandelbrot oud e Julia, puis attend un clic souris. Lorsque vous cliquez, un point de couleur doit apparaître à l'endroit cliqué par dessus la fractale.

Vérifiez bien que l'affichage de la fractale est situé dans une fonction séparée (qui devrait s'appeler ''trace(…)). C'est cette fonction qui affiche effectivement l'image de la fractale. </WRAP> Vérifiez que votre programme fonctionne toujours, que la fractale apparaît, que les points de couleur apparaissent lorsque vous cliquez et que vous pouvez quitter le programme complètement et proprement en cliquant simplement sur la croix de fermeture de la fenêtre. ==== Étape 4 : Enfin le zoom…==== Vous allez à présent apporter des modifications à la boucle des évènements et à la procédure clic. Dans cette dernière, plutôt que de faire apparaître un point de couleur, vous devrez recalculer les valeurs _xmin, _xmax… comme indiqué à l'étape 2, et ceci en fonction des coordonnées cliquées par l'utilisateur.

Pour modifier des variables globales (si le type est Non modifiable comme c'est le cas pour les float) dans une fonction, il est nécessaire, au début de cette fonction de l'annoncer en écrivant ((En fait, si le type est non modifiable, c'est la **référence** qu'on modifie, et c'est pour cette raison qu'on utilise le mot clé ''global'')) :

global _xmin,_xmax,_ymin,_ymax

Dans la boucle des évènements, un clic souris devra non seulement provoquer un appel à la fonction clic, mais aussi un réaffichage (donc un recalcul) de la fractale.

Réalisez ces modifications et vérifiez que votre programme est fonctionnel. En particulier, vérifiez bien que le zoom se retrouve centré sur le point cliqué. ==== Étape 5 : Améliorations ==== Différenciez les boutons de manière à ce qu'un * clic gauche réalise un zoom *2 * clic droit réalise un zoom /2 * clic milieu recentre simplement l'image Vérifiez bien qu'un cli gauche suivi d'un clic droit redonne l'image d'origine.

Modifiez le programme pour obtenir un zoom *10 à la place du zoom *2. Puis, zoomez plusieurs fois en restant dans une zone frontalière contenant des détails. Au bout de 5 ou 6 zooms successifs, qu'observez-vous ? Pouvez-vous l'expliquer ? Continuez à zoomer très précisément sur la frontière une dizaine de fois (ou un peu plus). Il se produit un nouveau phénomène. Pouvez-vous l'expliquer ?

Sol

tp/python/zoom_fractales.txt · Dernière modification: 2014/03/31 17:24 (modification externe)