Bratapfelmännchen II

06/12/2008 - 22:58 von Olaf Doschke | Report spam
ich nochmal, ich hoffe hier wird der Code nicht zerschrotet...

schönen Restnikolaus und 2. Advent.

* Bratapfelmànnchen von Olaf Doschke
* nach einer Vorlage aus
* http://de.wikipedia.org/wiki/Mandelbrot-Menge
* siehe dort auch für nàhere ERlàuterungen der
* dahinter stehenden Mathematik

#Define cnXResolution 800
#Define cnYResolution 600
#Define cnCenterRe -0.7
#Define cnCenterIm 0
#Define cnWidthRe 3
#Define cnHeightIm cnWidthRe*0.75
#Define cnMaxIterationen 127
#Define cnMaxBetragsquadrat 9

Clear
With _Screen
.DrawWidth = 1

Local lnCre, lnCim, lnX, lnY

For lnY = -cnYResolution/2 To cnYResolution/2
For lnX = -cnXResolution/2 To cnXResolution/2
* Startwert der Mandelbrotfolge ermitteln
lnCre = cnCenterRe+(lnX/(cnXResolution-1))*cnWidthRe
lnCim = cnCenterIm-(lnY/(cnYResolution-1))*cnHeightIm
* Iterationstiefe der Mandelbrot-Zahlenfolge berechnen
lnIterationen = PunktIteration(lnCre,lnCim)
If lnIterationen = cnMaxIterationen
* Konergenz wird angenommen, Punkt gehört zur Mandelbrotmenge
.ForeColor = Rgb(0,0,0)
.PSet(lnX+cnXResolution/2,lnY+cnYResolution/2)
Else
* Divergenz der Folge, Einfàrbung je nach nötiger Anzahl
Iterationen
* zur Überschreitung des Betrags cnMaxBetragsquadrat
* Je nàher ein Punkt an der Mandelbrotmenge je heller
.ForeColor =
Rgb(lnIterationen+127,lnIterationen*2,lnIterationen*2)
.PSet(lnX+cnXResolution/2,lnY+cnYResolution/2)
Endif
Endfor
Endfor
EndWith

Function PunktIteration()
Lparameters tnCre,tnCim

Local lnZre, lnZim, lnIterationen, lnBetragsQuadrat

* Iterationszàhler
lnIterationen = 1

* Startwert der Folge (eigentlich 0, aber 0^2+C = C)
lnZre = tnCre
lnZim = tnCim

* Betragsquadrat der komplexen Zahl
lnBetragsQuadrat = lnZre*lnZre+lnZim*lnZim

* Berechnung der Folge
Do While lnBetragsQuadrat<=cnMaxBetragsquadrat And
lnIterationen<cnMaxIterationen
lnIterationen = lnIterationen + 1

* Zn+1= Zn^2+C, aufgesplittet in Real- und Imaginàrteil der komplexen
Zahl Z
lnZreTemp = lnZre * lnZre - lnZim * lnZim + tnCre
lnZimTemp = 2 * lnZre * lnZim + tnCim
lnZre = lnZreTemp
lnZim = lnZimTemp
lnBetragsQuadrat = lnZre*lnZre+lnZim*lnZim
Enddo

Return lnIterationen
Endfunc

Tschüß, Olaf.
 

Lesen sie die antworten

#1 Jürgen Wondzinski
07/12/2008 - 12:46 | Warnen spam
Hi Olaf,

Danke für die Umsetzung! Das weckt Erinnerungen an die ersten
Graphik-Bildschirme.. Hach was war ich damals auf meinen ersten EGA-Monitor
stolz ;)

Man sollte als Tipp noch dazusagen: Alle Debug und Property-Fenster etc
wegschalten. Dann làufts gleich vieel flotter.

Ich hab mal folgende Ergànzung dazugemacht, um es anstatt im Screen in einer
Form laufen zu lassen
(anstelle des With _screen reinsetzen:)

*
SET TALK OFF
SET ESCAPE ON
nStart = SECONDS()
PUBLIC oWind
oWind = crea("Form")
WITH oWind as Form
..height = cnYResolution
..width = cnXResolution
..autoCenter = .t.
..Caption = "Apfelmànnchen"
..Visible = .t.

&& ab hier kommt wieder OriginalCode
..DrawWidth = 1
*

Das Ende der ENDFOR/ENDWITH Schleife noch umbauen auf:
*
ENDFOR
.Caption = .Caption + ": "+ TRANSFORM(SECONDS()-nStart, "999.999") +" sec"
EndWith
*

Mein Rechner bringt dann mit dieser Konfiguration ne Zeit von 60,5 sec raus.
So, und nu können wir versuchen noch zu optimieren:

Ein SET ESCAPE OFF bringt keinen nennenswerten Unterschied (Hàtt ich
gedacht, weil VFP ja bei ON zwischen jedem Statement die Tastatur checken
muss)

Ein Wegschalten der LOCAL Statements bringt nix.

Ein .Visible = .F. und dann erst nach Fertigstellung sichtbar schalten
bringts auf 54,7 sec, also 10% verbessert. Dafür aber langweiliger, weil man
nüx sieht...

Ne merkbare Beschleunigung kommt mit einem Herabsetzen der cMaxIterationen
auf zb 64, dabei ist die Graphik immer noch nett zum Anschauen, aber die
Zeit verkürzt sich auf 43 sec.



Ich erinnere mich, dass wir damals auch Routinen hatten, in die man
reinzoomen konnte. Die Steigerung wàr also jetzt, wenn man mit der Maus nen
Bereich markieren könnte, und den dann neu auf Fenstergrösse berechnen
lassen kann. Dann erst wird der Zauber der Mandelbrot Routinen erst so
richtig sichtbar...

Auch mein ich, dass die damals irgendwie bunter waren ?

Auf zum fröhlichen Basteln!




Jürgen Wondzinski

Microsoft Visual FoxPro Technologieberater
Microsoft Most Valuable Professional seit 1996
"*Žš)
ž..Žž..*Žš) ž..*š)
(ž..Ž. (ž..` *
...`.Visual FoxPro: It's magic !
(ž..``..*

Ähnliche fragen