Mai 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | Calendrier |
|
| | Figures fractales | |
|
+5jjn4 Marc jdebord Froggy One jean_debord 9 participants | |
Auteur | Message |
---|
jean_debord
Nombre de messages : 1250 Age : 69 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Figures fractales Ven 27 Mai 2022 - 20:48 | |
| Merci pour le test Marc Oui les temps de calculs sont assez courts, bien que la formule soit plus compliquée que pour l'ensemble classique, à cause de la fonction exponentielle. La dernière image correspond au grandissement maximum autorisé par les nombres en double précision (~ 10^14). Pour agrandir encore il faudra passer en précision étendue et là les temps de calcul vont se compter en heures ! | |
| | | Minibug
Nombre de messages : 4566 Age : 57 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Figures fractales Ven 27 Mai 2022 - 21:05 | |
| Toutes ces images me laissent rêveur... Toutes plus fantastiques les unes que les autres ! Merci Jean. | |
| | | jean_debord
Nombre de messages : 1250 Age : 69 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Figures fractales Ven 3 Juin 2022 - 11:55 | |
| Merci minibug Une autre formule, popularisée sur le site fractalforums.org sous le nom "Catalisator" - Code:
-
' ********************************************************************** ' Ensembles de Mandelbrot/Julia : f(z) = z * sinh(z) - c^2 (Catalisator) ' **********************************************************************
' Parametres de base (a modifier eventuellement)
const PicWidth = 600 ' Largeur de l'image const PicHeight = 400 ' Hauteur de l'image const InsideCol = CL_BLANC ' Couleur de la partie interne
dim Nom$ ' Nom de l'image dim x0 ' Coord. X du centre dim y0 ' Coord. Y du centre dim MaxIter% ' Nb maxi d'iterations dim ZoomFact ' Facteur de zoom dim DistFact ' Plus negatif ==> contour plus sombre dim ColorFact ' 0 pour noir et blanc, positif pour bandes de couleur dim cx, cy ' Constante c pour l'ensemble de Julia dim Julia& ' Ensemble de Julia ?
' ---------------------------------------------------------------------- ' Exemple ' ----------------------------------------------------------------------
' Nom x0 y0 maxit zoom dist col cx cy init_params "MandelCat", 0, 0, 200, 2, -0.5, -1, 0, 0
' **********************************************************************
' Parametres supplementaires
const HalfPicWidth = PicWidth \ 2 const HalfPicHeight = PicHeight \ 2 const Esc = 1.0E+10 ' Rayon d'echappement const LnEsc = log(Esc)
const p = 2 const Lnp = log(2) ' Pour la coloration
dim ColFact, AbsCol, ScaleFact SetParams()
' **********************************************************************
' Programme principal
dim x%, y%, btn%, key$
mode 3, "Clic gauche : zoom + / Clic droit : zoom - / S : sauvegarde / ESC : quitte", PicWidth, PicHeight colormap PicWidth, PicHeight, fadr(mandelbrot)
repeat get_mouse x, y, btn
if btn = 1 or btn = 2 then getcoord x0, y0, x, y
SetZoom(btn = 1) SetParams()
colormap PicWidth, PicHeight, fadr(mandelbrot) end_if
key = inkey() if upper(key) = "S" then save() until key = "ESCAPE"
' **********************************************************************
' Sous-programmes
sub init_params(_Nom$, _x0, _y0, _MaxIter%, _ZoomFact, _DistFact, _ColorFact, _cx, _cy) ' Initialise les parametres
Nom = _Nom x0 = _x0 y0 = _y0 MaxIter = _MaxIter ZoomFact = _ZoomFact DistFact = _DistFact ColorFact = _ColorFact cx = _cx cy = _cy
Julia = (cx <> 0) or (cy <> 0) end_sub
sub init_sub (xt, yt, c@, z@, dz@) ' Initialise les iterations au point (xt, yt)
dim r
if Julia then c = cmplx(cx, cy) z = cmplx(xt, yt) dz = cmplx(-2, 0) else c = cmplx(xt, yt) z = C_zero dz = C_zero end_if end_sub
sub iter_sub (c@, z@, dz@, zn@, dzn@) ' Calcul d'une iteration
dim sinhz@, coshz@
sinhz = csinh(z) coshz = ccosh(z)
zn = z * sinhz - c * c dzn = dz * (z * coshz + sinhz) if not Julia then dzn = dzn - 2 * c end_sub
sub SetParams () ColFact = 0.01 * ColorFact AbsCol = abs(ColFact) ScaleFact = 4 / (PicHeight * ZoomFact) end_sub
sub SetZoom (zoom%) if zoom then ZoomFact = 5 * ZoomFact MaxIter = 1.25 * MaxIter ColorFact = 1.1 * ColorFact else ZoomFact = ZoomFact / 5 MaxIter = MaxIter / 1.25 ColorFact = ColorFact / 1.1 end_if end_sub
function rgbcol% (iter%, a, v) ' Determine la teinte (Hue) et la saturation d'apres le "Continuous Dwell"
dim angle, radius, h, s, rr%, gg%, bb%
if a < 0.5 then a = 1 - 1.5 * a angle = 1 - a else a = 1.5 * a - 0.5 angle = a end_if
radius = sqr(a)
if (ColFact > 0) and odd(iter) then v = 0.85 * v radius = 0.667 * radius end if
h = frac(angle * 10) * 360 s = frac(radius)
HSVtoRGB h, s, v, rr, gg, bb return RGB(rr, gg, bb) end_function
function mdbcol% (iter%, mz, mdz) ' Coloration pour les ensembles de Mandelbrot/Julia ' Retourne la couleur RGB d'un point en fonction de : ' iter = nb d'iterations ' mz, mdz = modules de z et de (dz/dc) a l'iteration iter ' Methode de coloration d'apres R. Munafo (http://mrob.com/pub/muency/color.html)
dim lmz, dist, dwell, dscale, a, v
' Determiner la luminosite (Value) d'apres l'estimateur de distance
lmz = log(mz)
dist = p * mz * lmz / mdz dscale = log(dist / ScaleFact) / Lnp + DistFact
if dscale > 0 then v = 1 elseif dscale > -8 then v = 1 + dscale / 8 else v = 0 end_if dwell = iter + log(LnEsc / lmz) / Lnp a = log(abs(dwell)) * AbsCol return rgbcol(iter, a, v) end_function
function mandelbrot% (x%, y%) ' Iteration de la fonction complexe au point (x, y)
dim iter% dim c@, z@, dz@, zn@, dzn@ dim xt, yt, mz, mdz
xt = x0 + ScaleFact * (x - HalfPicWidth) yt = y0 + ScaleFact * (y - HalfPicHeight)
init_sub xt, yt, c, z, dz
iter = 0 mz = cabs(z)
while iter < MaxIter and mz < Esc iter_sub c, z, dz, zn, dzn z = zn dz = dzn mz = cabs(z) iter = iter + 1 wend
if iter = MaxIter then return InsideCol
mdz = cabs(dz) return mdbcol(iter, mz, mdz) end_function
sub getcoord (x0, y0, x%, y%) ' Calcule les coordonnees (x0,y0) du centre ' d'apres la position (x,y) de la souris
x0 = x0 + ScaleFact * (x - HalfPicWidth) y0 = y0 + ScaleFact * (y - HalfPicHeight) end_sub
sub save () ' Sauvegarde l'image et les parametres
img_save Nom + ".png" openout #1, Nom + ".cat" write #1, Nom, x0, y0, MaxIter, ZoomFact, DistFact, ColorFact, cx, cy closeout #1 end_sub
Mais elle ne catalyse pas à tort car elle crée de belles images. On y retrouve les motifs "floraux" caractéristiques des fonctions exponentielles. C'est un peu encombré mais on trouve facilement des mini-ensembles de Mandelbrot. Ici l'allure générale et un agrandissement dans la vallée entre les deux bulbes principaux : | |
| | | jean_debord
Nombre de messages : 1250 Age : 69 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Figures fractales Mar 1 Nov 2022 - 16:39 | |
| | |
| | | jean_debord
Nombre de messages : 1250 Age : 69 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Figures fractales Jeu 9 Mar 2023 - 11:36 | |
| Ensemble de Julia, d'après Paul BourkeFormule : z^6 - 0.14 / z Programme FBCroco : mandelinv Code d'initialisation : - Code:
-
init_params "Septagon",6,1,0,0,0,0,3000,1.75,-2,-3,-0.14,0
Image globale et 2 agrandissements : | |
| | | jjn4
Nombre de messages : 2693 Date d'inscription : 13/09/2009
| Sujet: Re: Figures fractales Jeu 9 Mar 2023 - 14:13 | |
| Ouuuaaaahhhh !!! Plus jolie que jamais !!! | |
| | | jean_debord
Nombre de messages : 1250 Age : 69 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Figures fractales Dim 29 Oct 2023 - 9:04 | |
| Voici la version crocodilienne du programme récemment proposé par papydall pour générer des ensembles de Julia : - Code:
-
' ********************************************************************** ' Ce programme trace des ensembles de Julia situes sur un ' cercle entourant l'ensemble de Mandelbrot ' ---------------------------------------------------------------------- ' D'apres un programme de Papydall : ' https://panoramic.1fr1.net/t6918-animation-sur-l-ensemble-de-julia#82546 ' **********************************************************************
' Parametres de base (a modifier eventuellement)
const Rho = 1 ' Rayon du cercle const Delta = Pi / 180 ' Angle unitaire const PicWidth = 500 ' Largeur de l'image const PicHeight = 500 ' Hauteur de l'image const InsideCol = CL_BLANC ' Couleur de la partie interne const x0 = 0 ' Coord. X du centre const y0 = 0 ' Coord. Y du centre const MaxIter = 1000 ' Nb maxi d'iterations const ZoomFact = 1.2 ' Facteur de zoom const DistFact = -2 ' Plus negatif ==> contour plus sombre const ColorFact = 3 ' 0 pour noir et blanc, positif pour bandes de couleur
' **********************************************************************
' Parametres supplementaires
const HalfPicWidth = PicWidth \ 2 const HalfPicHeight = PicHeight \ 2 const Esc = 1.0E+10 ' Rayon d'echappement const LnEsc = log(Esc) const Ln2 = log(2)
dim ColFact, AbsCol, ScaleFact
' **********************************************************************
' Programme principal
dim Nom$, i%, theta, cx, cy
mode 3, "Creation des ensembles de Julia", PicWidth, PicHeight
for i = 0 to 359 Nom = "julia_" & dec(i, "000") theta = i * Delta cx = Rho * cos(theta) cy = Rho * sin(theta) SetParams() ? "Creation de l'ensemble "; Nom colormap PicWidth, PicHeight, fadr(mandelbrot) img_save Nom + ".png" next i
' **********************************************************************
sub SetParams () ColFact = 0.01 * ColorFact AbsCol = abs(ColFact) ScaleFact = 4 / (PicHeight * ZoomFact) end_sub
sub init_sub (xt, yt, c@, z@, dz@) ' Initialise les iterations au point (xt, yt)
c = cmplx(cx, cy) z = cmplx(xt, yt) dz = C_one end_sub
sub iter_sub (c@, z@, dz@, zn@, dzn@) ' Calcul d'une iteration
zn = z * z + c ' z^2 + c dzn = 2 * z * dz ' Derivee dz/dc end_sub
function rgbcol% (iter%, q, v) ' Determine la teinte (Hue) et la saturation d'apres le "Continuous Dwell"
dim angle, radius, h, s, r%, g%, b%
if q < 0.5 then q = 1 - 1.5 * q angle = 1 - q else q = 1.5 * q - 0.5 angle = q end_if
radius = sqr(q)
if (ColFact > 0) and odd(iter) then v = 0.85 * v radius = 0.667 * radius end if
h = frac(angle * 10) * 360 s = frac(radius)
HSVtoRGB h, s, v, r, g, b return RGB(r, g, b) end_function
function mdbcol% (iter%, mz, mdz) ' Coloration pour les ensembles de Mandelbrot/Julia ' Retourne la couleur RGB d'un point en fonction de : ' iter = nb d'iterations ' mz, mdz = modules de z et de (dz/dc) a l'iteration iter ' Methode de coloration d'apres R. Munafo (http://mrob.com/pub/muency/color.html)
dim lmz, dist, dwell, dscale, q, v
' Determiner la luminosite (Value) d'apres l'estimateur de distance
lmz = log(mz)
dist = 2 * mz * lmz / mdz dscale = log(dist / ScaleFact) / Ln2 + DistFact
if dscale > 0 then v = 1 elseif dscale > -8 then v = 1 + dscale / 8 else v = 0 end_if dwell = iter + log(LnEsc / lmz) / Ln2 q = log(abs(dwell)) * AbsCol return rgbcol(iter, q, v) end_function
function mandelbrot% (x%, y%) ' Iteration de la fonction complexe au point (x, y)
dim iter% dim c@, z@, dz@, zn@, dzn@ dim xt, yt, mz, mdz
xt = x0 + ScaleFact * (x% - HalfPicWidth) yt = y0 + ScaleFact * (y% - HalfPicHeight)
init_sub xt, yt, c, z, dz
iter = 0 mz = cabs(z)
while iter < MaxIter and mz < Esc iter_sub c, z, dz, zn, dzn z = zn dz = dzn mz = cabs(z) iter = iter + 1 wend
if iter = MaxIter then return InsideCol
mdz = cabs(dz) return mdbcol(iter, mz, mdz) end_function
Les images sont sauvegardées au format PNG. Soit environ 50 mégaoctets d'images avec les réglages par défaut. Vous pouvez désactiver la sauvegarde en commentant la ligne img_save ... dans le programme principal. Un exemple d'image générée : | |
| | | papydall
Nombre de messages : 7002 Age : 73 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Figures fractales Lun 30 Oct 2023 - 23:01 | |
| Merci Jean pour le partage. | |
| | | jean_debord
Nombre de messages : 1250 Age : 69 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Figures fractales Jeu 2 Nov 2023 - 11:46 | |
| Merci papydall ! Voici une variante. Ici on tourne autour du "bourgeon" situé à gauche sur l'ensemble de Mandelbrot. On fait juste un demi-tour à cause de la symétrie (mais vous pouvez modifier les paramètres). Le numéro de l'image et les coordonnées du point sont écrites en haut pour qu'on puisse la retracer. - Code:
-
' ********************************************************************** ' Ce programme trace des ensembles de Julia situes sur un cercle ' entourant le principal "bourgeon" de l'ensemble de Mandelbrot ' ---------------------------------------------------------------------- ' D'apres un programme de Papydall : ' https://panoramic.1fr1.net/t6918-animation-sur-l-ensemble-de-julia#82546 ' **********************************************************************
' Parametres de base (a modifier eventuellement)
const Xc = -1 ' Centre du cercle en (Xc, Yc) const Yc = 0 const Rho = 0.27 ' Rayon du cercle const Delta = Pi / 180 ' Angle unitaire const NPics = 180 ' Nb d'images a tracer const PicWidth = 512 ' Largeur de l'image const PicHeight = 400 ' Hauteur de l'image const InsideCol = CL_BLANC ' Couleur de la partie interne const MaxIter = 1000 ' Nb maxi d'iterations const ZoomFact = 1.5 ' Facteur de zoom const DistFact = -1 ' Plus negatif ==> contour plus sombre const ColorFact = 3 ' 0 pour noir et blanc, positif pour bandes de couleur
' **********************************************************************
' Parametres supplementaires
const HalfPicWidth = PicWidth \ 2 const HalfPicHeight = PicHeight \ 2
const x0 = 0 ' Centre de l'ensemble de Julia const y0 = 0 const Esc = 1.0E+10 ' Rayon d'echappement const LnEsc = log(Esc) const Ln2 = log(2)
const Fmt = "0.000000" ' Format d'affichage des nombres
dim ColFact, AbsCol, ScaleFact
' **********************************************************************
' Programme principal
dim Nom$, i%, theta, cx, cy
mode 3, "Creation des ensembles de Julia", PicWidth, PicHeight
for i = 0 to NPics Nom = dec(i, "000") theta = i * Delta cx = Xc + Rho * cos(theta) cy = Yc + Rho * sin(theta) SetParams() colormap PicWidth, PicHeight, fadr(mandelbrot) print Nom & ": X = " & dec(cx, Fmt) & ", Y = " & dec(cy, Fmt) img_save Nom + ".png" next i
' **********************************************************************
sub SetParams () ColFact = 0.01 * ColorFact AbsCol = abs(ColFact) ScaleFact = 4 / (PicHeight * ZoomFact) end_sub
sub init_sub (xt, yt, c@, z@, dz@) ' Initialise les iterations au point (xt, yt)
c = cmplx(cx, cy) z = cmplx(xt, yt) dz = C_one end_sub
sub iter_sub (c@, z@, dz@, zn@, dzn@) ' Calcul d'une iteration
zn = z * z + c ' z^2 + c dzn = 2 * z * dz ' Derivee dz/dc end_sub
function rgbcol% (iter%, q, v) ' Determine la teinte (Hue) et la saturation d'apres le "Continuous Dwell"
dim angle, radius, h, s, r%, g%, b%
if q < 0.5 then q = 1 - 1.5 * q angle = 1 - q else q = 1.5 * q - 0.5 angle = q end_if
radius = sqr(q)
if (ColFact > 0) and odd(iter) then v = 0.85 * v radius = 0.667 * radius end if
h = frac(angle * 10) * 360 s = frac(radius)
HSVtoRGB h, s, v, r, g, b return RGB(r, g, b) end_function
function mdbcol% (iter%, mz, mdz) ' Coloration pour les ensembles de Mandelbrot/Julia ' Retourne la couleur RGB d'un point en fonction de : ' iter = nb d'iterations ' mz, mdz = modules de z et de (dz/dc) a l'iteration iter ' Methode de coloration d'apres R. Munafo (http://mrob.com/pub/muency/color.html)
dim lmz, dist, dwell, dscale, q, v
' Determiner la luminosite (Value) d'apres l'estimateur de distance
lmz = log(mz)
dist = 2 * mz * lmz / mdz dscale = log(dist / ScaleFact) / Ln2 + DistFact
if dscale > 0 then v = 1 elseif dscale > -8 then v = 1 + dscale / 8 else v = 0 end_if dwell = iter + log(LnEsc / lmz) / Ln2 q = log(abs(dwell)) * AbsCol return rgbcol(iter, q, v) end_function
function mandelbrot% (x%, y%) ' Iteration de la fonction complexe au point (x, y)
dim iter% dim c@, z@, dz@, zn@, dzn@ dim xt, yt, mz, mdz
xt = x0 + ScaleFact * (x% - HalfPicWidth) yt = y0 + ScaleFact * (y% - HalfPicHeight)
init_sub xt, yt, c, z, dz
iter = 0 mz = cabs(z)
while iter < MaxIter and mz < Esc iter_sub c, z, dz, zn, dzn z = zn dz = dzn mz = cabs(z) iter = iter + 1 wend
if iter = MaxIter then return InsideCol
mdz = cabs(dz) return mdbcol(iter, mz, mdz) end_function
| |
| | | papydall
Nombre de messages : 7002 Age : 73 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Figures fractales Ven 3 Nov 2023 - 0:16 | |
| Merci Jean pour ce beau code.
J'ai tenté de sauvegarder les images en .JPG, mais il semble que le croco n'aime pas ça. Est-ce que tu confirmes que seuls les formats PNG et BMP sont les plats préférés du reptile (pour la sauvegarde) tandisqu'il digère bien les formats BMP,PNG,JPG,TGA pour charger une image? | |
| | | jean_debord
Nombre de messages : 1250 Age : 69 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Figures fractales Ven 3 Nov 2023 - 8:29 | |
| Bonjour papydall,
Oui je confirme ! C'est une limitation de la bibliothèque FBImage de D. J. Peters, utilisée par FBCroco.
| |
| | | jean_debord
Nombre de messages : 1250 Age : 69 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Figures fractales Mer 3 Jan 2024 - 17:00 | |
| Suite à la vidéo postée par papydall, voici une image de la même région de l'ensemble de Mandelbrot, générée par FBCroco : On y voit des "peanuts" et au centre se cache un mini-ensemble de Mandelbrot. Le grandissement n'est "que" de 6 * 10^11 Pour recréer cette image, utilisez le programme MANDEL de FBCroco avec l'instruction d'initialisation suivante : - Code:
-
init_params "mandel_2", -1.768978635265551, 0.00460540488510505, 10000, 6.0E+11, -1, 5.7
| |
| | | jean_debord
Nombre de messages : 1250 Age : 69 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Figures fractales Jeu 4 Jan 2024 - 9:23 | |
| Agrandissement de la zone centrale (2 * 10^13). On ne peut guère aller plus loin à ce stade. Il faut passer en multiprécision. | |
| | | jjn4
Nombre de messages : 2693 Date d'inscription : 13/09/2009
| Sujet: Re: Figures fractales Jeu 4 Jan 2024 - 11:17 | |
| Oh, les belles fleurs ! Joli, bravo !!! | |
| | | jean_debord
Nombre de messages : 1250 Age : 69 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Figures fractales Ven 5 Jan 2024 - 10:50 | |
| Merci jjn4 Voici un agrandissement de la région centrale de l'image précédente. Calcul en précision étendue avec des nombres de 20 chiffres. L'utilisation de la bibliothèque MPFR allonge le temps de calcul : environ 30 min pour cette image. | |
| | | Yannick
Nombre de messages : 8610 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Ven 5 Jan 2024 - 19:29 | |
| Ces dessins sont bluffant ! | |
| | | jean_debord
Nombre de messages : 1250 Age : 69 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Figures fractales Sam 6 Jan 2024 - 15:32 | |
| Merci Yannick Pour continuer, voici un agrandissement de l'image précédente, avec au centre un mini-ensemble de Mandelbrot, également appelé "midget". | |
| | | jean_debord
Nombre de messages : 1250 Age : 69 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Figures fractales Lun 8 Jan 2024 - 10:02 | |
| Nouvelle image, prise le long d'un des filaments qui unissent la région du mini-ensemble de la figure précédente à la couronne de formations spiralées. Agrandissement : 2.5 * 10^20 Temps de calcul : environ 15 min (sur un ordinateur récent) Et voici le programme FBCroco qui a tracé l'image : - Code:
-
' ********************************************************************** ' Ensemble de Mandelbrot : f(z) = z^2 + c ' Calcul en multiprecision avec la bibliotheque MPFR ' **********************************************************************
' Parametres de base (a modifier eventuellement)
set_mpfr_prec 30 ' Nombre de chiffres
const PicWidth = 500 ' Largeur de l'image const PicHeight = 500 ' Hauteur de l'image const InsideCol = CL_BLANC ' Couleur de la partie interne
dim Nom$ ' Nom de l'image dim x0! ' Coord. X du centre dim y0! ' Coord. Y du centre dim ZoomFact! ' Facteur de zoom dim DistFact ' Plus negatif ==> contour plus sombre dim ColorFact ' 0 pour noir et blanc, positif pour bandes de couleur dim MaxIter% ' Nb maxi d'iterations
' ---------------------------------------------------------------------- ' Initialisation a partir d'un fichier de parametres ou directement. ' Les variables en multiprecision sont saisies sous forme de chaines. ' ----------------------------------------------------------------------
Nom = "mandel" ' Nom du fichier
if file_exists(Nom + ".par") then ReadParams() else x0 = "-1.7689786352655529315388638242" y0 = " 0.0046054048851050100472176703297" ZoomFact = " 2.5E+20" DistFact = -1 ColorFact = 11 MaxIter = 12500 end_if
' **********************************************************************
' Parametres supplementaires
const HalfPicWidth = PicWidth \ 2 const HalfPicHeight = PicHeight \ 2 dim Esc!, LnEsc!, Ln2!
Esc = mpfr(1.0E+10) ' Rayon d'echappement LnEsc = log(Esc) Ln2 = log2_const()
dim ColFact, AbsCol, ScaleFact! SetParams() PrintParams()
' **********************************************************************
' Programme principal
dim x%, y%, btn%, key$, t1, t2
mode 3, "Clic gauche : zoom + / Clic droit : zoom - / S : sauvegarde / ESC : quitte", PicWidth, PicHeight
' Si l'image existe, la charger directement, sinon la creer
if file_exists(Nom + ".png") then img_load Nom + ".png" else PlotFractal() end_if
repeat get_mouse x, y, btn if btn = 1 or btn = 2 then getcoord x0, y0, x, y SetZoom(btn = 1) SetParams() PrintParams() PlotFractal() end_if key = inkey() if upper(key) = "S" then save() until key = "ESCAPE"
' **********************************************************************
' Sous-programmes
sub init_sub (xt!, yt!, c@, z@, dz@) ' Initialise les iterations au point (xt, yt)
c = cmplx(xt, yt) z = C_zero dz = C_zero end_sub
sub iter_sub (c@, z@, dz@, zn@, dzn@) ' Calcul d'une iteration
zn = z * z + c ' z^2 + c dzn = 2 * z * dz + 1 ' Derivee dz/dc end_sub
sub SetParams () ColFact = 0.01 * ColorFact AbsCol = abs(ColFact) ScaleFact = 4 / (PicHeight * ZoomFact) end_sub
sub SetZoom (zoom%) if zoom then ZoomFact = 5 * ZoomFact MaxIter = 1.25 * MaxIter ColorFact = 1.1 * ColorFact else ZoomFact = ZoomFact / 5 MaxIter = MaxIter / 1.25 ColorFact = ColorFact / 1.1 end_if ColorFact = round(ColorFact, 1) end_sub
function rgbcol% (iter%, q, v) ' Determine la teinte (Hue) et la saturation d'apres le "Continuous Dwell"
dim angle, radius, h, s dim r%, g%, b%
if q < 0.5 then q = 1 - 1.5 * q angle = 1 - q else q = 1.5 * q - 0.5 angle = q end_if
radius = sqr(q)
if (ColFact > 0) and odd(iter) then v = 0.85 * v radius = 0.667 * radius end if
h = frac(angle * 10) * 360 s = frac(radius)
HSVtoRGB h, s, v, r, g, b return RGB(r, g, b) end_function
function mdbcol% (iter%, mz!, mdz!) ' Coloration pour les ensembles de Mandelbrot/Julia ' Retourne la couleur RGB d'un point en fonction de : ' iter = nb d'iterations ' mz, mdz = modules de z et de (dz/dc) a l'iteration iter ' Methode de coloration d'apres R. Munafo (http://mrob.com/pub/muency/color.html)
dim lmz!, dist!, dwell!, dscale!, q, v
' Determiner la luminosite (Value) d'apres l'estimateur de distance
lmz = log(mz)
dist = 2 * mz * lmz / mdz dscale = log(dist / ScaleFact) / Ln2 + DistFact
if dscale > 0 then v = 1 elseif dscale > -8 then v = 1 + dscale / 8 else v = 0 end_if dwell = iter + log(LnEsc / lmz) / Ln2 q = log(abs(dwell)) * AbsCol return rgbcol(iter, q, v) end_function
function mandelbrot% (x%, y%) ' Iteration de la fonction complexe au point (x, y)
dim iter% dim c@, z@, dz@, zn@, dzn@ dim xt!, yt!, mz!, mdz!
xt = x0 + ScaleFact * (x - HalfPicWidth) yt = y0 + ScaleFact * (y - HalfPicHeight)
init_sub xt, yt, c, z, dz
iter = 0 mz = cabs(z)
while iter < MaxIter and mz < Esc iter_sub c, z, dz, zn, dzn z = zn dz = dzn mz = cabs(z) iter = iter + 1 wend
if iter = MaxIter then return InsideCol
mdz = cabs(dz) return mdbcol(iter, mz, mdz) end_function
sub PlotFractal () ' Dessine l'image et calcule le temps dim t1, t2, t t1 = timer ' secondes colormap PicWidth, PicHeight, fadr(mandelbrot)
t2 = timer ' secondes t = (t2 - t1) / 86400 ' jours
? "Temps de calcul = "; ftime(frac(t)) ? end_sub
sub getcoord (x0!, y0!, x%, y%) ' Calcule les coordonnees (x0,y0) du centre ' d'apres la position (x,y) de la souris
x0 = x0 + ScaleFact * (x - HalfPicWidth) y0 = y0 + ScaleFact * (y - HalfPicHeight) end_sub
sub ReadParams () ' Lit les parametres dans un fichier .par ' Les parametres en multiprecision sont ' lus sous forme de chaines de caracteres
dim a$
openin #1, Nom + ".par"
input #1, a : x0 = a input #1, a : y0 = a input #1, a : ZoomFact = a input #1, DistFact input #1, ColorFact input #1, MaxIter end_sub
sub PrintParams () ' Ecrit la liste des parametres ' Le point d'interrogation ecrit sur la console
? "Nom = """ & Nom & """" ? "x0 = """ & x0 & """" ? "y0 = """ & y0 & """" ? "ZoomFact = """ & mpfr_to_str(ZoomFact, "%4.2E") & """"
? "DistFact = " & DistFact ? "ColorFact = " & ColorFact ? "MaxIter = " & MaxIter ? end_sub
sub save () ' Sauvegarde l'image et les parametres
img_save Nom + ".png" openout #1, Nom + ".par" write #1, x0 write #1, y0 write #1, mpfr_to_str(ZoomFact, "%4.2E") write #1, DistFact write #1, ColorFact write #1, MaxIter
closeout #1 end_sub
| |
| | | jean_debord
Nombre de messages : 1250 Age : 69 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Figures fractales Sam 13 Jan 2024 - 10:04 | |
| Voici une version légèrement modifiée du programme précédent : - Code:
-
' ********************************************************************** ' Ensemble de Mandelbrot : f(z) = z^2 + c ' Calcul en multiprecision avec la bibliotheque MPFR ' **********************************************************************
' Parametres de base (a modifier eventuellement)
set_mpfr_prec 50 ' Nombre de chiffres
const PicWidth = 500 ' Largeur de l'image const PicHeight = 500 ' Hauteur de l'image const InsideCol = CL_BLANC ' Couleur de la partie interne
dim Nom$ ' Nom de l'image dim x0! ' Coord. X du centre dim y0! ' Coord. Y du centre dim ZoomFact! ' Facteur de zoom dim DistFact ' Plus negatif ==> contour plus sombre dim ColorFact ' 0 pour noir et blanc, positif pour bandes de couleur dim MaxIter% ' Nb maxi d'iterations
' ---------------------------------------------------------------------- ' Initialisation a partir d'un fichier de parametres ou directement. ' Les variables en multiprecision sont saisies sous forme de chaines. ' ----------------------------------------------------------------------
Nom = "mandel" ' Nom du fichier
if file_exists(Nom + ".par") then ReadParams() else x0 = "-1.768978635265552931538862840826883865374022698613" y0 = " 0.004605404885105010047268484803608948913661202185792" ZoomFact = " 2.38E+35" DistFact = -1 ColorFact = 11 MaxIter = 12500 end_if
' **********************************************************************
' Parametres supplementaires
const HalfPicWidth = PicWidth \ 2 const HalfPicHeight = PicHeight \ 2 dim Esc!, LnEsc!, Ln2!
Esc = mpfr(1.0E+10) ' Rayon d'echappement LnEsc = log(Esc) Ln2 = log2_const()
dim ColFact, AbsCol, ScaleFact! SetParams() PrintParams()
' **********************************************************************
' Programme principal
dim x%, y%, btn%, key$
mode 3, "Clic gauche : zoom + / Clic droit : zoom - / S : sauvegarde / ESC : quitte", PicWidth, PicHeight
' Si l'image existe, la charger directement, sinon la creer
if file_exists(Nom + ".png") then img_load Nom + ".png" else PlotFractal() end_if
repeat get_mouse x, y, btn if btn = 1 or btn = 2 then getcoord x0, y0, x, y SetZoom(btn = 1) SetParams() PrintParams() PlotFractal() end_if key = inkey() if upper(key) = "S" then save() until key = "ESCAPE"
' **********************************************************************
' Sous-programmes
sub init_sub (xt!, yt!, c@, z@, dz@) ' Initialise les iterations au point (xt, yt)
c = cmplx(xt, yt) z = C_zero dz = C_zero end_sub
sub iter_sub (c@, z@, dz@, zn@, dzn@) ' Calcul d'une iteration
zn = z * z + c ' z^2 + c dzn = 2 * z * dz + 1 ' Derivee dz/dc end_sub
sub SetParams () ColFact = 0.01 * ColorFact AbsCol = abs(ColFact) ScaleFact = 4 / (PicHeight * ZoomFact) end_sub
sub SetZoom (zoom%) dim s = sgn(ColorFact) if zoom then ZoomFact = 5 * ZoomFact MaxIter = 1.25 * MaxIter ColorFact = ColorFact + 0.25 * s else ZoomFact = ZoomFact / 5 MaxIter = MaxIter / 1.25 ColorFact = ColorFact - 0.25 * s end_if end_sub
function rgbcol% (iter%, q, v) ' Determine la teinte (Hue) et la saturation d'apres le "Continuous Dwell"
dim angle, radius, h, s dim r%, g%, b%
if q < 0.5 then q = 1 - 1.5 * q angle = 1 - q else q = 1.5 * q - 0.5 angle = q end_if
radius = sqr(q)
if (ColFact > 0) and odd(iter) then v = 0.85 * v radius = 0.667 * radius end if
h = frac(angle * 10) * 360 s = frac(radius)
HSVtoRGB h, s, v, r, g, b return RGB(r, g, b) end_function
function mdbcol% (iter%, mz!, mdz!) ' Coloration pour les ensembles de Mandelbrot/Julia ' Retourne la couleur RGB d'un point en fonction de : ' iter = nb d'iterations ' mz, mdz = modules de z et de (dz/dc) a l'iteration iter ' Methode de coloration d'apres R. Munafo (http://mrob.com/pub/muency/color.html)
dim lmz!, dist!, dwell!, dscale!, q, v
' Determiner la luminosite (Value) d'apres l'estimateur de distance
lmz = log(mz)
dist = 2 * mz * lmz / mdz dscale = log(dist / ScaleFact) / Ln2 + DistFact
if dscale > 0 then v = 1 elseif dscale > -8 then v = 1 + dscale / 8 else v = 0 end_if dwell = iter + log(LnEsc / lmz) / Ln2 q = log(abs(dwell)) * AbsCol return rgbcol(iter, q, v) end_function
function mandelbrot% (x%, y%) ' Iteration de la fonction complexe au point (x, y)
dim iter% dim c@, z@, dz@, zn@, dzn@ dim xt!, yt!, mz!, mdz!
xt = x0 + ScaleFact * (x - HalfPicWidth) yt = y0 + ScaleFact * (y - HalfPicHeight)
init_sub xt, yt, c, z, dz
iter = 0 mz = cabs(z)
while iter < MaxIter and mz < Esc iter_sub c, z, dz, zn, dzn z = zn dz = dzn mz = cabs(z) iter = iter + 1 wend
if iter = MaxIter then return InsideCol
mdz = cabs(dz) return mdbcol(iter, mz, mdz) end_function
sub PlotFractal () ' Dessine l'image et calcule le temps dim t1, t2, t t1 = timer ' secondes colormap PicWidth, PicHeight, fadr(mandelbrot)
t2 = timer ' secondes t = (t2 - t1) / 86400 ' jours
? "Temps de calcul = "; ftime(frac(t)) ? end_sub
sub getcoord (x0!, y0!, x%, y%) ' Calcule les coordonnees (x0,y0) du centre ' d'apres la position (x,y) de la souris
x0 = x0 + ScaleFact * (x - HalfPicWidth) y0 = y0 + ScaleFact * (y - HalfPicHeight) end_sub
sub ReadParams () ' Lit les parametres dans un fichier .par ' Les parametres en multiprecision sont ' lus sous forme de chaines de caracteres
dim a$
openin #1, Nom + ".par"
input #1, a : x0 = a input #1, a : y0 = a input #1, a : ZoomFact = a input #1, DistFact input #1, ColorFact input #1, MaxIter
closein #1 end_sub
sub PrintParams () ' Ecrit la liste des parametres ' Le point d'interrogation ecrit sur la console
? "Nom = """ & Nom & """" ? "x0 = """ & x0 & """" ? "y0 = """ & y0 & """" ? "ZoomFact = """ & mpfr_to_str(ZoomFact, "%4.2E") & """"
? "DistFact = " & DistFact ? "ColorFact = " & ColorFact ? "MaxIter = " & MaxIter ? end_sub
sub save () ' Sauvegarde l'image et les parametres
img_save Nom + ".png" openout #1, Nom + ".par" write #1, x0 write #1, y0 write #1, mpfr_to_str(ZoomFact, "%4.2E") write #1, DistFact write #1, ColorFact write #1, MaxIter
closeout #1 end_sub
Et voici l'image générée par ce programme (toujours au centre de l'image précédente) Zoom : 2.38 * 10^35, soit un grandissement d'environ 10^15 (= 1 million de milliards) par rapport à l'image précédente. Temps de calcul : environ 1 heure | |
| | | Marc
Nombre de messages : 2389 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Figures fractales Sam 13 Jan 2024 - 12:05 | |
| Merci Jean pour ces voyages mystérieux et extraordinaires dans les fractales !
C’est impressionnant de pouvoir manipuler de tels nombres avec cette précision !
| |
| | | jean_debord
Nombre de messages : 1250 Age : 69 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Figures fractales Dim 14 Jan 2024 - 17:35 | |
| Merci Marc C'est effectivement la grande qualité de MPFR que de calculer sur de très grands nombres sans perdre de précision. Le prix à payer est une augmentation du temps de calcul. A preuve cet agrandissement (8.5 * 10^37) de l'image précédente, montrant le mini-ensemble de Mandelbrot au centre. Temps de calcul : environ 1 h 30 | |
| | | jean_debord
Nombre de messages : 1250 Age : 69 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Figures fractales Mer 17 Jan 2024 - 8:21 | |
| Un autre exemple, avec une image tirée du site de Robert MunafoOn y voit 4 "chromosomes" (les structures en forme de X incurvés) Paramètres : - Code:
-
x0 = "-1.768634119157166907234009209392062" y0 = " 0.002663304521717732927981067912799" Zoomfact = " 1.70E+30" DistFact = -1 ColorFact = 10 MaxIter = 20000
| |
| | | jean_debord
Nombre de messages : 1250 Age : 69 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Figures fractales Jeu 18 Jan 2024 - 7:35 | |
| Agrandissement du centre de l'image précédente : 8.5 * 10^30 | |
| | | jean_debord
Nombre de messages : 1250 Age : 69 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Figures fractales Ven 19 Jan 2024 - 7:36 | |
| Toujours au centre. Zoom : 4.25 * 10^31 | |
| | | jean_debord
Nombre de messages : 1250 Age : 69 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Figures fractales Sam 20 Jan 2024 - 7:51 | |
| Centre de l'image précédente. Zoom : 2.1 * 10^32 Quel est ce point blanc au centre ? | |
| | | Contenu sponsorisé
| Sujet: Re: Figures fractales | |
| |
| | | | Figures fractales | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |