| |
|
|
Julian Schmidt | Hey, ich versuche gerade die Mandelbrotmenge mit XProfan zu zeichnen.
Die Formel zur Bildung der Mandelbrotmenge ist
C steht hier für eine komplexe Zahl. Wie geb ich die in XProfan an? Ich dachte mir zuerst das der Betrag von C gleich der Länge des Verktors ist. Ergo gleich Wurzel(Realteil(c)^2+Imaginärteil(c)^2) Dies scheint nur nicht zu funktionieren.
Def !CXMin -2.2
Def !CXMax 1.2
Def !CYMin -1.5
Def !CYMax 1.5
Def &Iterationen 20
Windowstyle 24
WindowTitle "Mandelbrotmenge"
Window 50,100 - 400, 300
Declare CX!, CY!, CX2!, CY2!, Z!
Declare LX&, LY&
Declare IC&, ColIC&
whileloop 0, width(%hwnd)
LX&=&loop
CX2!=CX!
CX!=!CXMin+(LX&/width(%hwnd))*(!CXMax-!CXMin)
Clear LY&
whileloop 0,height(%hwnd)
LY&=&loop
CY2!=CY!
CY!=!CYMax-(LY&/height(%hwnd))*(!CYMax-!CYMin)
Clear IC&,Z!
whileloop &Iterationen
Z!=Sqr(Z!)+Sqrt(Sqr(CX2!)+Sqr(CY2!))' ZN+1=ZN+Complex(CX,CY)
IC&=&loop
Case Z!>4 : break
EndWhile
ColIC&=(IC&/&Iterationen)*255
SetPixel LX&,LY&,RGB(ColIC&,ColIC&,ColIC&)
Endwhile
Endwhile
waitinput
Gruß |
|
|
| |
|
|
|
Julian Schmidt | |
|
| |
|
|
|
Georg Teles | Oha, du gräbst ja tief, hätte ich die Höhere Mathematik nicht vernachlässigt würde ich vielleicht helfen können xP sry keine Idee |
|
|
| |
|
|
|
Paul Glatz |
Def !CXMin -2.2
Def !CXMax 1.2
Def !CYMin -1.5
Def !CYMax 1.5
Def &Iterationen 100
Windowstyle 24
WindowTitle "Mandelbrotmenge"
Window 50,100 - 400, 300
Declare CX!, CY!, CX2!, CY2!, x!, x2!, y!
Declare LX&, LY&
Declare IC&, ColIC&
whileloop 0, width(%hwnd)
LX&=&loop
CX2!=CX!
CX!=!CXMin+(LX&/width(%hwnd))*(!CXMax-!CXMin)
Clear LY&
whileloop 0,height(%hwnd)
LY&=&loop
CY2!=CY!
CY!=!CYMax-(LY&/height(%hwnd))*(!CYMax-!CYMin)
Clear IC&, x!, x2!, y!
whileloop &Iterationen
SetText %hwnd,str$(&loop)
x2! = x! * x! - y! * y! + cx2!
y! = 2 * x! * y! + cy2!
x! = x2!
IC& = &loop
If (x! * x! + y! * y! > 4)
Break
EndIf
EndWhile
ColIC&=(IC&/&Iterationen)*255
SetPixel LX&,LY&,RGB(ColIC&,ColIC&,ColIC&)
Endwhile
Endwhile
waitinput
|
|
|
| |
|
|
|
Julian Schmidt | Klappt!
|
|
|
| |
|
|
|
Paul Glatz | Hier mal etwas größer
|
|
|
| |
|
|
|
Julian Schmidt | Anderes Farbschema
Def !CXMin -2.2
Def !CXMax 1.2
Def !CYMin -1.5
Def !CYMax 1.5
Def &Iterationen 50
Windowstyle 24
WindowTitle "Mandelbrotmenge"
Window 50,100 - 400, 300
Declare CX!, CY!, x!, x2!, y!
Declare LX&, LY&
Declare IC&
whileloop 0, width(%hwnd)
LX&=&loop
CX!=!CXMin+(LX&/width(%hwnd))*(!CXMax-!CXMin)
Clear LY&
whileloop 0,height(%hwnd)
LY&=&loop
CY!=!CYMax-(LY&/height(%hwnd))*(!CYMax-!CYMin)
Clear IC&, x!, x2!, y!
whileloop &Iterationen,0,-1
x2! = x! * x! - y! * y! + cx!
y! = 2 * x! * y! + cy!
x! = x2!
IC& = &loop
If (x! * x! + y! * y! > 4)
Break
EndIf
EndWhile
SetPixel LX&,LY&,RGB((LX&/width(%hwnd))*256,(LX&/width(%hwnd))*256,IC& | (IC& << 8))
Endwhile
Endwhile
waitinput
|
|
|
| |
|
|
|
Paul Glatz | Andere Farben
Def !CXMin -2.2
Def !CXMax 1.2
Def !CYMin -1.5
Def !CYMax 1.5
Def &Iterationen 100
Windowstyle 24
WindowTitle "Mandelbrotmenge"
Window 50,100 - 400, 300
Declare CX!, CY!, CX2!, CY2!, x!, x2!, y!
Declare LX&, LY&
Declare IC&, ColIC&
whileloop 0, width(%hwnd)
LX&=&loop
CX2!=CX!
CX!=!CXMin+(LX&/width(%hwnd))*(!CXMax-!CXMin)
Clear LY&
whileloop 0,height(%hwnd)
LY&=&loop
CY2!=CY!
CY!=!CYMax-(LY&/height(%hwnd))*(!CYMax-!CYMin)
Clear IC&, x!, x2!, y!
whileloop &Iterationen
x2! = x! * x! - y! * y! + cx2!
y! = 2 * x! * y! + cy2!
x! = x2!
IC& = &loop
If (x! * x! + y! * y! > 4)
Break
EndIf
EndWhile
If IC& = &Iterationen
SetPixel LX&,LY&,0
Else
ColIC&=((&Iterationen - IC&)/&Iterationen)*360
SetPixel LX&,LY&,hsv(ColIC&,1,1)
EndIf
Endwhile
EndWhile
Waitinput
Proc hsv
Parameters h!,s!,v!
Var hi% = h!/60
Var f! = ((h!/60) - hi%)
Var p! = V!*(1-S!)
Var q! = V!*(1-S!*f!)
Var t! = V!*(1-S!*(1-f!))
Select hi%
CaseOf 1
Return rgb(q!*255,v!*255,p!*255)
CaseOf 2
Return rgb(p!*255,v!*255,t!*255)
CaseOf 3
Return rgb(p!*255,q!*255,v!*255)
CaseOf 4
Return rgb(t!*255,p!*255,v!*255)
CaseOf 5
Return rgb(V!*255,p!*255,q!*255)
Otherwise
Return rgb(v!*255,t!*255,p!*255)
EndSelect
EndProc
|
|
|
| |
|
|
|
Georg Teles | Sieht super aus, klasse |
|
|
| |
|
|
|
p.specht
| Versuche gerade, dem Mandelbrot-Progi der Herren Schmid und Glatz mittels xpse etwas Dampf zu machen. Aus vielen Fehlern gelernt, hier ein halbwegs funktionierendes Teil (Anmerkungen im nächsten Beitrag). ' -------------------------------------------------------- {$cleq}
Windowstyle 24:WindowTitle "Mandelbrot-Menge" cls 'Window (%maxx-640)/2,(%maxy-480)/2 - 640,480 'Window 0,0-%maxx,%maxy-42 declare cxmin!,cxmax!,cymin!,cymax!,iter&,tm&,ans&,zoom!,i&
zoom!=0.7 whileloop 10:i&=&loop zoom!=zoom!*1.3333 CXMin!=-2.2 /zoom! CXMax!= 1.2 /zoom! CYMin!=-1.5 /zoom! CYMax!= 1.5 /zoom! iter&=255 tm&=&gettickcount ans&=Mandel(cxmin!,cxmax!,cymin!,cymax!,iter&) tm&=&gettickcount-tm& locate 1,1:print format$("#0.0000 sec ",tm&/1000); waitinput 10 case (%key=27) or (%key=2):end Endwhile waitinput 60000 end
nproc Mandel parameters cxmin!,cxmax!,cymin!,cymax!,iter& Declare CX!,CY!,x!,x2!,y!,tmp!,LX& Declare LY&,IC&,col&,w&,hddc&,xd!,yd! w&=width(hwnd) hddc& = ~GetWindowDC( %hWnd ) xd! = CXMax! - CXMin! yd! = CYMax! - CYMin!
whileloop 0,w& LX&=&loop CX! = CXMin! ' f!=float(l&), Float2Long einfach l&=long(f!) tmp!= float(LX&) / float(w&) cx!=cx! + tmp! * xd! LY&=0 whileloop 0,height(%hwnd) LY&=&loop CY!=CYMax!-(float(LY&)/float(height(%hwnd)))*yd! IC&=0 x!=0 x2!=0 y!=0 whileloop Iter&,0,-1 IC& = &loop x2! = sqr(x!) - sqr(y!) + cx! y! = 2.0 * x! * y! y! = y! + cy! x! = x2! If (sqr(x!)+sqr(y!)) > 4.0 Break EndIf EndWhile col&=IC&*ic&*ic&*ic& 'col&=RGB( long((float(LX&)/float(width(%hwnd))) )*256, long(float(LX&)/float(width(%hwnd)))*256, IC& | (IC& << 8)) 'col& = RGB(IC&,IC&,IC& | (IC& << 8) ) 'sw SetPixel(%hdc,LX&,LY&,col&) Endwhile Endwhile return w& endproc |
|
|
| Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 31.08.2013 ▲ |
|
|
|
|
p.specht
| Viel gelernt, die Nacht durchgemacht beim debugging: %-Variable gibt es in xpse nicht (höchstens als Zierde zu Systemvariablen), CLEAR funktioniert nicht, setpixel u.ähnl. stets nur als Funktion() und mit dem richtigen devicecontext (hdc), dann noch ein paar Fehler beim Aufruf: float() / float() * 2.0 <<komma Null!! Gruss
Frage an die Fachwelt: Muss ich den devicekontext nicht auch am ende killen? Welche Speicherlecks gibts allenfalls noch? |
|
|
| Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 01.09.2013 ▲ |
|
|
|
|
funkheld | Hmmm..., sieht gut aus .
Vielleicht sollte man in der nProc für XPSE mal Fließkomma-ASM reinsetzen. Interessiert mich mal wie es damit geht. Und auch die Geschwindigkeit.
Wenn ich mir den ASM-Code von XPSE dafür anschaue, sehe ich keinen einzigen ASM-Floatbefehl darin, ich nehme an, das hier einfach die langsamen Fließkommaroutienen von Profan genommen werden ?
Man kann in dem ASM auch die Grafikroutinen mit einbauen Habe mal ein Test gemacht, es werden Rechtecke gezeichnet von links Oben nach rechts Unten :
declare ende&
Window 20,20-750,770
Cls RGB(255,255,255)
UsePen 0,1,RGB(255,0,0)
api_asm()
ende&=1
WHILE ende&
sleep 1
waitkey
ENDWHILE
nproc api_asm() {
long f=0
Long z=500
mov ecx,0
mov eax,0
anfang:
Add eax,1
Add ecx,1
Mov f,eax
PushAll
Rectangle(%hdc,20+f,20+f,200+f,200+f)
PopAll
cmp ecx,z
jb anfang
}
Danke. Gruss |
|
|
| |
|
|