News: Did you know ? you can use LaTex inside Postings on fractalforums.com!  ## The All New FractalForums is now in Public Beta Testing! Visit FractalForums.org and check it out!

 Pages:    Go Down       Author Topic: Juliabrots - 3d and more  (Read 6413 times) Description: 0 Members and 1 Guest are viewing this topic.
Stailinn
Guest « on: July 09, 2009, 08:14:36 PM »

I've been popping into FF for a while and y'all do awesome stuff. I've been fixated for a while now on the "pure" Mandelbrot/Julia space, and finally decided to dig more into that.

Particularly, I was inspired by http://www.utopiansky.com/labratory/fractals/ - exploring the non-Mandelbrot and non-Julia planes, particularly the perturbed images, I was pretty sure there was interesting stuff to be mined from pure Juliabrots.

So I cooked up a "raytracer" in Java (I'm afraid it's not as polished as some of what you guys are cranking!...) The 'step' size is based on the mathematical distance between screen pixels where the eye vector crosses the plane of the screen (what I wanted was to render all the visible "voxels", so the higher the res of the image, the finer the step size is...) Once I hit a surface, I do a series of binary refinements (I've been using 7, to get the refinement to under 1% of a voxel), etc.

For coloring, I'm basing colors on the 'magnitude of Z in the last iteration' (ala Nick's "Fill Magnitude Rendermode" from the applet above). I noticed when using Nick's applet that, when using 'last mag of Z' to color Mandelbrot/Julia points, you get information on periodicity - bulbs which correspond to a factor of "max iterations" color with 'near zero' magnitudes. (And if you pick a prime number, you get the bulbs to color locally the same but differently from their neighbors... so it makes for an interesting surface).

My "max iterations" is cranked really high: the images I've done so far use 20,011 as the escape value (the first prime above 20k). This is to eliminate as much 'noise' - false hits - as possible from the images. In 2d, false hits are OK because the points around them give contextual information, but when doing a 3d raycast I feel false hits tend to muck up the shading (at least for me).

The goal at this point is to be able to visualize "all" of the points in the Juliabrot set, by rendering 3d slices as frames of an animation where the 4th axis is varied over 'time'. Ultimately, there will be four (4) animations, each one using a different component (Cr, Ci, Zr or Zi) for time. Then of course there's zoom explorations, etc... Anyway! 'Nuff said 'bout that. Below are some of the images I've got so far. I think the 3rd one (@ 800x600) took ~9 minutes to render on my laptop. I've also done a series of images where Zi is varied as 'time', I'll put those up later.

(a) Essentially a basic Mandelbrot as a 3d "slice" (b) Extending the Mandelbrot upward varying the initial real component of Z (instead of being fixed at '0'), showing the "slices" of the 'Cr x Zr' plane and the 'Ci x Zr' plane (c) Removing the constraints, showing all points (except for screen clipping ) in Juliabrot where initial imaginary component of Z is fixed at '0' This last one is hard to "see" - I expect that an animation of rotating views will give more visual context.

More to come...

Thanks again for the inspirations and the overall cool stuff you folks create!

- Mike Logged
cKleinhuis
Fractal Senior       Posts: 7044 formerly known as 'Trifox'  « Reply #1 on: July 09, 2009, 08:23:52 PM »

hi there, nice coder colors  Logged

---

divide and conquer - iterate and rule - chaos is No random!
Stailinn
Guest « Reply #2 on: July 10, 2009, 12:42:24 AM »

Heh, yah, they're pretty 80s... I'm in it for the math, less so for the art...  : But I'm open to ideas for improvement - what suggestions do you (or anyone) have?

- Mike Logged
David Makin
Global Moderator
Fractal Senior      Posts: 2286    « Reply #3 on: July 10, 2009, 02:44:49 AM »

Heh, yah, they're pretty 80s... I'm in it for the math, less so for the art...  : But I'm open to ideas for improvement - what suggestions do you (or anyone) have?

