TD 2: Les fractales 1 Une classe image 2 L`ensemble de Mandelbrot
Transcription
TD 2: Les fractales 1 Une classe image 2 L`ensemble de Mandelbrot
Programmation Orientée Objets TD 2: Les fractales notions : Création de classes et d’objets simples 1 Une classe image Une image est un tableau à deux dimensions de pixels. Dans notre cas, un pixel est un entier codé sur 24 bits. Les données utiles à une image sont sa largeur et sa hauteur (en nombre de pixels), et le tableau de pixels. Il existe en JAVA la classe BufferedImage qui permet de manipuler simplement des tableaux de pixels. En particulier, si tab est un BufferedImage, on peut utiliser : – Changer la valeur du pixel i,j avec la couleur coul : tab.setRGB(i,j,coul); – Sauvegarder une image dans un fichier sur disque ImageIO.write(tab, "PNG", new File("tt.png")); Sauve le tableau tab dans un fichier de type png, dont le nom est tt.png. Attention : pour utiliser cette fonction, il faut traiter ou rejeter les exceptions que peut produire la fonction write. Pour simplifier, cela se fera à l’aide de throws IOException, qui sera ajouté à l’entête des méthodes main et de sauvegarde : public static void main(String[] arg) throws IOException {...} public void save(String nomdufichier) throws IOException {...} – Créer un objet qui contiendra une image (de type BufferedImage) : tab=new BufferedImage(largeur, hauteur, BufferedImage.TYPE INT RGB); Création d’un tableau de pixel de taille largeur*hauteur de type 24 bits RGB Faire une classe Image contenant : – Un constructeur qui crée une image de x lignes et y colonnes – Une méthode qui sauve une image sur disque en PNG – Une méthode qui construit un carré blanc en haut à gauche de l’image. – Faire un programme qui teste cette classe en créant un fichier image. Remarque L’intensité d’une couleur est codée sur 8 bits, de 0 à 255. Par exemple dans le canal rouge, 0 signifie pas de rouge et 255 un tout rouge qui fait mal aux yeux... Le codage RGB (en anglais Red Green Blue) consiste à représenter la couleur d’un pixel sur un entier 32 bits, chaque octet codant l’intensité dans un canal de couleur. Les 8 bits de poids faible codent le Bleu, les bits 8 à 15 codent le vert et les bits 16 à 23 codent le rouge. Les bits de poids fort sont réservés à la transparence (canal Alpha). Par exemple : le rouge Phelma se code 191 en Rouge et rien dans les autres composantes, soit 0xBF0000 ou 191 << 16. 2 L’ensemble de Mandelbrot On construit l’ensemble de Mandelbrot grâce à des itérations dans le plan complexe. La fonction est de la forme f (z) = z 2 + c, où c est un paramètre. Le premier terme de la suite est nul. On a donc la suite (u) : zn+1 = zn2 + c. Pour chaque point d’affixe x + i ∗ y du plan, on étudie la convergence de Z(u) pour 1 c = x + i ∗ y. Si la suite diverge, on dit que le point testé n’appartient pas à l’ensemble M , si la suite converge, alors le point appartient à M et on le colorie par exemple en noir. Exemples : Pour c = 0 + 0 ∗ i : la suite est définie par z0 = 0 et zn+1 = zn2 La suite est toujours nulle, elle converge (vers 0) et le point de coordonnées (0, 0) appartient à l’ensemble de Mandelbrot pour c = 1 + i : la suite est définie par z0 = 0 et zn+1 = zn2 + 1 + i On a donc : z1 = 1 + i z2 = 1 + 3 ∗ i z3 = −7 + 7 ∗ i z4 = 1 − 97 ∗ i z5 = −9407 − 193 ∗ i z6 = 88454401 + 3631103 ∗ i La suite tend rapidement vers plus l’infini, elle diverge et le point de coordonnées (1, 1) n’appartient pas à l’ensemble de Mandelbrot. Figure 1 – Mandelbrot Pour afficher la fractale, on parcourt tous les pixels de coordonnées x, y de l’image et on regarde la convergence de la suite précédente avec c = x + i ∗ y. Si la suite converge, le pixel de coordonnées x, y est mis à 0 car il appartient à la fractale. Sinon, on stocke dans ce pixel le nombre d’itérations pour lequel on a trouvé que la suite divergeait (module supérieur à 10). On suppose que la suite diverge quand son module dépasse une constante, par exemple 100, et on se limite en général à calculer quelques centaines ou milliers de termes pour détecter la convergence. Remarque : en réalité la partie intéressante de l’ensemble de Mandelbrot se situe autour de l’origine, pour des points de module inférieur à 1. Il est donc plus pertinent de changer l’échelle de l’image et de la centrer. Par exemple, on peut poser c=(x-x0)/taille+i*(y-y0)/taille, où taille=min(largeur,hauteur) et (x0,y0) le pixel au centre de l’image. Créer une fractale de Mandelbrot Créer une classe permettant de générer une image png d’une fractale de Mandelbrot. La classe Image précédent sera naturellement utilisée. 3 Autres Fractales L’ensemble de Julia Soit la suite : z0 = x+i∗y zn+1 = zn2 + c Pour l’ensemble de Julia, c est fixé pendant tout le calcul de l’image et c’est le premier terme de la suite qui dépend du pixel. A chaque c correspond donc un ensemble particulier, noté J(c). Le point A de coordonnées (x, y) et d’affixe x + i ∗ y appartient à J(c) si et seulement si la suite zn converge, où c est un 2 complexe fixé. Quelques valeurs sympa de c, pour les tests : (−0.73,0.19), (−0.156844471694257101941, −0.649707745759247905171), (0.285,0.01), (−1.417022285618,0.0099534) . . . Sur le même principe que précédemment, écrire une classe pour construire une fractale de Julia. (Intéressant : quels sont les points communs et les spécificités de cette fractale par rapport à la précédente ?) Figure 2 – Julia Les fractales de Newton Étudier la convergence de la suite : x0 xn+1 = a+b∗i = xn − (xkn − 1)/(k ∗ xk−1 n ) Figure 3 – Newton 3