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.