
Rendering of Mandel/Julia set images typically begins by selecting a single initial complex point C from the image plane and then iterating Z from either 0 (Mandelbrot) or from a nonzero constant (Julia). The fundamental observation here is that the Mandelbrot/Julia set is 4dimensional to begin with. I.E. for every combination of {Zreal, Zimaginary, Creal, Cimaginary} (subsequently abbreviated Z.r, Z.i, C.r, C.i.), there exists a unique exit value. The natural way to visualize this data is as a 4D array of intensity values. A natural analogy is the 3D data produced by an MRI scan. MRI scans produce 3D arrays of tissue density values. 2D images are then produced from that 3D data either by rendering crosssections or by projecting all the 3D data onto a given image plane. Mandelbrot images are simply crosssections of the 4D data at Z = 0, and Julia Set images are simply crosssections at different planes. The original Buddhabrot image can be visualized as projections of the trajectories of Z values sampled from the Z = 0 plane.
This page describes my recent realization that the buddhabrot technique need not be limited to rendering just the Z trajectories beginning from a particular plane but instead can be generated from the entire 4D data set projected onto an arbitrary plane. This process is exactly analogous to projecting an entire MRI data set onto an arbitrary plane rather than simply taking a single crosssection of that same data and ignoring the rest. This extension is called a "Hologram" because any part of such an image is potentially influenced by all parts of the 4D domain. The only modification to the buddhabrot rendering code is that the initialization for the generation of each trajectory changes from:
Complex C = Complex.random();to now be:
Complex Z = new Complex(0, 0);
while(Z.magnitude() < 2)
...
Complex C = Complex.random();That's it! Buddhabrot images are now produced from the entire 4D domain. The image at the top of this page shows the result of using this technique to project the full 4D trajectory map data onto the familiar Z = 0 plane. You'll note that it's almost identical to the original Buddhabrot images; the only visible differences being in the central region towards the very bottom. So if the resulting image is roughly the same, what's the big deal? Well, just like the difference between an Xray and an MRI scan, we can now easily project this 4D object onto any 2D image plane!
Complex Z = Complex.random();
while(Z.magnitude() < 2)
...
It's natural to project onto the Z = 0 plane because all the action is in the Z values, but it's still very interesting to project onto different planes. The next most interesting projection planes are also the easiest to describe: i.e. those at right angles from the Z = 0 plane. A 3D box has faces parallel to the three major planes {X,Y}, {X,Z}, and {Y,Z}. In 4D there are six major planes. Using the complex number notation they are: {Z.r,Z.i} (shown above), {Z.r,C.r}, {Z.r,C.i}, {Z.i,C.r}, {Z.i,C.i}, {C.r,C.i}. To generate Buddhabrot renderings onto another plane, say the {Z.r,C.r} plane, only requires an even simple modification to the Z iteration loop which changes from:
while(z.magnitude() < 2) {to now be:
Z = Z.squared().plus(C);
incrimentPixel(Z.r, Z.i);
}
while(z.magnitude() < 2) {
Z = Z.squared().plus(C);
incrimentPixel(Z.r, C.r);
}
Only a single character needs
to be changed! The following pages show images projected onto the other
five major planes.