blb.txt
Notes on the UltraFractal Formula file blb.ufm and Parameter file blb.upr.
Formulas, images and text, unless otherwise noted, are by Bradley Beacham.
Released 18 April 2003
Contents:
About blb.upr
About "Switch Mode"
About Chop Shop
About FnGlynn
About Fuzz
About MSet In The Sky With Diamonds
About Popcorn Julia Complex
About Quad
About UF-OK-nn
About UF-Chico, UF-Groucho, UF-Harpo, UF-LarryCurly, UF-Moe, and UF-Zeppo
About Yam Jam
Revision History
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
About blb.upr
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The UltraFractal Public Formula Database includes a parameter file, blb.upr,
containing several snapshots of some interesting places I found using the
formulas in blb.ufm. All images use just one layer and the default gradient,
and many are not zoomed. They are starting places for further exploration, not
finished pieces of fractal art. All images in blb.upr are Public Domain.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
About "Switch Mode"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
One of UltraFractal 's best features, I think, is that formulas can be written
to use the "Switch Mode", but many formulas don't use it. I have tried to
correct this by over-using the feature in these formulas. :-)
Here's a demonstration of how it works, from the user's perspective:
Start a new fractal image using the standard Mandelbrot formula. Then hit either
the F7 key or the Space Bar. Now the Fractal Mode window will open up to show
a miniature screen with a Julia fractal. Notice that when you move the pointer
around on the Mandelbrot screen, the image in the Fractal Mode window changes,
changing the Julia set with each movement. If you click the mouse button, you
will start a new fractal for that Julia set. If you think about what you are
seeing, you will understand why some people say the Mandelbrot set is a
"catalog" of Julia sets.
Well, I wrote most of these formulas to use this same "Switch Mode" system. If
switching is supported, you will see a heading in the formula parameters panel
that tells you whether you are in "M-Set Mode" or "J-Set Mode". It also reminds
you how to switch. "M-Set Mode" refers to Mandelbrot-like formulas, while
"J-Set Mode" refers to Julia-like formulas.
Rather than writing separate formulas for the M-Sets and J-Sets, I have combined
them. This "Switch-to-Yourself" approach is a modification of a trick I saw in
Dave Makin's file mmf.ufm. I think it is much easier than maintaining two
formulas, but maybe I'm just lazy...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
About Chop Shop
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Chop Shop lets you build formulas using fragments from other formulas that were
converted from complex math to plain-old algebra. Additional fragments were
arrived at by mutation, random typing, and trance channeling. :-)
Use Switch-Mode to explore Julia versions.
Here are some settings to recreate some other formulas, where:
"Mode = M" is the Mandelbrot form, and "J" is the Julia
"Styles" = "A,B,C" shows, in order: C-Style, X-Style, Y-Style
"Funcs" = "i,i,sin,i" means "X Function" = sin and all others = ident
"Abs = N,Y" means "Abs(x)?" = No and "Abs(y)?" = Yes.
Mode Styles Funcs Abs Formula (Other Settings)
-------------------------------------------------------------------------------
M A,A,A i,i,i,i N,N Mandelbrot/Julia
M A,A,A i,i,i,sin N,Y Electric Swimming Pool
M A,A,A i,i,i,sqrt N,Y Twinkles
M A,A,A i,i,sin,i Y,N Shrubbery
M A,A,A i,i,tan,i Y,N Galaxy
M A,A,C i,i,i,i N,N Strings
M A,B,B i,i,i,i N,N Cubic Mandelbrot/Julia
M A,B,B i,i,sin,i Y,N Kilroy
M A,D,A i,i,i,i N,N Robin
J A,F,F i,i,i,i N,N Gopalsamy3 (Seed = 1.099,0)
M A,G,G i,zero,i,i N,N Liar4 (Bailout = 1)
M A,H,H i,i,i,i N,N Manowar
M A,I,I i,zero,i,i N,N Phoenix
M A,J,J i,i,i,i N,N Mandelbrot/Julia 4th power
M A,M,M i,zero,i,i N,N Popcorn Julia
M A,P,P i,i,i,i N,N z^3 + z^2 + c
M A,Q,Q i,i,i,i N,N z^3 + z + c
M A,R,R i,i,i,i N,N z*(1-z) + c
M A,S,S i,i,i,i N,N z^2*c + c
M A,T,T i,i,i,i N,N z^4 + z^3 + c
M A,U,U i,i,i,i N,N z^4 + z^2 + c
M B,A,A i,i,i,sin N,Y Little Boats
M C,C,A i,i,i,i N,N Batman
M D,A,A i,i,i,i N,N Snakes
M E,A,A i,i,i,i N,N Broccoli
Don't limit yourself to these settings, though. The whole point of Chop Shop is
to mix and match in new combinations of settings. See blb.upr for lots of
snapshots.
Note: The original versions of many of these old formulas came from a CD-ROM
called "Fractal Ecstasy" (Deep River Publishing, 1993), including Electric
Swimming Pool, Twinkles, Shrubbery, Galaxy, Strings, Kilroy, Robin, Little
Boats, Batman, Snakes, and Broccoli. As a fractal generator, Fractal Ecstasy is
several generations behind UltraFractal but even now, ten years later, I think
the disc's animated zooms are still pretty cool.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
About FnGlynn
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
FnGlynn has been around in one form or another for several years. At heart, it
is really just a standard Julia formula with special default values for the
exponent and the Julia seed. (Thanks to Mark Hammond for the insight.) I have
tried to make that identity a little more explicit in the UF version. To see
the default image using a standard Julia formula, set the exponent to 1.5 and
the Julia seed to (-.2,0).
Jon Horner wrote the original FractInt formula and named it "Glynn". He wrote
that it was "Based on an illustration in Science PROBE! and a formula by
Earl Glynn in Computers and the Imagination, by Clifford Pickover."
I generalized/mutated it for FractInt by adding a user function, naming my
version "fnglynn". Now I have ported it to UltraFractal format and added a few
more options for applying a user function.
As a Julia formula by another name, this formula probably isn't really
necessary, but I'm including it for convenience and to support existing
parameter sets.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
About Fuzz
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The most interesting thing about this formula, the "fuzz" mode, was not
originally intended. I was just experimenting with a new formula when I noticed
that on certain combinations of parameters, the image was unexpectedly fuzzy. I
was mildly interested, and then put the formula away and almost forgot about it.
Then I saw a message from Michael Sussna on the UF Mailing List. He was having
trouble with a certain image and coloring method -- the left half of the image
was unaccountably fuzzy. I remembered this formula and started looking at it
more closely, hoping to find clues. I still don't know if the two situations are
related, but the formula is interesting anyway.
The original formula idea, in a nutshell: This is a variation of the standard
Mandelbrot/Julia formula. For each pixel, set a target value using the Target-
Function. Also, create *two* versions of c, using C1-Function and C2-Function.
On each iteration, check to see if z is closer (or equally close) to the target
(use c1) or to the origin (use c2). Depending on the functions you choose, you
can get some interesting fractals to explore. Certain combinations of functions,
though, produce the fuzzy images.
I found a couple of ways to make the fuzz go away:
1) Increase the Additional Precision setting (12 works for me), OR...
2) Make a small change to the way the formula is written; this difference is the
basis of "Fuzzy" vs. "Smooth" mode.
In Fuzzy mode, the distance-squared between z and the target is calculated and
put into the variable DistTarget. Then DistTarget is compared to |z|. In Smooth
mode, the variable is not used; the calculation expression is compared directly
to |z|.
To get fuzzy images, it is not enough just to set the Fuzz Mode parameter to
"Fuzzy". Target-Function must also be set to zero(), and C1-Function must be
*different* from C2-Function.
Now, using zero() for the Target-Function should set the target to (0,0), i.e.,
the origin. So, as the formula was written, the c2 value should never be used in
that situation. You can confirm this in Smooth Mode; if Target-Function is zero
then changing C2-Function makes no difference at all to the image.
So the question was why, in Fuzzy Mode, changing C2-Function *does* make a
difference, and such a *strange* difference.
I puzzled over it until Kerry Mitchell gave this explanation: In comparing
DistTarget to |z|, we are comparing numbers that are sometimes different by just
a *tiny* amount. As Kerry put it, "the difference ... was down around 1E-16,
which is right at the ragged edge of the precision. When you're that close, you
can't expect things to always work the way they should, which is why we have
extended precision available." Whether or not the difference is measurable is
determined by the last bit of the constantly changing value of z. For each
iteration we are, in essence, *randomly* choosing between the two different
versions of c. This randomness produces the visual fuzz. (I hope I'm not
distorting your meaning too badly, Kerry...)
Why does "Smooth" mode work? My guess is that when the calculation expression is
evaluated, the result is stored internally with higher precision than the
DistTarget variable can provide at normal precision settings.
I'm including the formula here by request. I make no claims for its aesthetic
value, but it *is* rather interesting, I think, and you might be able to create
images you like in either "Fuzzy" or "Smooth" mode. I've also added the ability
to switch to fuzzy (or just weird) Julias, just for good measure.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
About MSet In The Sky With Diamonds
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This formula is the result of my fooling around with an idea for a different
kind of bail-out test. (Not all *that* different, as it turns out; I soon
realized this is a cousin to the old "Epsilon Cross" form.) My idea was to
bail out if the 'x' coordinate of z is equal to the 'y'. With high precision
numbers, this isn't going to happen a lot, probably, so I added a factor to
boost the size of both numbers, then drop their signs and round them to
integers. I guess it's kind of like using an X-shaped trap, where the factor
varies the width of the legs. If z enters the trap, bail out. Yeah, like I know
what I'm talking about... :-)
The result is to produce a Mandelbrot or Julia where the normal inside area
is crisscrossed with curving strands built out of little squares. They
looked like strings of diamonds to me (hey, it was *late*...), hence the
name for the formula.
I found it can also produce interesting results if applied to calculation
done during iteration. Usually *more* interesting, I think, because the little
chips of "outside" often have details of their own.
Another variation was to see if x is evenly divisible by y; kind of a
superset of the 'equals' test. In addition to the strands of squares, this
can also produce solid stalks and odd patterns that look a bit like
railroad tracks or zippers and confetti.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
About Popcorn Julia Complex
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
I originally wrote a PopCorn Julia formula for FractInt as an exercise, trying
to recreate one of its built-in formulas. When I released an early version, I
learned that Jon Horner was also working on his own slightly different Popcorn
Julia formula. We combined the two, replacing hard-coded functions with user
functions, and named the result PopCornJulCplx. I ported it to UltraFractal
because I had so much fun with it in the past. It still surprises me how many
combinations of functions produce interesting results.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
About Quad
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This formula came about when Luc Benard asked for help implementing an algorithm
for a formula from Tierazon. The C source code uses the name Formula_90 and
gives the comment "Inkblot 9", but Luc says the author, Stephen Fergusson, calls
the formula "Quad" so that's what I'll call it.
I recreated the algorithm as well as I could understand it, and then tarted it
up a bit by parameterizing constants and adding gratuitous user-functions.
After releasing the initial version of this formula, I located a copy of
Tierazon and found that formula 90 looked a little different there, because its
bailout test was different than how I had coded it. So, for the second release
I added a parameter to allow you to use either the original (|Z - LastZ|)
or the modified bailout test (|Z|). I also added a Switch; the Julias are not
always interesting, especially with the original bailout test, but enough Julias
are interesting to keep the switch in the formula.
I originally had to guess at good defaults for the bailout and min. distance
parameters -- changing them gives very different results, so experiment!
For the bailout test |Z - LastZ|, 15 works well. For |Z|, try 4 to 6.
When the default parameters are used, you can use various Inside coloring
methods to find extra details.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
About UF-OK-nn
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The formulas UF-OK-01 through UF-OK-45 are updates to a set of formulas I
originally wrote for FractInt. They were first publicly released between
June 1993 and April 1994, and were simply named OK-01, OK-02, etc. While porting
them to UF format I made some changes. The most significant difference is that
each formula now supports both Julia and Mandelbrot modes -- this opens up
*lots* of interesting new possibilities. In some instances I also added new
parameters or user-functions. As far as I can determine, you should be able to
recreate the results of any of the old FractInt versions of the formulas,
although you might need to tweak numerical parameters a bit.
OK-01 through OK-24 were my earliest attempts, displaying my "monkey pounding
on a keyboard" technique.
OK-25 through OK-35 were my first experiments at using a crude form of if/else
logic. The If/Else construct was not supported by the FractInt parser at this
time, so the technique -- invented, as far as I know, by Jon Osuch -- was a bit
obscure and the formulas not very readable. The UF versions are much more
straightforward.
OK-36 through OK-45 were mostly experiments with an approach I called
"dissection". The idea is to calculate real and imaginary coordinates using
plain-old algebra, as if complex math was not supported. The payoff is that
you can apply parameters in ways that would be difficult (or maybe even
impossible) using the built-in complex arithmetic. See "Chop Shop" for more
examples of dissection.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
About UF-Chico, UF-Groucho, UF-Harpo, UF-LarryCurly, UF-Moe, and UF-Zeppo
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
These are some more updates and extensions of some of my old FractInt formulas,
originally released in May 1994, which were mutations (or desecrations) of even
older FractInt formulas. The formulas and their pedigrees:
Chico was based on M-SetInNewton by Jon Horner.
Groucho was based on Fish2 by Dave Oliver via Tim Wegner.
Harpo was based on Gopalsamy3 by Ron Barnett.
Larry was based on Michaelbrot and Element by Michael Theroux.
Curly was based on Natura by Michael Theroux.
Moe was based on Zexpe by Lee Skinner.
Zeppo was based on Liar4 by Chuck Ebbert.
In the UltraFractal versions, I was able to combine Larry and Curly into a
single formula. All formulas were expanded to handle both Mandelbrot and Julia
forms, and some have additional parameters and user-functions.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
About Yam Jam
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Yam Jam is short for "Yet Another Mandelbrot/Julia All Mangled". It provides
many different ways to mutate the classic Mandelbrot and Julia formulas. (Use
"Switch Mode" to move from Mandelbrots to Julias, and back...) I find the Julias
particularly interesting -- they can show the old familiar symmetry and yet look
very weird. Check the examples in blb.upr to see for yourself. In fact, since
there are so many options here, I would suggest looking at the example images
just to get a feel for some possibilities of the formula.
Here's the basic plan for how the formula is *supposed* to work:
1) Take the standard iterated function of z = z^power + c, and modify it so we
are blending two versions of z or c. For lack of a better term, I call these two
versions "Left" and "Right". So, depending on the Loop Style parameter, we will
iterate z = LeftZ^power + RightZ^power + c (that's the Z-Blend style), OR
z = z^power + LeftC + RightC (C-Blend). The Left and Right versions are defined
using the Left Function and Right Function parameters. If the Loop Style is
"Z-Blend", we can also set individual exponents for LeftZ and RightZ.
2) Using some test (described below), come up with a number between 0 and 1, and
use it as a weighting factor for the Left term. Use 1 - Left Weight for the
Right term, so as Left gets bigger, Right gets smaller, and vice-versa. For
tests involving distance measurements, there is an option to "Trim Weights", so
when Left > 1, it is trimmed to 1/Left.
(Side note: For Julias made in C-Blend mode, depending on some of the other
parameters, the Left and Right weighting factors may change in each pixel, or
even for each iteration. So, they are probably not "true" Julias because C is
not necessarily a constant. I hope the Julia Corporation doesn't come after me
for misusing the name. On the other hand, this helps explain why the Juliods
can be so peculiar.)
All of the Tests (except "Fixed") use two points defined by the Test Point,
Test Function, and Reference Point parameters. Some comparison is made between
the two points resulting (we hope) in a number between 0 and 1 to be used as a
weighting factor, as mentioned above.
With the "Fixed" Test Style, the user can specify the Left Weight. It is
constant for the whole image.
The "Angle" test converts the angle between the test and reference points, so
1 is on the negative X axis and 0 is on the positive. The Y axis (positive and
negative) is .5.
"Poles" is a variant of the Angles test. When the test point is directly above
or below the reference point, you get 1. If it is directly right or left, you
get 0. This helps to balance the one-sidedness you can get with the Angle test.
In the "Div" test, the difference between the Test and Ref points is found, made
positive, and (if necessary) flipped so X <= Y. Then the Left Weight is X/Y.
In the "Distance" test, the distance-squared between the test and reference
points is calculated, and then divided by the Distance Limit parameter. This may
result in numbers larger than 1, so the "Trim Weights" option can make an
obvious difference in these fractals.
"Dingle" is the average between the Distance test and the Angle test. (Dingle is
supposed to be a blend of "Distance" and "Angle". Cute, eh? Oh never mind...)
"Dingle Rev" is the same, but with the poles reversed so 1 is on the positive
X axis, not the negative.
"Pistole" is the average of the Distance and Poles tests.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Revision History
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3 March 2003
* Initial Release
6 March 2003
* Tiny tweak to PopCornJulCplx: "pixel" became "#pixel"
* In MSetInTheSkyWithDiamonds, set parameter "ThisMode" to be visible but
disabled, so you know at a glance which mode you're in. (It isn't always
obvious, especially if you didn't create the image yourself...)
13 March 2003
* Added Fuzz formula.
* Reworked FnGlynn to make its identity as a Julia set more explicit.
* Tweaked hint for power parameter in MSetInTheSkyWithDiamonds.
* Tweaked/bloated these notes.
24 March 2003
* Added Yam Jam formula.
29 March 2003
* Added Chop Shop formula.
8 April 2003
* Added 9 new "X Styles" and 9 new "Y Styles" to Chop Shop.
* Added 51 new formulas: UF-OK-01 through UF-OK-45, plus UF-Chico, UF-Groucho,
UF-Harpo, UF-LarryCurly, UF-Moe, and UF-Zeppo.
* More tweaks to these notes.
9 April 2003
* Fixed bug in switch section of UF-Zeppo.
14 April 2003
* Added Quad formula.
15 April 2003
* Updated Quad formula, adding new bailout test and Julia switch.
18 April 2003
* Modified components in the "Switch Mode" sections of most formulas. Now the
parameter "ThisMode" is invisible, as is "NextMode". I added *headings* to
give feedback about the current mode and to remind the user how to switch.
* Added section "Aboout Switch Mode" to this document.