Ce code utilise une des méthodes fractales de mandelbrot pour tracer des images obtenues avec des fonctions. Si la fonction ne diverge pas (c'est a dire qu'au terme n elle se rapproche de l'infini) le point est tracé en noir. Sinon, la couleur placée est en rapport avec la rapidité de divergeance (divergence lente = rouge vif).
Si cette fractale vous a plu, allez voir mon autre code fractal (qui sera suivi par d'autres encore) :
http://www.vbfrance.com/article.aspx?Val=9161
Mises à jour:
1. Mode zoom, corigé un bug de fonction
15 juin 2003 à 23:42
17 juin 2003 à 08:47
1. Déja la ou tu dessine met le scalemode en pixel et utilise le ScaleHeight et ScaleWidth ça t'évite quelques calculs sur la taile des pixels...
2. utilise plustôt l'API setpixel :)
3. Pourquoi remplir un tableau puis le dessiner ça fait deux fois plus de boucles : comme tu calcules un point après l'autre dessine le tout de suite ! comme ça il n'y aura plus que 3 boucles au lieu de 5 et le tableau devient inutile !
voila ce que j'ai fait : tu prend une nouvelle form, un picturebox et un bouton. tu met le scalemode du picturebox a 3 - pixel et tu copie le code suivant :
'**********************************
Option Explicit
Private Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long
Const Passe As Integer = 15
Private Sub Command1_Click()
Dim I As Integer
Dim C1 As Integer
Dim C2 As Integer
Dim ancienz(1) As Double
Dim nouveauz(1) As Double
For C1 = 0 To Picture1.ScaleWidth
For C2 = 0 To Picture1.ScaleHeight
ancienz(0) = 0
ancienz(1) = 0
For I = 0 To Passe - 1
nouveauz(0) = ancienz(0) ^ 2 - ancienz(1) ^ 2 - 4 / Picture1.ScaleWidth * C1 + 1
nouveauz(1) = ancienz(0) * ancienz(1) + 2 * Picture1.ScaleHeight / Picture1.ScaleWidth - 4 * Picture1.ScaleHeight / Picture1.ScaleWidth / Picture1.ScaleHeight * C2
If nouveauz(0) ^ 2 + nouveauz(1) ^ 2 > 4 Then
SetPixel Picture1.hdc, C1, C2, RGB(I / Passe * 255, 0, 0)
Exit For
End If
ancienz(0) = nouveauz(0)
ancienz(1) = nouveauz(1)
Next I
Next C2
Next C1
End Sub
'**********************************
c'est un peu plus rapide quand même :)
et la encore, je me demande s'il n'y aurait pas encore moyen d'optimiser... va faloir que je regarde encore :)
mais bravo pour ton code, j'ai apris des choses avec !
17 juin 2003 à 20:51
Lis ça tu verras tu iras mieux. ( pour la vitesse )
18 juin 2003 à 16:26
Je précise que j'ai modifié l'algo présenté ici pour l'optimiser (une seule passe, diverses simplifications et obtimisations diverses).
La référence de vitesse que j'ai prise (100%) représente la vitesse de calcule pure, c'est à dire sans aucun dessin puis j'ai mesuré le temps dans l'ide et compilé des 4 méthodes de dessin suivantes :
API SetPixel,Pset,le module matrixbuffer, et le dessin avec Picture1.Line -Step
IDE EXE
Line : 205% 240%
Pset : 170% 120%
SetPixel : 115% 115%
Matrix : 105% 105%
Outre le coté amusant du PSet qui vu son résultat est transformé en un appel a l'api a la compilation, on peut déja observer que l'utilisation de line est a proscrire (pas de chance djotto : c'est la méthode que t'as choisi :-) bon cela dit, on s'en serait douté...
Pour le reste Pset désavantage le développeur qui teste, à cause de sa plus grande lenteur dans l'IDE qu'une fois compilé. utiliser SetPixel est raisonnable, par contre le module de Proger fait des miracles ! clairement il est bien plus rapide pour dessiner !
Mais... un détail quand même : le module matrixbuffer n'affiche l'image qu'a la fin tandisqu'avec toutes les autres méthodes l'utilisateur 'voit' l'image se construire...
voila voila bonne prog :)
18 juin 2003 à 16:43
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.