You can move, scale, rotate and shear the fractal by very intuitive gestures. Every pixel below a finger on the screen is dragged together with the finger by transforming the image. With one finger, the image is simply moved. With two fingers, the image is scaled and rotated (keeping the current aspect ratio) and with three fingers the image is sheared, which is very useful to look at Burning-Ship-alike fractals.
All fractals are stored during one run of the application. Therefore you can return to a previously generated fractal via the back button.
Here you can save the current bitmap as PNG. After selecting this menu point you see a dialog in which you can enter a filename.
The file itself will be saved in the default pictures folder in a directory called FractView. An entry is added to the gallery.
If there is already a file with the same name, a suffix “(n)” is added to the filename, with “n” being the smallest possible integer.
A warning is shown if you try to save an image while its calculation is still running.
Here you can edit the affine transformation.
The right column contains the center of the image. The
other four values are the rotation/scale/shear-matrix.
The first column here is the vector pointing in x-direction, while the second is the vector pointing in y-direction.
Pushing this button keeps the current center of the image but changes the other parameters so that the aspect ratio is set to 1:1 and the rotation is aligned along the axes.
Sets the scale to 4, and centers the image at (0,0).
Here you can enter a formula to generate the orbits of the fractal. The current coordinate is “c”. The last value of the orbit z(n) can be accessed as “z”, the n-ith value as “zi”, i being the corresponding index.
The amount of required initial z-values is automatically adjusted when confirming the input of z(n+1).
Unknown words are interpreted as parameters and also automatically added.
Parameters always must evaluate to a number (“sqrt 5” is accepted as input for a parameter while “2q” is not).
The syntax is intuitive and straightforward. For instance,
In case of syntax errors you will either get a warning or an error message.
For a list of supported functions see below.
Bailout and Lake
Here you can pick bounds for which the current orbit is considered to be divergent (|zn| > Bailout) or convergent (|zn-1 - zn| < Epsilon). In Bailout-Settings, you can pick the colorization method for divergent orbits, while in Lake-Settings you can pick the setting for all other orbits.
See below for a description of all colorization methods.
Furthermore you can pick a transfer function after the method returns a value. If the value changes much when modifying small parameters (like the length when scaling), you might consider using Log as transfer.
You can furthermore enter a range that should be used for scaling the result of the tranfer function.
If you uncheck “Custom Range” the maximum and minimum of the image is used (it might change depending on resolution).
Bailout and Lake Palette
Here you can pick a color palette. Color palettes are implemented via L*a*b color space and use cubic spline interpolation.
The color picker itself uses the HSV-color model. You can select (made visible by showing its hex-representation) and modify a color by tapping on it and adjusting the levels above. “<<” moves the selected color to the left, “>>” to the right. With “+” a new color is inserted and selected, while “-” removes the current color.
The colors are always distributed along the range of 0 and 1. In order to use a different distribution, use Custom Range in the Transfer-menu.
Set the image size. The first text field holds the width, the second the height.
Set the maximum number of iterations. For deeper zooms you might be interested in picking a higher number of iterations. A lower number will increase speed but give lower details.
This section should give you an overview of my personal goals. Of course, good ideas are always welcome. These points are in roughly the order in which I would like to work on them
Things I would not implement:
Formulas are case-insensitive, i.e., “sin z” is equivalent to “SIN Z” or “siN Z”.
A complex number can be entered in multiple ways (e.g., 1+2i is perfectly fine), but the easiest way is real part, comma, imaginary part. The number “1 + 2i” can be entered as “1,2”. If one of these components is negative, add a “-”. “-1,2” is “-1 + 2i”, and “1,-2” is “1 - 2i”. Make sure to not accidentially add a space between the “-” and the number as it changes its meaning: “- 1,2” interprets the “-” as sign for the whole number: “-(1+2i)”. “1,- 2” issues a warning “Missing imaginary part” and returns “1 - 2”.
In order to apply an unary function, you can but need not wrap the argument in parentheses. “tan sqr z” is perfectly fine and means “tan(z2)”.
Functions with multiple arities use a syntax that is a bit LISP-alike: f(a,b,c) is denoted as f a ; b ; c, where a must not be some binary function (binary binds less).
The following list shows all implemented special parameters, binary and derivable, unary and derivable, unary and not derivable functions, and all macros (functions that are expanded to full expressions).
Real part of z
Imaginary part of z
Previous values of z
Coordinates of current pixel
Real part of c
Imaginary part of c
a1 + a2
add a1; a2
a1 - a2
sub a1; a2
a - b - c = (a - b) - c
a - b + c = (a - b) + c
a1 * a2
mul a1; a2
a1 / 2a2 = a1 / (2a2)
a1 / 2*a2 = a1 * a2 / 2
sin a cos a = sin(a * cos(a))
sin a*cos a = (sin a) * (cos a)
a1 / a2
div a1; a2
a / b / c = (a / b) / c
a / b * c = (a / b) * c
a1 ^ a2
pow a1; a2
a ^ b ^ c = a ^ (b ^ c)
-1,2 = (-1 + 2i)
- 1,2 = -(1 + 2i)
a1 -- a2 = a1 - (-a2)
sin - a = sin (-a)
a1 -a2 = subtraction
--a is a syntax error
Sum Reciprocal: a + a-1
Difference Reciprocal: a - a-1
Area hyperbolic tangent
re a - i im a
atan2(im a, re a)
Floor: Next lower complex integer
floor re a + i floor im a
Component-wise absolute value
|re a| + i |im a|
abs a + i arg a
π = 3.141529...
i2 = -1
e = 2.7182818...
Derivative by z
a b’ = (a*b)’
a ^ b’ = a ^ (b’)
z - a / a’
Nova (generalized Newton method)
z - R * a / a’ + p
(...((z + a1) z + a2) z ... + an
(z-a1) (z-a2) ... (z-an)
a2 + c
* These colorization methods usually do not give interesting results for coloring convergent orbits.
+ These colorization methods usually do not give interesting results for coloring escaping orbits.