FRACTMANDELBROT, LA SUITE DE LA SÉRIE "IMAGES FRACTALES"
lpikachu58
Messages postés351Date d'inscriptionsamedi 2 février 2002StatutMembreDernière intervention 6 mai 2004
-
15 juin 2003 à 23:42
cs_Jayz
Messages postés27Date d'inscriptionsamedi 7 juin 2003StatutMembreDernière intervention 6 août 2003
-
20 juin 2003 à 02:21
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
cs_Jayz
Messages postés27Date d'inscriptionsamedi 7 juin 2003StatutMembreDernière intervention 6 août 2003 20 juin 2003 à 02:21
N'y a t'il vraimment aucune limite dans ce monde ! c fascinant tout ce qu'on peut faire dans ce language ! Par contre cet aplli m'impressionne sur le peu de ressources kel necessite meme avec mon cel@600 ca tourne...
cs_Alain Proviste
Messages postés908Date d'inscriptionjeudi 26 juillet 2001StatutModérateurDernière intervention 1 février 20152 18 juin 2003 à 21:19
Je vous l'avez dit matrixbuffer ça pète...
cs_orisa
Messages postés38Date d'inscriptionlundi 18 mars 2002StatutMembreDernière intervention29 octobre 2003 18 juin 2003 à 16:43
Encore une remarque : inutile d'essayer de mettre une progressbar si vous utilisez le module matrixbuffer : ça fait perdre tout le gain de rapidité (et même plus) : si vous voulez que l'utilisateur voit qu'il se passe quelque chose utilisez setpixel :)
cs_orisa
Messages postés38Date d'inscriptionlundi 18 mars 2002StatutMembreDernière intervention29 octobre 2003 18 juin 2003 à 16:26
J'ai fait quelques tests de rapidité.
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 :)
cs_Alain Proviste
Messages postés908Date d'inscriptionjeudi 26 juillet 2001StatutModérateurDernière intervention 1 février 20152 17 juin 2003 à 20:51
Lis ça tu verras tu iras mieux. ( pour la vitesse )
cs_orisa
Messages postés38Date d'inscriptionlundi 18 mars 2002StatutMembreDernière intervention29 octobre 2003 17 juin 2003 à 08:47
Pas mal. je me permet de de donner quelques conseils d'optimisation.
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 :
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 !
lpikachu58
Messages postés351Date d'inscriptionsamedi 2 février 2002StatutMembreDernière intervention 6 mai 20042 15 juin 2003 à 23:42
c'est vraiment de la méthode fractale, rien n'atteindra jamais l'ondelette
20 juin 2003 à 02:21
18 juin 2003 à 21:19
18 juin 2003 à 16:43
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 :)
17 juin 2003 à 20:51
Lis ça tu verras tu iras mieux. ( pour la vitesse )
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 !
15 juin 2003 à 23:42