![]() |
|
Fractal - Printable Version +- Boriel Basic Forum (https://forum.boriel.com) +-- Forum: Compilers and Computer Languages (https://forum.boriel.com/forumdisplay.php?fid=12) +--- Forum: ZX Basic Compiler (https://forum.boriel.com/forumdisplay.php?fid=11) +---- Forum: Gallery (https://forum.boriel.com/forumdisplay.php?fid=18) +---- Thread: Fractal (/showthread.php?tid=431) |
Fractal - britlion - 2012-02-18 Just for fun. Incidentally, if I change the float types to fixed, it crashes. Has something gone wrong with fixed type maths? EDIT: Updated with fixed and exit for, so if people use it here, they get the best version. Code: #define width 256
#define height 192
DIM x,y as FIXED
DIM xstart,xstep,ystart,ystep as FIXED
DIM xend,yend as FIXED
DIM z,zi,newz,newzi as FIXED
DIM colour as byte
DIM iter as uInteger
DIM col as uInteger
DIM i,k as uByte
DIM j as uInteger
dim inset as uByte
xstart=-1.6
xend=0.65
ystart=-1.15
yend=-ystart
iter=24
xstep=(xend-xstart)/width
ystep=(yend-ystart)/height
'Main loop
x=xstart
y=ystart
border 0
paper 0
ink 7
CLS
for i=0 to ( height -1 )/2 +1
for j=0 to width -1
z=0
zi=0
inset=1
for k=0 to iter
';z^2=(a+bi)*(a+bi) = a^2+2abi-b^2
newz=(z*z)-(zi*zi)+x
newzi=2*z*zi+y
z=newz
zi=newzi
if (z*z)+(zi*zi) > 4 then
inset=0
colour=k
exit for
END IF
next k
if NOT inset then
if colour BAND 1 THEN
plot j,i
plot j,192-i
END IF
end if
x=x+xstep
next j
y=y+ystep
x=xstart
print at 23,0;CAST(uinteger,i)*200/height;"%"
next i
BEEP 1,1
PAUSE 0(This will take a long time. Even if you push an emulator to top speed) Re: Fractal - boriel - 2012-02-18 Awesome!!! hock: I'll put this in the Wiki, if you don't mind, in the Examples section. :?: Re: Fractal - britlion - 2012-02-18 Course you can. (Though again - why does it seem to break with fixed, not float?) Re: Fractal - britlion - 2012-02-18 Oh - I also thought I should be able to use "end for" in the place I have "goto screen". Not sure why it refuses to compile that. Re: Fractal - boriel - 2012-02-18 It might be a bug, or might be a matter of precision. :?: Don't know. I know there's an integer version of Mandelbrot, BTW. Re: Fractal - boriel - 2012-02-18 britlion Wrote:Oh - I also thought I should be able to use "end for" in the place I have "goto screen". Not sure why it refuses to compile that.The correct syntax for that is "EXIT FOR" (this is like a Break sentence in C/C++) Re: Fractal - slenkar - 2012-02-18 quite nice
Re: Fractal - britlion - 2012-02-18 boriel Wrote:britlion Wrote:Oh - I also thought I should be able to use "end for" in the place I have "goto screen". Not sure why it refuses to compile that.The correct syntax for that is "EXIT FOR" (this is like a Break sentence in C/C++) Doh! Me idiot. Yes, that works. Much better than a goto. Re: Fractal - britlion - 2012-02-18 boriel Wrote:It might be a bug, or might be a matter of precision. :?: I don't think a lack of precision should cause a restart, however... And yes. I didn't do that one integer would be faster.
Re: Fractal - britlion - 2012-02-18 slenkar Wrote:quite nice Oh slenkar! Now you've given it away
Re: Fractal - boriel - 2012-02-18 britlion Wrote:A restart???boriel Wrote:It might be a bug, or might be a matter of precision. :?: Please send me the code. I would like to test it, please :?: Re: Fractal - britlion - 2012-02-18 Same code, with "FIXED" wherever DIM had "FLOAT" I could believe in it going out of bounds or something, but shouldn't just crash... Code: #define width 256
#define height 192
DIM x,y as FIXED
DIM xstart,xstep,ystart,ystep as FIXED
DIM xend,yend as FIXED
DIM z,zi,newz,newzi as FIXED
DIM colour as byte
DIM iter as uInteger
DIM col as uInteger
DIM i,k as uByte
DIM j as uInteger
dim inset as uByte
xstart=-1.6
xend=0.65
ystart=-1.15
yend=-ystart
iter=24
xstep=(xend-xstart)/width
ystep=(yend-ystart)/height
'Main loop
x=xstart
y=ystart
border 0
paper 0
ink 7
CLS
for i=0 to ( height -1 )/2 +1
for j=0 to width -1
z=0
zi=0
inset=1
for k=0 to iter
';z^2=(a+bi)*(a+bi) = a^2+2abi-b^2
newz=(z*z)-(zi*zi)+x
newzi=2*z*zi+y
z=newz
zi=newzi
if (z*z)+(zi*zi) > 4 then
inset=0
colour=k
exit for
END IF
next k
screen:
if NOT inset then
if colour BAND 1 THEN
plot j,i
plot j,192-i
END IF
end if
x=x+xstep
next j
y=y+ystep
x=xstart
print at 23,0;CAST(uinteger,i)*200/height;"%"
next i
BEEP 1,1
PAUSE 1
PAUSE 0Re: Fractal - boriel - 2012-02-25 It was a bug in Fixed multiplication. Please, download release 1.2.9s789 or newer, and tell mi if it works (it did for me!). I don't see much improvement. :?: :?: :?: Can you measure the time it takes to draw the fractal with fixed variables, please? There should be some performance gain. NOTE: This release includes your MLDepacker routine (fastcalled). NOTE2: Happy Birthday! :!: :mrgreen: Re: Fractal - britlion - 2012-02-25 boriel Wrote:It was a bug in Fixed multiplication.I added a timer function to it, and grabbed the timer before and afterwards. Float: s777 : 5237.6 Seconds. s789 : 5237.9 Seconds Fixed: S789 : 2159.76 Seconds I think that's a fair speed improvement, actually.... boriel Wrote:NOTE: This release includes your MLDepacker routine (fastcalled). Nice! I added that to the library - so there's a link to the packer program in there too. You might want to tweak that to note that it's in the package. boriel Wrote:NOTE2: Happy Birthday! :!: :mrgreen: Thankee Kindly. I'm /really/ getting old now! Re: Fractal - britlion - 2012-02-25 Should be able to get it faster still using the integer method - which cheats and multiplies up decimals: DIM xl,yl as long DIM xstartl,xstepl,ystartl,ystepl as long DIM xendl,yendl as long DIM zl,zil,newzl,newzil as long #DEFINE MULTIPLIER 10000 xstartl=xstart * MULTIPLIER xendl=xend * MULTIPLIER ystartl=ystart * MULTIPLIER yendl=yend * MULTIPLIER xl = x * MULTIPLIER yl = y * MULTIPLIER Though I tried this to abject failure. Anyone else get anywhere? |