Something I've mentioned before is that if we look at generalized cubics of the form z = z^3 + k z + c (eliminating the z^2 term by moving the origin), we get a collection of Julia sets Jkc for these maps. And the cubic mandebrots Mk are the set of all c such that Jkc is connected.
I recently implemented these guys in Ultra Fractal, see my public formula and parameter files rvr.ufm and rvr.upr. Also see my blog post
http://www.rudyrucker.com/blog/2010/04/02/the-rudy-set-fractal/.
My belief is that we could make a nice 3D Mandelbulb-style shape by stacking up a sequence of the Mk. To suggest what I'm getting at, here's a YouTube video that scans forward and back through some of the Mk. [I updated the video on April 16, 2010].
http://www.youtube.com/v/ytCIGUS4DKI&rel=1&fs=1&hd=1I don't see too much evidence of the dreaded taffy or whipped cream; if we could find a way to stack up a few hundred of the Mk and render as a 3D object, we'd have something nice.
One thing I'm noticing is that in many spots you're seeing an overlay of two patterns...this is because the Mk points are determined by the non-escape of TWO different critical points.
I am unsure if there would be a distance-estimator formula for this.
For those interested, here is the Ultra Fractal code for the general Cubic Mandelbrot Mk.
GeneralCubicMandelbrot {
; This formula was used in the Autodesk program, "James Glieck's Chaos: The Software."
; The program was written by Josh Gordon, Rudy Rucker, and John Walker.
; This cubic mandelbrot algorithm was developed by Rudy Rucker, based on
; work on the cubic connectedness map by Douady, Hubbard and Milnor.
; This set is called M_K, and it consists of all points C such that
; the cubic Julia set J_KC is connected. It turns out we can test for this by
; seeing if K and -K do not escape under the fKC iteration.
; M_K is symmetric around the origin.
;See http://www.rudyrucker.com/blog/2010/04/02/the-rudy-set-fractal/
;for more background information.
global:
; This section is executed once per image.
float Kreal = real(@Kparam)
float Kimag = imag(@Kparam)
float Kparam_a = 3.0 * (sqr(Kimag)- sqr(Kreal))
float Kparam_b = -6.0 * Kreal * Kimag
init:
; The code in this section is executed once per pixel.
;shared variables
float cx = real(#pixel)
float cy = imag(#pixel)
float tempa
float tempb
float tempcache
;K escape variables
float pos_ftx = Kreal
float pos_fty = Kimag
float pos_fx2 = sqr(pos_ftx)
float pos_fy2 = sqr(pos_fty)
;-K escape variables
float neg_ftx = -Kreal
float neg_fty = -Kimag
float neg_fx2 = sqr(neg_ftx)
float neg_fy2 = sqr(neg_fty)
loop:
; The code in this section is repeatedly executed, until
; either the maximum iteration count has been reached (then
; the pixel being computed is considered to be inside), or
; the boolean expression in the bailout: section becomes
; false (then the pixel is considered to be outside).
;iterate from the K test point.
tempa = pos_fx2 - pos_fy2 + Kparam_a
tempb = 2 * pos_ftx * pos_fty + Kparam_b
tempcache = tempa * pos_ftx - tempb * pos_fty + cx
pos_fty = tempa * pos_fty + tempb * pos_ftx + cy
pos_ftx = tempcache
pos_fx2 = sqr(pos_ftx)
pos_fy2 = sqr(pos_fty)
;iterate from the -K test point with the same formulas
tempa = neg_fx2 - neg_fy2 + Kparam_a
tempb = 2 * neg_ftx * neg_fty + Kparam_b
tempcache =tempa * neg_ftx - tempb * neg_fty + cx
neg_fty = tempa * neg_fty + tempb * neg_ftx + cy
neg_ftx = tempcache
neg_fx2 = sqr(neg_ftx)
neg_fy2 = sqr(neg_fty)
bailout:
; When this expression becomes false, the iteration
; loop is stopped, and the pixel is considered to be outside.
; A pixel is outside the MK set if either the K or the -K
; test point escapes.
pos_fx2 + pos_fy2 < @bailout && neg_fx2 + neg_fy2 < @bailout
default:
; This section contains default settings that make the
; fractal formula and its parameters easier to use.
title = "Mandelbrot Cubic (K Plane)"
float param bailout
caption = "Bail-out value"
hint = "This is the bail-out value"
default = 4.0
min = 1
max = 256
exponential = true
endparam
complex param Kparam
caption = "K param"
hint = "We are drawing the generalized cubic Mandelbrot set MK which depends on a complex parameter K"
default = (-0.4055, -0.1135)
min = (-1.5, -1.5)
max = (1.5, 1.5)
endparam
switch:
; This section is specifies a formula in the same file that we can switch down to.
; We'll switch from the General Cubic Mandelbrot down to the General Cubic Julia.
type = "GeneralCubicJulia"
Kparam = Kparam
Cparam = #pixel
bailout = bailout
}