Petit utilitaire pour fractales

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Petit utilitaire pour fractales

Message par Huitbit »

Hello,

Pour le troisième trimestre, on va bosser(j'ai forcé la main à plusieurs collègues :mrgreen: ) sur les fractales avec des élèves de seconde (3 classes concernées).
Pour la présentation, on a visionné un extrait de film ("Fractales à la recherche de la dimension cachée").
J'ai fait quelques exemples en Purebasic (Julia, Mandelbrot, arbres).
L'objectif pour les élèves est de créer une œuvre d'art avec les fractales en utilisant la version démo de Purebasic.
Comme il n'y a pas beaucoup de séances, on va leur mâcher un peu le travail.

Ma question est donc la suivante, y a-t-il quelqu'un qui s'est déjà intéressé au "coloriage" des fractales ?
Sur la toile, on voit de super trucs, quelqu'un s'est-il penché sur le problème ?


Je commence les recherches de mon côté, je vous tiendrai au courant.
D'ailleurs, à la fin de la séquence, si ça a donné quelque chose d'intéressant, je posterai des trucs(images, arbres artificiels créés,..etc)

En attendant voici mon mini-explorateur de fractales (code pour débutants, pas de structures, pas de tableaux, peu de mots-clés...etc) :

Image

(la vitesse d'exécution est correcte mais il est conseillé de désactiver le débogueur pour gagner du temps)

Code : Tout sélectionner

; Utilitaire pour les fractales
;Auteur Huitbit
;Avril 2015
;PureBasic 5.24 LTS (Windows - x64)
;***********************************
;- Constantes
Enumeration
	#PANEL_MAIN
	#CANV_EXPLO_MANDEL
	#TEXT_MODE_EMPLOI_EXPLORATEUR
	#VALEUR_CONSTANTE_JULIA
	
	#CANV_MANDEL
	#CANV_JULIA
	
	#IMG_EXPLO_MANDEL
	#IMG_EXPLO_JULIA
	#IMG_MANDEL
	#IMG_JULIA
	
	#CANV_MANDEL_BTN_SAUVER
	#CANV_MANDEL_BTN_RAZ
	#CANV_MANDEL_TEXT_Z
	#CANV_MANDEL_TEXT_Z_ZOOM
	
	#CANV_JULIA_BTN_SAUVER
	#CANV_JULIA_BTN_RAZ
	#CANV_JULIA_TEXT_Z
	#CANV_JULIA_TEXT_Z_ZOOM
	
	
EndEnumeration


;- dimensions écran
;{ 
ExamineDesktops()
Define.l Lwindow = DesktopWidth(0) * 4 / 5
Define.l Hwindow = DesktopHeight(0) * 4 / 5
;} 

IDmandel.l = 0
iterMaxMandel.l = 80
zoomMandel.f = 1
minXMandel.f = -2
maxXMandel.f = 0.6
minYMandel.f = -1.3
maxYMandel.f = 1.3

IDjulia.l = 0
iterMaxJulia.l = 80
zoomJulia.f = 1
minXJulia.f = -2
maxXJulia.f = 2
minYJulia.f = -2
maxYJulia.f = 2

;valeurs initiales des constantes pour l'ensemble de Julia
a.f = -0.772691322542185
b.f = 0.124281466072787

l.l
h.l

x.f
xTemp.f = 0
y.f
zModuleCarre .f
couleur.l
Cx.f
Cy.f


Macro dessinerMandelbrot(IDimage, l, h, minX, maxX, minY, maxY)
	If CreateImage(IDimage, l, h) And StartDrawing(ImageOutput(IDimage))
			
			For i = 0 To l
				For j = 0 To h
					For iter = 0 To iterMaxMandel
						
						couleur = 0
						x = minX + (maxX - minX) * i / l
						y = minY + (maxY - minY) * j / h
						Cx = x
						Cy = y
						zModuleCarre = x * x + y * y
						
						While zModuleCarre < 4 And couleur < iterMaxMandel
							xTemp = x
							x = x * x - y * y + Cx
							y = 2 * xTemp * y + Cy
							zModuleCarre = x * x + y * y
							couleur = couleur + 1
							
						Wend ; zModuleCarre < 4 And couleur < iterMax
						
						If zModuleCarre >= 4 Or couleur >= iterMaxMandel
							Break
						EndIf ; 	zModuleCarre >= 4 Or couleur >= iterMax
						
					Next iter
					
					col = couleur * 255 / iterMaxMandel
					If col <> 0
						Box(i, h - j, 1, 1, RGB(col, col, 0))
					EndIf
					
				Next j
			Next i
		StopDrawing()
		
	EndIf ; CreateImage(IDimage, l, h) And StartDrawing(ImageOutput(IDimage))
	
EndMacro

Macro dessinerJulia(IDimage, Cx, Cy, l, h, minX, maxX, minY, maxY)
	If CreateImage(IDimage, l, h) And StartDrawing(ImageOutput(IDimage))
			
			For i = 0 To l
				For j = 0 To h
					For iter = 0 To iterMaxJulia
						
						couleur = 0
						x = minX + (maxX - minX) * i / l
						y = minY + (maxY - minY) * j / h
						zModuleCarre = x * x + y * y
						
						While zModuleCarre < 4 And couleur < iterMaxJulia
							xTemp = x
							x = x * x - y * y + Cx
							y = 2 * xTemp * y + Cy
							zModuleCarre = x * x + y * y
							couleur = couleur + 1
							
						Wend ; zModuleCarre < 4 And couleur < iterMax
						
						If zModuleCarre >= 4 Or couleur >= iterMaxJulia
							Break
						EndIf ; 	zModuleCarre >= 4 Or couleur >= iterMax
						
					Next iter
					
					col = couleur * 255 / iterMaxJulia
					If col <> 0
						Box(i, h - j, 1, 1, RGB(col, col, col))
					EndIf
					
				Next j
			Next i
		StopDrawing()
		
	EndIf ; CreateImage(IDimage, l, h) And StartDrawing(ImageOutput(IDimage))
	
EndMacro
;- PROGRAMME PRINCIPAL
If OpenWindow(0, 0, 0, Lwindow, Hwindow, "PanelGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	UsePNGImageEncoder()
	;- création des images
	;{ 
	dessinerMandelbrot(#IMG_MANDEL, Hwindow, Hwindow, minXMandel, maxXMandel, minYMandel, maxYMandel)
	dessinerJulia(#IMG_JULIA, a, b, Hwindow, Hwindow, minXJulia, maxXJulia, minYJulia, maxYJulia)
	CopyImage(#IMG_JULIA, #IMG_EXPLO_JULIA)
	ResizeImage(#IMG_EXPLO_JULIA, Lwindow * 0.50, Lwindow * 0.50)
	;} 
	
	PanelGadget(#PANEL_MAIN, 0, 0, Lwindow, Hwindow)
		LoadFont(0, "Arial", 11, #PB_Font_Bold)
		SetGadgetFont(#PB_Default, FontID(0))
		
		;- création des onglets
		;{ 
		; onglet : explorateur
		AddGadgetItem(#PANEL_MAIN, -1, "Explorateur")
		ImageGadget(#IMG_EXPLO_JULIA, 0, 0, Lwindow * 0.50, Lwindow * 0.50, ImageID(#IMG_EXPLO_JULIA))
		CanvasGadget(#CANV_EXPLO_MANDEL, Lwindow * 0.50, 0, Lwindow * 0.50, Lwindow * 0.50)
		modeEmploi.s = "Cliquez sur l'ensemble de Mandelbrot(à droite) pour voir l'ensemble de Julia correspondant."
		modeEmploi = modeEmploi + Chr(13) + Chr(13) + "Sélectionnez l'onglet de votre choix pour zoomer sur la fractale."
		modeEmploi = modeEmploi + Chr(13) + "Un fois l'onglet choisi, chaque clic entraînera un agrandissement de l'image."
		TextGadget(#TEXT_MODE_EMPLOI_EXPLORATEUR, 0, Lwindow * 0.50, Lwindow, Hwindow / 10, modeEmploi)
		TextGadget(#VALEUR_CONSTANTE_JULIA, 0, Lwindow * 0.50 + Hwindow / 10, Lwindow, Hwindow / 10, "Valeur de la constante : z = " + StrF(a, 5) + " + " + StrF(b, 5) + "i")
		
		
		; onglet Mandelbrot
		AddGadgetItem(#PANEL_MAIN, -1, "Mandelbrot")
		CanvasGadget(#CANV_MANDEL, 0, 0, Hwindow, Hwindow, #PB_Canvas_Border)
		ButtonGadget(#CANV_MANDEL_BTN_SAUVER, Hwindow, 0,(Lwindow - Hwindow) * 0.9, Hwindow / 10, "SAUVEGARDER")
		ButtonGadget(#CANV_MANDEL_BTN_RAZ, Hwindow, Hwindow / 10 * 1.1,(Lwindow - Hwindow) * 0.9, Hwindow / 10, "REINITIALISER")
		expressionZmandel.s = "z0 EN ATTENTE ..."
		TextGadget(#CANV_MANDEL_TEXT_Z, Hwindow, Hwindow / 10 * 2.2,(Lwindow - Hwindow) * 0.9, Hwindow / 20, expressionZmandel, #PB_Text_Border | #PB_Text_Center)
		
		; onglet Julia
		AddGadgetItem(#PANEL_MAIN, -1, "Julia")
		CanvasGadget(#CANV_JULIA, 0, 0, Hwindow, Hwindow, #PB_Canvas_Border)
		ButtonGadget(#CANV_JULIA_BTN_SAUVER, Hwindow, 0,(Lwindow - Hwindow) * 0.9, Hwindow / 10, "SAUVEGARDER")
		ButtonGadget(#CANV_JULIA_BTN_RAZ, Hwindow, Hwindow / 10 * 1.1,(Lwindow - Hwindow) * 0.9, Hwindow / 10, "REINITIALISER")
		expressionZjulia.s = "z = " + StrF(a, 5) + " + " + StrF(b, 5) + "i"
		TextGadget(#CANV_JULIA_TEXT_Z, Hwindow, Hwindow / 10 * 2.2,(Lwindow - Hwindow) * 0.9, Hwindow / 20, expressionZjulia, #PB_Text_Border | #PB_Text_Center)
		expressionZjuliaZoom.s = "z0  EN ATTENTE ..."
		TextGadget(#CANV_JULIA_TEXT_Z_ZOOM, Hwindow, Hwindow / 10 * 2.2 + Hwindow / 20,(Lwindow - Hwindow) * 0.9, Hwindow / 20, expressionZjuliaZoom, #PB_Text_Border | #PB_Text_Center)
		
		
	CloseGadgetList()
	;} 
	
	; Affichage des images
	StartDrawing(CanvasOutput(#CANV_EXPLO_MANDEL))
		DrawImage(ImageID(#IMG_MANDEL), 0, 0, Lwindow * 0.5, Lwindow * 0.5)
	StopDrawing()
	
	StartDrawing(CanvasOutput(#CANV_MANDEL))
		DrawImage(ImageID(#IMG_MANDEL), 0, 0)
	StopDrawing()
	
	StartDrawing(CanvasOutput(#CANV_JULIA))
		DrawImage(ImageID(#IMG_JULIA), 0, 0)
	StopDrawing()
	
	;- BOUCLE PRINCIPALE
	Repeat
		Event = WaitWindowEvent() ; Attend qu'un nouvel évènement se produise
		; la valeur de retour Event nous renseigne sur l'évènement produit
		
		If Event = #PB_Event_Gadget
			;- gestion : explorateur
			;{ 
			If EventGadget() = #CANV_EXPLO_MANDEL
				iterMaxMandel = 80
				zoomMandel = 1
				minXMandel = -2
				maxXMandel = 0.6
				minYMandel = -1.3
				maxYMandel = 1.3
				
				
				iterMaxJulia = 80
				zoomJulia = 1
				minXJulia.f = -2
				maxXJulia = 2
				minYJulia = -2
				maxYJulia = 2
				SetGadgetText(#CANV_JULIA_TEXT_Z_ZOOM, "EN ATTENTE...")
				
				
				SetGadgetAttribute(#CANV_EXPLO_MANDEL, #PB_Canvas_Cursor, #PB_Cursor_Hand)
				If EventType() = #PB_EventType_LeftClick
					xCurseur = GetGadgetAttribute(#CANV_EXPLO_MANDEL, #PB_Canvas_MouseX)
					yCurseur = GetGadgetAttribute(#CANV_EXPLO_MANDEL, #PB_Canvas_MouseY)
					; 	dessinerMandelbrot(#IMG_MANDEL, Hwindow, Hwindow, -2, 0.6, -1.2, 1.2)
					; mise à l'échelle et changement de sens de l'axe y
					
					CxNew.f = 2 * (maxXMandel - minXMandel) * (xCurseur - (Lwindow * 0.5) / 2) / Lwindow + (maxXMandel - (maxXMandel - minXMandel) / 2)
					CyNew.f = 2 * (maxYMandel - minYMandel) * ((Lwindow * 0.5) / 2 - yCurseur) / Lwindow + (maxYMandel - (maxYMandel - minYMandel) / 2)
					If StartDrawing(CanvasOutput(#CANV_EXPLO_MANDEL))
							Circle(xCurseur, yCurseur, 1, RGB(255, 92, 92))
						StopDrawing()
					EndIf ; StartDrawing(CanvasOutput(#CANV_EXPLO_MANDEL))
					a = CxNew
					b = CyNew
					dessinerJulia(#IMG_JULIA, CxNew, CyNew, Hwindow, Hwindow, minXJulia, maxXJulia, minYJulia, maxYJulia)
					CopyImage(#IMG_JULIA, #IMG_EXPLO_JULIA)
					ResizeImage(#IMG_EXPLO_JULIA, Lwindow * 0.50, Lwindow * 0.50)
					SetGadgetState(#IMG_EXPLO_JULIA, ImageID(#IMG_EXPLO_JULIA))
					SetGadgetText(#CANV_JULIA_TEXT_Z, "z = " + StrF(a, 5) + " + " + StrF(b, 5) + "i")
					SetGadgetText(#VALEUR_CONSTANTE_JULIA, "Valeur de la constante : z = " + StrF(a, 5) + " + " + StrF(b, 5) + "i")
					If StartDrawing(CanvasOutput(#CANV_JULIA))
							DrawImage(ImageID(#IMG_JULIA), 0, 0)
						StopDrawing()
					EndIf ; StartDrawing(CanvasOutput(#CANV_JULIA))
					
					
				EndIf
			EndIf ; EventGadget() = #CANV_EXPLO_MANDEL
			;} 
			;- gestion : onglet Mandelbrot
			;{ 
			If EventGadget() = #CANV_MANDEL
				SetGadgetAttribute(#CANV_MANDEL, #PB_Canvas_Cursor, #PB_Cursor_Cross)
				If EventType() = #PB_EventType_LeftClick
					zoomMandel = zoomMandel * 0.5
					iterMaxMandel = iterMaxMandel * 1.2
					xCurseur = GetGadgetAttribute(#CANV_MANDEL, #PB_Canvas_MouseX)
					yCurseur = GetGadgetAttribute(#CANV_MANDEL, #PB_Canvas_MouseY)
					
					CxNew = (maxXMandel - minXMandel) * (xCurseur - (Hwindow) / 2) / Hwindow + (maxXMandel - (maxXMandel - minXMandel) / 2)
					CyNew = (maxYMandel - minYMandel) * ((Hwindow) / 2 - yCurseur) / Hwindow + (maxYMandel - (maxYMandel - minYMandel) / 2)
					minXMandel = CxNew - zoomMandel
					maxXMandel = CxNew + zoomMandel
					minYMandel = CyNew - zoomMandel
					maxYMandel = CyNew + zoomMandel
					dessinerMandelbrot(#IMG_MANDEL, Hwindow, Hwindow, minXMandel, maxXMandel, minYMandel, maxYMandel)
					SetGadgetText(#CANV_MANDEL_TEXT_Z, "z0 = " + StrF(CxNew, 5) + " + " + StrF(CyNew, 5) + "i")
					
					StartDrawing(CanvasOutput(#CANV_MANDEL))
						DrawImage(ImageID(#IMG_MANDEL), 0, 0)
					StopDrawing()
					
				EndIf ; EventType() = #PB_EventType_LeftClick
				
			EndIf ; EventGadget() = #CANV_MANDEL
			
			If EventGadget() = #CANV_MANDEL_BTN_RAZ
				iterMaxMandel.l = 80
				zoomMandel.f = 1
				minXMandel.f = -2
				maxXMandel.f = 0.6
				minYMandel.f = -1.3
				maxYMandel.f = 1.3
				dessinerMandelbrot(#IMG_MANDEL, Hwindow, Hwindow, minXMandel, maxXMandel, minYMandel, maxYMandel)
				StartDrawing(CanvasOutput(#CANV_MANDEL))
					DrawImage(ImageID(#IMG_MANDEL), 0, 0)
				StopDrawing()
				SetGadgetText(#CANV_MANDEL_TEXT_Z, "z0 =EN ATTENTE...")
				
			EndIf ; EventGadget() = #CANV_MANDEL_BTN_RAZ
			If EventGadget() = #CANV_MANDEL_BTN_SAUVER
				IDmandel = IDmandel + 1
				SaveImage(#IMG_MANDEL, "mandel" + Str(IDmandel) + ".png")
			EndIf ; #CANV_MANDEL_BTN_SAUVER
			
			;} 
			;- gestion : onglet Julia
			;{ 
			If EventGadget() = #CANV_JULIA
				SetGadgetAttribute(#CANV_JULIA, #PB_Canvas_Cursor, #PB_Cursor_Cross)
				If EventType() = #PB_EventType_LeftClick
					zoomJulia = zoomJulia * 0.5
					iterMaxJulia = iterMaxJulia * 1.2
					xCurseur = GetGadgetAttribute(#CANV_JULIA, #PB_Canvas_MouseX)
					yCurseur = GetGadgetAttribute(#CANV_JULIA, #PB_Canvas_MouseY)
					CxNew = (maxXJulia - minXJulia) * (xCurseur - (Hwindow) / 2) / Hwindow + (maxXJulia - (maxXJulia - minXJulia) / 2)
					CyNew = (maxYJulia - minYJulia) * ((Hwindow) / 2 - yCurseur) / Hwindow + (maxYJulia - (maxYJulia - minYJulia) / 2)
					minXJulia = CxNew - zoomJulia
					maxXJulia = CxNew + zoomJulia
					minYJulia = CyNew - zoomJulia
					maxYJulia = CyNew + zoomJulia
					dessinerJulia(#IMG_JULIA, a, b, Hwindow, Hwindow, minXJulia, maxXJulia, minYJulia, maxYJulia)
					SetGadgetText(#CANV_JULIA_TEXT_Z_ZOOM, "z0 = " + StrF(CxNew, 5) + " + " + StrF(CyNew, 5) + "i")
					
					StartDrawing(CanvasOutput(#CANV_JULIA))
						DrawImage(ImageID(#IMG_JULIA), 0, 0)
					StopDrawing()
				EndIf ; EventType() = #PB_EventType_LeftClick
			EndIf ; EventGadget() = #CANV_JULIA
			
			If EventGadget() = #CANV_JULIA_BTN_RAZ
				iterMaxJulia.l = 80
				zoomJulia.f = 1
				minXJulia.f = -2
				maxXJulia.f = 2
				minYJulia.f = -2
				maxYJulia.f = 2
				dessinerJulia(#IMG_JULIA, a, b, Hwindow, Hwindow, minXJulia, maxXJulia, minYJulia, maxYJulia)
				SetGadgetText(#CANV_JULIA_TEXT_Z_ZOOM, "z0 EN ATTENTE...")
				StartDrawing(CanvasOutput(#CANV_JULIA))
					DrawImage(ImageID(#IMG_JULIA), 0, 0)
				StopDrawing()
			EndIf ; EventGadget() = #CANV_JULIA_BTN_RAZ
			
			If EventGadget() = #CANV_JULIA_BTN_SAUVER
				IDjulia = IDjulia + 1
				SaveImage(#IMG_JULIA, "julia" + Str(IDjulia) + ".png")
			EndIf ; #CANV_JULIA_BTN_SAUVER
			;} 
		EndIf ; Event = #PB_Event_Gadget
		
		
	Until Event = #PB_Event_CloseWindow
EndIf ; OpenWindow(0, 0, 0, Lwindow, Hwindow, "PanelGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)


Hasta la vista !
Elevé au MSX !
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Re: Petit utilitaire pour fractales

Message par Frenchy Pilou »

un court article sur les problèmes de la représentation des fractales! (VF)
http://www.lactamme.polytechnique.fr/de ... al.02.html
Est beau ce qui plaît sans concept :)
Speedy Galerie
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Petit utilitaire pour fractales

Message par Ollivier »

Salut HuitBit,

Tu peux commencer par des dégradés indépendants de la fractale.

couleur(x,y) (tester une équation de cercle)

A l'opposé, avec des couleurs dépendant strictement de la fractale, en 24 bits par pixel (8 bits par couleur primaire), tracer une ligne courbe ou brisée, ouverte ou fermée dans un cube de 256 unités de côté:
x(t)
y(t)
z(t)
où t est la valeur fractale obtenue pour chaque pixel. t est alors une sorte de curseur qui se déplace sur cette "trajectoire".

Il y a une "infinité" d'équations paramétrique. Il leur reste alors à décider quelle sera l'équation paramétrique, autrement dit quelle sera la forme de cette ligne dans ce cube.

Tu peux aussi te limiter à un carré de 256 unités de côté, ce qui donne un mélange de seulement 2 couleurs primaires. La troisième servant à représenter l'échelle (ex: plus c'est petit, plus ça vire au vert).
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: Petit utilitaire pour fractales

Message par SPH »

Cool et rapide 8)

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Petit utilitaire pour fractales

Message par Ollivier »

Un petit exemple sur Youtube:
http://www.youtube.com/watch?v=BTiZD7p_oTc
Visiblement, il y a beaucoup d'exemples travaillant via 2 cubes de couleurs: l'un pour la fractale (t), l'autre pour l'échelle.
En 1:04 on voit bien (comme un trait de dessin) que la ligne est brisée.
En 3:12 on remarque que la résolution du cube de couleurs de fractale est augmentée. D'ailleurs, plus l'on augmente cette résolution, plus l'on découvre de formes différentes introuvables dans un 1er temps (juste une résolution de 256 unités)
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Re: Petit utilitaire pour fractales

Message par Huitbit »

Merci d'avoir testé,

Je ne m'étais jamais occupé des fractales auparavant (à part quand j'avais fait mumuse avec le bruit de Perlin).
Quand on se penche dessus, il y a de quoi tomber dedans sans fin 8O .


@Ollivier
J'avais trouvé ça :
http://eclectique.fr.free.fr/Programmes ... tals_4.htm

mais ton idée d'équations paramétriques me plaît beaucoup. Merci !

Hasta la vista !


[EDIT]Essayez les exemples de courbes paramétriques(cadre en bas à droite) :
http://www.math.uri.edu/~bkaskosz/flashmo/parcur/
[/EDIT]
Elevé au MSX !
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Re: Petit utilitaire pour fractales

Message par Frenchy Pilou »

http://www.purebasic.fr/french/viewtopic.php?f=9&t=9951

http://syntopia.github.io/Fragmentarium/

fractales "carrées" : http://www.fractal-recursions.com/files/mech0025.html
http://www.incendia.net/ celui-ci permet l'export d'objet fractal (mais pas hyper ergonomique voir pénible de manipulation)

http://www.skytopia.com/project/fractal/mandelbulb.html mandelbulb (avatar 3D de l'ensemble 2d De mandelbrot) c'est là que se passe la recherche sur les fractales (voir le forum)
http://frictionalgames.blogspot.com/200 ... l-fun.html pour explorer le mandelbulbe :)
http://sourceforge.net/projects/mandelbulber/ idem
http://xenodream.com/xd2features.htm sait exporter des volumes
Topmod http://code.google.com/p/topmod/ pas tout à fait des fractales mais peut faire des objets fractals en volume
http://www.voxelogic.com/index.php?opti ... 1&Itemid=2 générateur de fractales en voxel donc des objets 3D

http://www.chaospro.de/index.php il regroupe un banc d'essai de tout ce qui se fait dans le genre!! gratuit malgré le nom!
http://www.apophysis.org/
Est beau ce qui plaît sans concept :)
Speedy Galerie
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Petit utilitaire pour fractales

Message par Ollivier »

@Frenchy Pilou

Il y a Bob l'éponge aussi sur ce forum! Le seul dommage c'est que certaines images ne sont plus...

@Huitbit

Je n'ai pas encore essayé ton code! Il faut ptêt que je me branche à un ordi aussi.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Petit utilitaire pour fractales

Message par Ollivier »

Testé! Super! Juste un blocage pour l'onglet de droite ("en attente").
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Re: Petit utilitaire pour fractales

Message par Huitbit »

Hello,
Ollivier a écrit :Testé! Super! Juste un blocage pour l'onglet de droite ("en attente").
Rhoôo, le PC attend juste que tu cliques pour te donner les coordonnées du point sur lequel tu zoomes !

J'ai commencé quelques tests :
Exemple de coloration :

Code : Tout sélectionner

rouge=255*Cos(2*#PI*couleur / iterMaxMandel)
vert=255*Sin(2*#PI*couleur / iterMaxMandel)
bleu=couleur * 255 / iterMaxMandel
Box(i, h - j, 1, 1, RGB(rouge,vert,bleu))
Image

Image

Image

Par contre, la fonction RGB() m'étonne un peu car en mettant RGB(rouge,vert,0), j'obtiens quand même du bleu sur le dessin 8O
Ce sont peut-être les valeurs négatives des sin() et cos() ?
En plus, il y a des pixels indésirables qui apparaissent parfois, il va falloir que je me penche un peu plus sur la fonction RGB() :
Image


Mystère ?

Hasta la vista !

[EDIT]
Par contre, la fonction RGB() m'étonne un peu car en mettant RGB(rouge,vert,0), j'obtiens quand même du bleu sur le dessin 8O
Ce sont peut-être les valeurs négatives des sin() et cos() ?
En plus, il y a des pixels indésirables qui apparaissent parfois, il va falloir que je me penche un peu plus sur la fonction RGB() :
Je crois que c'est bien à cause des valeurs négatives !
[/EDIT]
Elevé au MSX !
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: Petit utilitaire pour fractales

Message par majikeyric »

Les fractales ne me passionnent pas mais c'est très joli !
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Re: Petit utilitaire pour fractales

Message par Huitbit »

Merci,

Le plus flippant dans tout ça, c'est que ce genre de fractales tient dans une toute petite équation ridiculement simple :
Image

Pour l'instant, je fais quelques tests avec Mandelbrot je verrai Julia plus tard :!
Image

Hasta la vista !
Elevé au MSX !
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Petit utilitaire pour fractales

Message par Ollivier »

Moi ce que je trouve déconcertant, c'est que le rendu de Mandelbrot nécessite un tour de passe-passe logique comme s'il manquait quelque chose en maths.

On a une équation très simple, un rendu à nos yeux qu'on peut qualifier de complet, pourtant entre l'équation et la géométrie, il y a une rustine logique (la limite itérative). Cette rustine d'un côté semble trahir un défaut en maths que Mandelbrot n'a d'ailleurs pas pu combler, et d'un autre côté cette même rustine reste indispensable à l'application géométrique (elle est jusqu'à aujourd'hui irremplaçable).

Pour les rendus, bravo! Effectivement, il te faut mettre les couleurs strictement entre 0 et 255, sinon ta valeur "déborde" sur les champs de bits voisins.
127.5 + FonctionTrigo() * 127.5

Sinon, j'ai un planté avec l'onglet droit. Je te préciserai ça dès que possible. Pour l'instant, je considère que c'est moi le planté!
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Re: Petit utilitaire pour fractales

Message par Frenchy Pilou »

De ce que je me rappelle c'est que cela correspondait à prendre un résultat d'une équation A
pour le mettre dans une équation B qui repartait dans l'équation A :)
Avec celles prises on a l'ensemble de Mandelbrot mais en fait on peut reprendre ce procédé avec n'importe quoi!
Et pouf on a des infinis d'ensembles qui s'emboîtent! :)
Est beau ce qui plaît sans concept :)
Speedy Galerie
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Petit utilitaire pour fractales

Message par Ollivier »

Salut Pilew!

Je vais voir si j'ai un peu de temps pour créer un sujet là-dessus, vu que là, on se focalise sur la coloration. Benoît Mandelbrot l'a dit lui-même: il est heureux qu'on en parle, que l'on en programme et que l'on en débatte. J'ai écrit tout un pavé hier soir, mais, au moment de le publier, il est passé à la trappe par maladresse. Ce n'était pas truffé de maths mais de beaucoup d'humour.

Pour t'expliquer la subtilité mathématique, je racontais comment tu avais passé ton examen de conduite sur la très grande Place Komplex en Russie, pour la 2ème fois (vu que la 1ère fois, tu avais été recalé pour avoir planté la trabant-école contre un monument historique). A bientôt donc!
Répondre