FRACTAL DE MANDELBROT

jesusonline
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Membre
Dernière intervention
13 octobre 2010
- 11 févr. 2007 à 01:21
cs_EBArtSoft
Messages postés
4525
Date d'inscription
dimanche 29 septembre 2002
Statut
Modérateur
Dernière intervention
22 avril 2019
- 20 mai 2008 à 22:41
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/41440-fractal-de-mandelbrot

cs_EBArtSoft
Messages postés
4525
Date d'inscription
dimanche 29 septembre 2002
Statut
Modérateur
Dernière intervention
22 avril 2019
9
20 mai 2008 à 22:41
Et encore... il y a trop de "New" à mon gout !
cs_EBArtSoft
Messages postés
4525
Date d'inscription
dimanche 29 septembre 2002
Statut
Modérateur
Dernière intervention
22 avril 2019
9
20 mai 2008 à 22:40
Voila ce que je propose :

Private Structure ARGB
Dim r As Byte
Dim g As Byte
Dim b As Byte
Dim a As Byte
End Structure

Private Declare Ansi Sub Copy Lib "kernel32" Alias "RtlMoveMemory" (ByVal memTo As Integer, ByRef memFrom As ARGB, ByVal Length As Integer)

Public Sub DraMandelbrotFractal()

'Me.Width = ((Me.Width + 3) And Not 3) 'Seulement pour 24Bits RGB

Static _Width As Integer = Me.Width
Static _Height As Integer = Me.Height
Static halfX As Integer = _Width * 2 / 3
Static halfY As Integer = _Height * 0.5
Static siz As Integer = _Width * _Height * 4
Static z1 As Single = 1 / Me._depth * 64
Static z2 As Single = 1 / Me._depth * 255
Static StepX As Integer = 0

Dim Pixels(_Height - 1, _Width - 1) As ARGB
For j As Integer = 0 To (_Height - 1)
For i As Integer = 0 To (_Width - 1)
stepx = Me.GetStep(New Complex((i - halfX) / 150D, (j - halfY) / 150D))
If (stepx > 0) Then
With Pixels(j, i)
.a = 255
.r = z1 * stepx
.b = z2 * stepx
End With
End If
Next
Next

Me._bmpBuffer = New Bitmap(_Width, _Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
Dim bmpData As Imaging.BitmapData = Me._bmpBuffer.LockBits(New Rectangle(0, 0, _Width, _Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
'Marshal.Copy(NewPixel, 0, bmpData.Scan0, NewPixel.Length)
Copy(bmpData.Scan0, Pixels(0, 0), siz)
Me._bmpBuffer.UnlockBits(bmpData)

Graphics.FromImage(Me._bmpBuffer).DrawString("Mandelbrot's Fractal", Me._font, Me._fontBrush, Point.Empty)
Me.CreateGraphics().DrawImage(Me._bmpBuffer, Point.Empty)

End Sub

Apres difficile de faire mieu sans changer le comportement des autres methodes dont celles qui prennent le plus de temps : Complexe et GetStep

Et puis on pourrais creer le bitmap au moment de l'initialisation et pas a chaque fois, bref l'optimisation peut ce faire un peu partout.

@+
guillaume1136
Messages postés
21
Date d'inscription
jeudi 10 novembre 2005
Statut
Membre
Dernière intervention
3 juin 2008

20 mai 2008 à 17:16
comme dans ce coin on parle assembleur (ou on parlait...).
Il me vien une question.

En C++.Net unsafe produit t'il du code IL ou du code natif?

La r?ponse semble a priorie ?tre non, puisse que l'on peut utilis? des objet manag?,
donc il y a utilisation de Handle, donc vraisembleblement on passe par la machine virtuel .Net, donc vraisemblement par le code IL.

Et une deuxi?me question me vien, en C++.Net toujours, les bloc _asm quand ? eux,
en quoi sont il compil? ?

Une traduction de l'assembleur en IL (si c'est possible), ou directement de l'assembleur non manag?.
BruNews
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
11 févr. 2007 à 19:50
ok Bidou, j'avais bien noté avec ta réponse plus haut au vu de data1->Scan0.
cs_Bidou
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
11 févr. 2007 à 19:44
Pour le code VB il m'a généré ceci:
Dim numPtr1 As Byte* = DirectCast(data1.Scan0, Byte*)

Ce qui semble étonnant étant donné que d'après toi on ne peut pas utiliser les pointeurs en VB.NET.
Ce qui est sûr c'est que ce qui est généré par Reflector est à prendre avec des pincettes...

Pour revenir à la question de savoir si on n'est obligé de mettre du code natif dans un bloc unsafe en C++.NET, je dirais que non : http://www.springerlink.com/content/h4092285755hu473/
Afficher les 16 commentaires