- Mike

Well unless you're going to render *much* larger I'm guessing you're way overdoing the max.iter required to get enough detail in the renders.

I just tried my latest algorithm (sorry just diffuse camera lighting at the moment):

Both using max. iter. 60, bailout 1024:  The half-render took around 38 secs @800*600 and the slice took under 10 secs @800*600.

Here's my code for calculating the step values - this is the "repeat" loop for each ray where the fractal iteration is performed as an inner repeat loop:

t4 is the delta value along the ray i.e. position =  (startx,starty,startz,startw)+t4*(deltax,deltay,deltaz,deltaw)
st4 is the initial value of t4 for the ray
end is the maximum value of t4 i.e. the "back-clip" position
p is initially 0 on entry into the ray's repeat loop
Note that the value of t12 is stored as t10 at the beginning of the ray's repeat loop *if* p==0
dists[] are the max. distances to step on a given iteration depth - initialised to large values before entry into the ray's repeat loop.
t5 is |final z| i.e. x^2+y^2 where z = x + i*y
i is the iteration count
gotval is false before entry into the ray's repeat loop
@iter is the max. iterations value
@bailout the standard bailout (as normal for fractint/UF)
@minval is the minimum test distance
@accuracy is for homing in on the given minimum test distance using the binary search - to get smooth surfaces for the normals (i.e. to avoid visible "stepping" on the image).
@scale is for user-adjustable accuracy - default 1.0, larger values to reduce the step distances (note that this reduces the distances actually stepped but does not affect the minimum test distance value i.e. changing this won't change the distance from "inside" of the render, it just changes the accuracy)

Code:
repeat
if p<100
t10 = t12
set values for iteration to position t4
else
set values for iteration to position (t4+1e-10)
endif
....iterate !
if p==0 && i>=@iter && t4<=st4
t4 = st4
gotval=true
elseif p<100
t9 = i + (log(0.5*log(@bailout)) - log(0.5*log(t5)))/log(2)
j = i
p = p + 100
else
t12 = i + (log(0.5*log(@bailout)) - log(0.5*log(t5)))/log(2)
t12 = (t9+@iter)/(@iter+((1.0e10*@iter)*abs(t7=t12-t9)))
p = p - 100
endif
if p==0 && !gotval
if (t12<@minval && t7>0) || i>=@iter
if @minval-t12<@minstep && i<@iter
gotval = true
else
p = 1
t4 = t4 - (t12 = 0.5*t10)
endif
else
if t12>dists[(j=j-1)]
t12 = dists[j]
else
dists[j] = t12
endif
if t12<dists[(j=j+1)]
dists[j] = t12
endif
if t12<dists[(j=j+1)]
dists[j] = t12
endif
if t12<dists[(j=j+1)]
dists[j] = t12
endif
t4 = t4 + (t12 = t12/(2.5*@scale))
endif
elseif p<100 && !gotval
if (abs(t5 = t12 - @minval)<@accuracy \
|| p>(log(@minval/@accuracy)/log(2)))
gotval = true
elseif t5>=0
t4 = t4 + (t12 = 0.5*t10)
else
t4 = t4 - (t12 = 0.5*t10)
endif
p = p + 1
endif
until gotval || t4>=end

Note that the 1e-10 and 1e10 could be adjustable. Logged

The meaning and purpose of life is to give life purpose and meaning.

http://www.fractalgallery.co.uk/
"Makin' Magic Music" on Jango
David Makin
Global Moderator
Fractal Senior      Posts: 2286    « Reply #4 on: July 10, 2009, 03:46:12 AM »

Heh, yah, they're pretty 80s... I'm in it for the math, less so for the art...  : But I'm open to ideas for improvement - what suggestions do you (or anyone) have?

- Mike

You mentioned using the 4th axis as "time" - IMHO it's more interesting to use "time" to rotate the axes in and out: Logged