quat_mand_gtk
A quaternian based julia set generator with a gtk interface.
The name is based on the fact that it used to generate a mandelbrot
set but now generates julia sets (much more exploration value) but
the name has stuck.
quat_mand_gtk builds fairly simply on a linux system with gtk 2.0
(both headers and libraries, the dev package in ubuntu or other
distros) and g++ installed. For saving images you need
imagemagick's "convert" program installed and in your path.
just type "make" and it should work.
To run, just type "./quat_mand_gtk".
You should then be confronted with a graphic drawing on the left
(in the form of parallel viewing stereo card) and a bunch of buttons
and entry boxes on the right.
The entry boxes represent all of the parameters for this image. To
adjust a parameter either select it in the entry box and type a new
entry (hitting enter when finished, still need to work out all of
the quirks) or use the four buttons beneath it. The four buttons
will be labeled something like: "+ 1e-2", "- 1e-2", "+" and "-".
The button marked "+ 1e-2" will increment the parameter by 0.01.
The "- 1e-2" button will decrement the parameter by 0.01. The
"+" button will increase the exponent that the first two buttons will
increment or decrement by. So hitting the "+" butt will change the
"+ 1e-2" and the "- 1e-2" buttons to "+ 1e-1" and "- 1e-1" so they
increment and decrement by 0.1. The "-" button similarly decreases
the exponent on the first two buttons by one.
The parameters themselves:
The first four parameters are the quaternian components of "c", the
"location" (on the Mandelbrot set) of the Julia set we're going
to draw.
iteration threshold is the number of iterations of a = a^2 + c that
must remain bounded for the location a to be considered within this
Julia set. c is the parameter above, a is the quaternian initialized
with the location on the display being queried (the fourth dimention
is silently set to 0 and not explored).
cube partion size: The implicit surface polygonizer partitions space
into a bunch of cubes and builds triangles out of the intersection of
the solution surface and lines within these cubes. The cube partition
size is roughly speaking the resolution of the polygonizer. This is
what determines the number of polygons a surface will be broken into.
The above parameters define the polygon that is created. The rest of
the parameters describe how it is displayed.
viewer coordinates (x,y,z): The point in space of the observer
subject coordinates (x,y,z): The point in space that is the focus
up vector (x,y,z): the direction perpendicular to the line between
the viewer and the subject that defines up.
stereo eye separation: The distance to the right or left of the
coordinates that the stereo views are generated from.
focal length: Relative focal length of the "lens" used by the viewer.
Below the display there are three buttons:
Quit: quits the application
Save Triangles: toggle switch. When depressed, the triangles used to
create the image so that if just display parameters are changed there
are fewer calculations required to redraw the image. The problem with
this is that each triangle takes 72 bytes of RAM and a good hi res
image can require 100s of millions of triangles (or more).
Save Hires: toggle switch to generate a high resolution (7200 x 4800)
version of the image in memory and save it to disk when the render
completes. If you leave this on, it will litter your current
directory with hi res pngs and corresponding text files with the
parameters used to generate the image. Uses a call to imagemagick's
convert utility to generate the png from an uncompressed rgb file.
Also below the display are a list of statistics that can be used for
general info, debugging and rough memory usage.
The statistics are:
tc: triangle count, how many triangles were used to make (each side of)
this image. If the "Save Triangles" toggle is set, each triangle
consumes 72 bytes of ram + ~2 bytes overhead
cp: cubes processed, how many partition cubes were looked at by the
polygonizer. Each cube consumes 8 bytes ram + ~3 bytes overhead
and wastage
cq: cubes queued, how many cubes are queued up to be processed. These
also consume 8 bytes ram + overhead but it pales in significance
to cubes processed.
the remaining stats relate to internal caches of sizes set at compile
time.
cch: corner cache hits
ccm: corner cache misses
ccs: corner cache size (in entries)
the corner cache is cache of the function value at a give cube corner.
Each corner cache entry consumes 8 bytes.
vch: vertex cache hits
vcm: vertex cache misses
vcs: vertex cache size (in entries)
the vertex cache is the point at which the solution to the function
passes between two nearby corners. Each vertex cache entry consumes
40 bytes.