\graphicspath{{mandelbrot/}}
\section{The Mandelbrot and Julia Sets}

\subsection{The Mandelbrot Set}
The Mandelbrot set, first visualized by Benoit Mandelbrot in 1977, is probably the most commonly known fractal.  Images of it can be found, among other places, in science exhibits and on children's shows such as 3-2-1 Contact.  The algorithm is simple and yet the visual effect it creates can be stunning.  It exhibits a certain degree of self-likeness, although small differences can be found, preventing the Mandelbrot set from being completely self-similar in a strict sense.

\subsubsection{Definition}
The Mandelbrot set is fairly simple to generate, and is a common choice for programmers interested in learning about fractals.  It involves characterizing the behavior of the following recurrence relation which operates on complex numbers $z_n$:

\begin{equation}
z_{n+1}=z_n^2 + c
\label{eq:mandelbrot}
\end{equation}

In this equation, the initial value $z_0$ is a parameter.  In order to generate the classical Mandelbrot set, we choose $z_0 = 0$.  Given this beginning value, and a value for $c$, one can generate $z_1$.  Then, using this value of $z_1$, one can generate $z_2$, and so on.  Each new calculation is called an iteration.  The behavior of $z_n$ for increasing values of $n$ is examined.  For any given value of $c$, as $n$ approaches infinity, $z_n$ will either approach infinity, or it will not.  In the latter case, it may exhibit a cycle, or it may vary chaotically.  Those values of $c$ for which $z_n$ does not approach infinity are in the Mandelbrot set.

Thus, it should be fairly simple to create a computer image of the Mandelbrot set.  Choose a region of the complex plane, defined by all $a + b\imath$ for which $-1.5 \le a \le 1.5$ and $-1.5 \le b \le 1.5$.  Now, for each pixel in the image, map it to a complex number $c$ in the region, and decide if $c$ is in the Mandelbrot set by examining the convergence of $z_n$.  If it is in the set, mark the pixel black, and if it is outside the set, mark the pixel white.

But there's a problem.  The convergence or divergence of $z_n$ is not obvious.  Fortunately, it can be shown that, as long as $|c| < 2$, if it is ever true that $|z_n| > 2$, then subsequent iterations will always tend toward infinity.  Therefore, we can define a critical magnitude, $m = 2$, and we can stop iterating if $z_n$ ever exceeds $m$.  But we still need a way to tell if $c$ is in the Mandelbrot set, without testing all possible $z_n$.  For this, we will define a threshold called the ``maximum number of iterations'', denoted as $M$.  If $|z_n| \le 2$ for all $n \le M$, that is, if $z_n$ never exceeds the critical magnitude before reaching the maximum number of iterations, then the point is assumed to be in the Mandelbrot set.  This gives a fairly good approximation, assuming a sufficiently high $M$.  In practice, $M$ values of 100-200 yield good results. 

\subsubsection{Mandelbrot Image Generation Algorithm}

Given the above information, it is possible to generate an image of the Mandelbrot set.  We will now present a more rigorous algorithm.  Before generating an image, certain information must be chosen.  How many pixels will be in the image?  What region of the complex plane will be graphed?  These necessary parameters are summed up in Table \ref{tab:mandelbrotParameters}.  The algorithm is as follows:

\begin{table}[tbp]
\begin{center}
\begin{tabular}{|l|l|}
\hline
$M$&maximum number of iterations\\
\hline
$m$&critical magnitude\\
\hline
$x_{\textrm{min}}$&lowest value of real part of $c$\\
\hline
$x_{\textrm{\vphantom{i}max}}$&highest value of real part of $c$\\
\hline
$y_{\textrm{min}}$&lowest value of imaginary part of $c$\\
\hline
$y_{\textrm{\vphantom{i}max}}$&highest value of imaginary part of $c$\\
\hline
$w$&width of image in pixels\\
\hline
$h$&height of image in pixels\\
\hline
$z_0$&initial value of $z$\\
\hline
\end{tabular}
\end{center}
\caption[Mandelbrot Parameters]{Parameters to the Mandelbrot set generation algorithm}
\label{tab:mandelbrotParameters}
\end{table}

\begin{enumerate}
\item Calculate $\Delta{}x$ and $\Delta{}y$.  These are the width and height in the complex plane of each pixel.  They are calculated as follows:

\begin{displaymath}
\Delta{}x = \frac{x_{\textrm{\vphantom{i}max}} - x_{\textrm{min}}}{w}\qquad
\Delta{}y = \frac{y_{\textrm{\vphantom{i}max}} - y_{\textrm{min}}}{h}
\end{displaymath}

Computer pixels are square, so parameters should be chosen such that $\Delta{}x = \Delta{}y$, or the image will appear distorted.

\item Iterate through all pixel positions in the image as $x$ and $y$.
\item For each pixel, calculate c as
\begin{displaymath}
c=\left(x\cdot\Delta{}x + x_{\textrm{min}}\right) + \left(y\cdot\Delta{}y + y_{\textrm{min}}\right)\imath
\end{displaymath}

This is equivalent to dividing up the region of the complex plane into $w$ columns and $h$ rows, corresponding to the pixels of the image.  Each pixel will be represented by the location of its upper left corner.

\item Decide whether $c$ is in the Mandelbrot set.  Calculate $z_n$ for successive values of $n$ using Equation \ref{eq:mandelbrot}, until $|z_n|$ exceeds $m$, or until $n$ exceeds $M$.  If $z_n$ reaches the critical magnitude before $n$ reaches the maximum number of iterations, then $c$ is not in the Mandelbrot set; otherwise, it is in the set.
\item Plot the point $(x,y)$ black if $c$ is in the set, or white if $c$ is not in the set.  Exercise care, because most computer graphics implementations choose to start $y$ at $0$ at the top of the screen, and increase $y$ for lower points on the screen.  It may be necessary to plot the point $(x,h - y)$ instead. 
\end{enumerate}

\begin{figure}[hbtp]
\begin{center}
\includegraphics{mandelbw.png}
\end{center}
\caption{Black and white Mandelbrot set, with M=100}
\label{fig:mandelbrotbw}
\end{figure}

This algorithm can be used to create an image like that in Figure \ref{fig:mandelbrotbw}.  This gives the basic shape of the set, with its characteristic cardioid main body and bulb protuberance on the left.  Closer examination reveals that the border is very complex, and that there are smaller bulbs all along the border of the cardiod.  The self-similarity of the Mandelbrot set will be examined in closer detail below.

For now, it is enough to notice that the edge between the white and black regions is very detailed and irregular.  This is the heart of what makes the set a fractal.  Upon closer magnification, this detail grows and grows, with new detail visible at every magnification level down to infinity.  Using the algorithm above, smaller details can be examined by adjusting $x_{\textrm{min}}, x_{\textrm{\vphantom{i}max}}, y_{\textrm{min}}, \textrm{and} y_{\textrm{\vphantom{i}max}}$.  However, infinite levels of detail cannot be attained with a computer, because the computer cannot calculate arbitrarily many places after the decimal point without implementing arbitrary-precision arithmetic, as discussed later.

\subsubsection{Adding Color}

A slight modification to the algorithm will highlight the detail at the edge of the set, and simultaneously make the image more visually appealing.  Points in the set will still be plotted black, but points outside the set will be plotted in color.  The color will be chosen from a color table (also known as a ``palette'') based on the number of iterations it took to reach the critical magnitude (called the ``escape time'').  In this way, it will be possible to visualize \emph{how quickly} $z_n$ approaches infinity.  

In a computer, the color of a pixel is represented by three values, corresponding to the amount of red, green, and blue light that are mixed together (recall that the primary colors of light are red, green, and blue).  Each color is assigned an integer between 0 and 255, with higher colors representing more of that color present.  In this system, the triple $(0, 0, 0)$ represents black, $(255, 255, 255)$ represents white, and $(255, 0, 0)$ represents bright red.

Using this system, and choosing $M=100$, we can build a table in which bright shades of red indicate a quick divergence to infinity, and dark shades of red indicate slow divergence.  As before, black will indicate that the point is in the set.  The table will be 101 items long, so as to provide a color for every possible escape time.  The table will be denoted with triples $t_i$, which indicate the color to use with escape time $i$.  Therefore, the red table is calculated as

\begin{displaymath}
t_i = (255 - 255\left(\frac{i}{101}\right),\ 0,\ 0)
\end{displaymath}

This divides the 255 possible values of red into 101 equal parts (because $i$ can be 0 to 100), and implies that $t_0 = (255, 0, 0)$, and $t_{100} = (3,0,0)$, which is nearly black.  To see an example of the Mandelbrot set generated with this color table, see Figure \ref{fig:mandelbrotred}.

\begin{figure}[hbtp]
\begin{center}
\includegraphics{mandelred.png}
\end{center}
\caption{The Mandelbrot set, generated with a red palette}
\label{fig:mandelbrotred}
\end{figure}

For a much more colorful image, we generated a table that starts with red, and cycles through the colors of the rainbow several times.  See Table \ref{tab:rainbowColors} for a list of the color values of each major color of this computer-generated ``rainbow''.  For each color, the red, green, and blue values are either 0 or 255.  To create the rainbow effect, first choose an ``increment'' value, a factor of 256, which is used to decide the amount of light separating two colors in the table.  Start the palette with red, and produce colors that are gradually closer to yellow, by adding successive multiples of the increment.  Then decrement the red value to produce green, and continue this process for the rest of Table \ref{tab:rainbowColors}.  

\begin{table}[hbtp]
\begin{center}
\begin{tabular}{|c|c|c|c|}
\hline
color&red&green&blue\\
\hline
\hline
red&255&0&0\\
\hline
yellow&255&255&0\\
\hline
green&0&255&0\\
\hline
cyan&0&255&255\\
\hline
blue&0&0&255\\
\hline
magenta&255&0&255\\
\hline
\end{tabular}
\end{center}
\caption[Rainbow color values]{The colors of a computer-generated rainbow}
\label{tab:rainbowColors}
\end{table}

For the image in figure \ref{fig:mandelbrotColor}, we chose an increment value of 32.  Thus, a full rainbow is only 48 palette entries.  A palette entry is needed for every possible escape time, so we chose to repeat the rainbow enough times to create at least $M$ palette entries.  

\begin{figure}[hbtp]
\begin{center}
\includegraphics{mandelrainbow.png}
\end{center}
\caption{The Mandelbrot set, generated with a rainbow palette}
\label{fig:mandelbrotColor}
\end{figure}

\subsubsection{Other Rendering Methods}

There are many other ways to choose the color of each pixel.  Programs like Fractint (see Appendix B, page \pageref{program:fractint}) have many different formulas to color points outside of the mandelbrot set.  For example, some take into account the value of $c$, or the final value of $z$, orone of many other things, and they end up with dazzling effects.  XaoS will also use a variety of methods to color the points inside the set, which our algorithm rendered as black.  The possibilities are endless, and many people have found very visually appealing coloring techniques.  Since the Mandelbrot set is at the base of it, the images will always be varicolored and intricately detailed.

\subsection{The Julia Set}
\label{sec:julia}

The Julia set is generated using Equation \ref{eq:mandelbrot} just like the Mandelbrot set.  However, the roles of $z_0$ and $c$ are reversed.  The variable $c$ becomes a parameter to the Julia set, kept the same over all points in the complex region.  To test if a complex number $b$ is in the Julia set, we let $z_0=b$ and iterate, using the same acceptance criteria as in the Mandelbrot set.  All other aspects of image generation are the same, so it is very simple to convert a Mandelbrot set generator into a Julia set generator, or to write a program that can do both.  In Appendix A, page \pageref{source:mandelbrot}, you will find a listing of \emph{mandelbrot.cpp}, a C++ program that generates images of the Mandelbrot or Julia set, using the rainbow palette described above.

\begin{figure}[htbp]
\begin{center}
\begin{tabular}{ccc}
\includegraphics{juliaconnected}&\includegraphics{juliacolors}&\includegraphics{juliadust}\\
Black region&Connected color&''Fractal dust''
\end{tabular}
\end{center}
\caption{Examples of the three main types of Julia sets}
\label{fig:juliaTypes}
\end{figure}

The Julia set and Mandelbrot set have some interesting ties.  Julia sets tend to fall under three categories, shown graphically in figure \ref{fig:juliaTypes}.  Depending on the value of $c$, a Julia image has a black central area (meaning a region with points in the set), or it has one connected area of color, or it is broken up into infinitely many areas of color.  It turns out that the type of Julia set for a given $c$ value depends on where the value falls in the Mandelbrot set.  If $c$ is in the black body of the Mandelbrot set, the corresponding Julia set will have a black area.  If $c$ is in the colorful boundary of the Mandelbrot set, the corresponding Julia will be one connected area of color.  Finally, as $c$ moves outside of the colored area, the Julia will break up into ``fractal dust'', and will consist of disconnected parts.  In this way, and other more subtle ways, the Mandelbrot set consists of a ``road map'' of the Julia sets.

\subsection{Self-Similarity of the Mandelbrot and Julia Sets}

The Mandelbrot and Julia set rendering program mentioned above is useful for creating static images of the sets, but it is tedious to use it to zoom in and examine areas in finer detail.  Fortunately, many programs have been written to serve this purpose, such as Fractint.  Using these programs, one can easily look closer at certain details, and, in the case of Fractint, examine down to near-infinite precision (although deeply zoomed images can take days to render).

Look again at the images of the Mandelbrot set above.  The shape of the black area is, in general, a cardioid main body with a bulb on the left.  Now look at the side of the cardioid, and notice that the bulb shape is repeated much smaller all around the edge of the set.  If you zoom in on one of these, you'll find that it's quite a lot like the main bulb.  So much so that it, in fact, has its own protuberances, and they each have their own, all quite similar to the main shape.  But eventually the pattern disintegrates into one or another of the infinitely varying patterns of the set.

Now examine the whole picture again, and notice the ``antenna'' off the left side of the bulb.  A small distance out is a black lump.  Examination in a program such as Fractint reveals that this lump bears a striking resemblance to the entire Mandelbrot set.  In fact, there is another lump off of the left end of its spire, and so on, down to infinite levels.

Many other examples of similar structures at different levels of magnification can be found in the Mandelbrot set, and also in the Julia sets.  However, the self-similarity is never \emph{quite} perfect, it is more of a ``self-likeness''.  Many fractals are completely self-similar, like the Sierpinski Gasket (which will be examined later).  But this is not an absolute requirement.  The Mandelbrot and Julia sets are still fractals, because they exhibit fine detail on every level of magnification.

\subsection{Higher Exponents}

Look once more at Equation \ref{eq:mandelbrot}.  What happens if we modify the equation slightly, as follows?

\begin{displaymath}
z_{n+1}=z_n^3 + c
\end{displaymath}

The basic concept of the sets still applies when the exponent is 3, and when it is higher.  A sample of Mandelbrot and Julia sets at higher exponents is shown in figure \ref{fig:mandelbrotJuliaExponents}.  Notice that the Mandelbrot set of degree 3 ($M_3$) is rotationally symmetric.  $J_2$ already was rotationally symmetric, but $J_3$ now has three degrees of rotational symmetry.  The general rule is that $M_n$ has $n-1$ degrees of rotational symmetry, and $J_n$ has $n$ degrees of rotational symmetry.  $M_n$ is also symmetric about the real axis for any $n$.

\begin{figure}[htbp]
\begin{center}
\begin{tabular}{ccc}
\includegraphics{mandelexp2.png}&\includegraphics{mandelexp3.png}&\includegraphics{mandelexp4.png}\\
\includegraphics{juliaexp2.png}&\includegraphics{juliaexp3.png}&\includegraphics{juliaexp4.png}
\end{tabular}
\end{center}
\caption{These images show successively higher exponents of $z$ in the Mandelbrot and Julia sets.  In the top row are mandelbrot sets, and in the bottom are the corresponding Julia sets.  The exponents range from 2 to 4 from left to right.}
\label{fig:mandelbrotJuliaExponents}
\end{figure}

\subsection{Beauty and Art in the Mandelbrot and Julia Sets}

Exploring the Mandelbrot and Julia sets can be exciting and enjoyable, especially with programs such as XaoS.  XaoS (likely pronounced ``chaos'') is a real-time fractal movie renderer.  This means that you can zoom into an area of the Mandelbrot or Julia sets and watch, in real time, as part of the image gets larger, gradually filling in with more and more detail.  You can watch as a miniature mandelbrot set described above comes into view, and then you can explore a small offshoot of that, and then another offshoot, and discover that the tiniest detail of the original image is actually a whole object in and of itself.  Then you can zoom all the way back out to the main view of $M_2$, and you'll see that your playground from a moment ago is now all but invisible.  For more information about XaoS, see Appendix B, page \pageref{program:xaos}.

The very concept of infinite detail is fascinating to the mind and often leads to very aesthetically pleasing images.  It has analogs to the real world: the tiniest crack in your floor is possibly the home to thousands of little forms of life, and perhaps each one of those is the home to a smaller parasitic life form.  Or consider that our planet, when viewed from outside of the galaxy, is insignificantly small, but if you were to ``zoom in'' on the earth, you'd discover that it has an amazing amount of previously unnoticed detail.  In this way, the Mandelbrot set is a ``world'' of its own, with one important difference: the images obtained from the Mandelbrot set contain infinite levels of detail.  All of this results from the deceptively simple Equation \ref{eq:mandelbrot}.

Explorers of the Mandelbrot and Julia sets seem to come in one of two varieties.  The first group see the set as a playground for artistic creation.  They use the images they find to express their own creativity and artistic ability in new ways.  These explorers are interested in coloring methods and artistic manipulation of fractal images.  The second group is perhaps more mathematically based, in that they seek to map the world of Mandelbrot, and try to explore previously uncharted areas.  These explorers are more interested in the performance of the rendering engine, such as numerical precision and speed of rendering.  The division is very approximate, because many artists use techniques from both camps to create their images.

Examples of fractal art are becoming increasingly easy to find on the Internet.  Using the popular search engine Google, queries such as ``fractal gallery'' produces an estimated 96,600 results, although this number is subject to fluctuation.  Allowing for cross linking and mentions, one can still draw the conclusion that there are hundreds, if not thousands of fractal artists using the Internet as a place to publish their works.  Examining just a small sampling of galleries, one can find amazingly vivid abstract pictures derived from fractals.  Some represent natural objects, such as flowers or butterflies, while others seem to have been designed merely to enhance their own chaotic form.  And much like classical forms of art, these pictures draw your attention, make you explore their edges, and often convey emotion or even analogies to objects in the world.

It is apparent that many people feel that they are using images of the Mandelbrot and Julia sets, and similar equations, as a playground for their artistic expression.  They feel that finding pretty fractal images requires skill, not mere luck.  It is the contention of many fractal artists that, while there is a bit of chance involved in finding their images among the sea of possibilities, the image only begins to become artistic expression through careful manipulation. 
 
It is not uncommon for fractal artists to compare their art form to photography, and photography has become a well accepted form of art.  Photography went through its own period of acceptance, in which critics expressed the opinion that this form of ``art'' could not be art, as it lacked an element of creation.  The analogy is quite close when you consider that fractal artists are exploring the infinite world of the Mandelbrot set, and selecting and carefully developing the parts they feel show beauty.

\subsubsection{Finding interesting fractal images}

Almost every fractal artist and explorer has a different method for finding fractal images.  It seems that one must get a feel for the patterns behind the set and for what will result from modifications such as zooming, coloring, and changing formulas.  There is no definite algorithm for finding interesting Mandelbrot images, such that a computer could be made to produce fractal art.  Because of this, human input is essential and is more than simple random selection.  After exploring the fractal for a while and learning when certain patterns appear, the artist begins to get a feel for where to look to find interesting pictures.  This is not a mathematically describable phenomenon, and it seems to be similar in nature to the kind of aesthetic ``sense'' that other types of artists develop.  By experimenting with the various possible manipulations available to the artist, he begins to learn how to generate the kinds of images he likes.

The most interesting fractal art comes from careful manipulation of the raw images discovered in the Mandelbrot set.  These manipulations include choice of coloring method, blending together multiple images, stretching, skewing, rotation, and even modification of the image with standard graphics editing software.  Mandelbrot art is far from a purely mathematical art form; there are many places where an artist can add his own expression.  This is what separates artistic Mandelbrot creations from mere snapshots of the set.

\subsubsection{Deep zooming}
\label{sec:mandelbrot:deepzooming}

Many Mandelbrot set enthusiasts are in awe of the mathematics involved, where a simple formula leads to a map of an infinitely complex world.  These artists are interested in exploring and classifying the kinds of images they find, along with what paths are taken to get such images.  The self-similarity of the set is apparent to them, as they continue to find the same classes of images in different places in the set. This leads them to explore the technique of deep zooming, in which they attempt to see if some previously undiscovered image is just waiting to be discovered, if only they zoom in far enough.

Casual experimentation with deep-zooming tends to yield very boring results.  This is because a vast majority of the areas of the Mandelbrot set turn out to produce similar or identical images no matter how much they are magnified.  To see an example of this, use a program such as Fractint, and start zooming in on a colorful region until you find a spiraling shape.  If you continue to zoom in on this image, you will find that, while it continues spiraling forever, there is no ``new'' image to be found no matter how far you zoom in.

At this point, it is necessary to revisit the mathematical side of the Mandelbrot set.  Remember that the algorithm described above chooses a sampling of the points in the coordinate system to test for inclusion in the Mandelbrot set.  It is important to realize that the images produced are not, in fact, perfect representations of the set and that, no matter how many pixels are used to represent an image, it is always an approximation.  The reason behind this is that computer pixels, by their nature, have a finite width, whereas points in the coordinate system are infinitesimally small.  Zooming in merely means that you are choosing that your pixels are representative of smaller and smaller portions of the plane, and so their coordinates will differ by smaller and smaller quantities.  Unfortunately, computer representation of real numbers is limited in its precision, and so there comes a point at which the computer simply can't accurately represent the difference between the points corresponding to adjacent pixels on the screen.  This is referred to as ``floating point inaccuracy''.

It is possible to get around this, and Fractint, among other programs, attempts to do so.  While standard computer processors can represent real numbers to about 16 decimal places, Fractint can represent up to 1600 decimal places.  It does this by simulating a single very precise computation through many computations at a level of precision that the computer can handle.  And so this high-precision calculation system comes with a price: the deeper the zoom, the longer the computation takes.  Some images can take thousands of hours to render completely.

This problem is compounded by the fact that deeper zooms require a higher maximum iteration value.  This is because explorations deep into the images of the Mandelbrot set are actually deep examinations of the border between points in the set and out of the set.  As you examine more closely, you bring to the foreground previously unnoticed points that take a longer time to reach the critical magnitude, $m$.  A common symptom of this is that the image has large areas of black, often at the center of a spiral.  These black images are actually collections of points that take longer than $M$ iterations to reach the critical magnitude, and are mistakenly assumed to be in the set.  By raising the maximum iteration count, one will quickly discover that there was more detail waiting to be uncovered.  And of course, a higher maximum iteration count means that even more calculations will be required to render each image.

So deep zooming involves even more patience than other kinds of Mandelbrot exploration.  Often the effort is futile as the explorer discovers that he has fallen into a spiral that will never look different.  To avoid this, practitioners of deep zooming share their opinions and insights as to how to avoid falling into these ``self-similarity traps''.  One technique involves searching for the miniature copies of the Mandelbrot set, affectionately referred to as ``minibrots'', that seem to spring up at any level of zooming.  Experience seems to indicate that, by recognizing the indicators of a minibrot and finding it, one can avoid the deluge of boringly self-similar spirals that can be found all over the Mandelbrot world.  The commonly described technique for finding new and interesting shapes in the set involves zooming in deeper and deeper while hopping from minibrot to ever smaller minibrot.  The more minibrots you pass, the more likely it is that the structures you find will be different from what has been seen before.

\subsubsection{Coloring techniques}

Many fractal artists agree that colors are very important to the overall appeal of a fractal image.  By choosing what coloring method to use, and which colors to use, the artists find that they can bring out details that weren't visible before.  Choosing carefully what colors go next to each other can cause interesting formations to appear.  Choosing carelessly can completely hide an interesting formation in a pattern that looks something like television ``snow''.

Described above is only one example of how to bring color to a fractal image.  Unfortunately, no matter how the palette is arranged, there is a fundamental limit to the number of colors used in the image, and that is the maximum number of iterations.  Other coloring methods exist that can assign different colors to pixels even if they share the same escape time.

Previously, the only information used to make the decision was the escape time.  But one could just as easily color a pixel based on the magnitude of $z$ at the time it reached the critical magnitude, or the angle $z$ makes with the $x$-axis, or other aspects of $z$ such as its real and imaginary parts.  XaoS has many coloring modes available.  Some of them involve different functions of the real and imaginary part of $z$ at the time it escapes, involving division, addition and cosines.  Some modes also involve the magnitude of $z$, and the value of $c$, the point being tested for inclusion in the set.  The possibilities are endless, and they often create pleasing effects.

XaoS, among other programs, also has another interesting coloring mode.  In the algorithm developed above, points in the set are unilaterally black.  However, these points don't all behave exactly the same.  Coloring methods sometimes explore the kind of cycles that points in the set fall into, or simply choose colors based on the value of $z_M$, the value reached at the maximum number of iterations.  

Now, we have run up against another limitation of computers.  The number of colors that can be represented by triples of integers less than 256 is 16,777,216, and the smallest possible difference between colors is undetectable by the human eye.  Unfortunately, earlier computers could not simultaneously represent 16 million colors at once.  Original graphics systems represented just black and white.  VGA systems could display at most 16 colors at a time, and later 256.  In fact, current versions of Fractint still display only 256 unique colors at a time.  Much like the palette of colors generated for escape-time coloring as described above, 256-color systems allowed the programmer to select 256 red-green-blue triples to use on the screen at any one time.  The reason for this was that each pixel required much less memory to define, because it only required a number up to 256 as an index to the palette.

Present technology allows programmers to use all 16 million colors, with no limit to the number of colors used on the screen at one time.  This is referred to as ``true color mode'', because it is possible to represent a photograph on the screen with as many colors as can be detected by the human eye.  However, it should be noted that not all 16 million colors may be used on the screen at once: at most each pixel will represent a unique color.  Most systems have resolutions of 1024x768, or 1600x1200 pixels, which is still under 2 million pixels.

Most fractal artists agree that true color graphics are necessary to fully capture the details of a fractal.  They allow the use of free-form calculations to determine he color values of each pixel, such as the coloring modes described above for XaoS.  True color mode also allows two images to be blended seamlessly together, as if they were painted on glass and stuck together.  True color mode is necessary for very subtle manipulations to the fractal image using standard graphics tools.  

\subsubsection{Layering}

Fractint was originally written as a mathematical toy, to aid in the discovery of new fractals and the exploration of existing fractals.  Ultra Fractal is a program that was designed with input from artists, with the purpose of artistic creation rather than mathematical exploration.  Ultra Fractal includes many of the features of Fractint, such as deep zooming and user-defined formulas, but it also includes special features of interest to artists.  

The most interesting feature is the creation of layered images.  Before Ultra Fractal, some artists were beginning to discover that, by layering or combining two different fractal images together, new kinds of images could be created.  This involved rendering separate images in a program like Fractint, and combining them in a separate graphics program such as Photoshop.  With Ultra Fractal, these operations are available in the same program, and this allows the artist much more freedom to do what he wants with the fractal.  Ultra Fractal's features are describe in more detail in Appendix B, page \pageref{program:ultrafractal}.

Janet Parke is a fractal artist who primarily uses Ultra Fractal to produce her art.  On her web site, she describes her method for creating fractal art.  She starts with a palette of shades of grey, so that she can see the objects in the Mandelbrot set, and not get caught up by the colors.  When she finds an object that she decides she likes, she tries many different coloring methods, to see which accentuates the image best.  She saves many images in this process, until she decides she has explored enough.  Then she uses various layering techniques to combine these images with other fractal images, which can bring out details she likes in certain areas of the image.  She says that, at this point, some kind of design or style emerges in her mind, and she manipulates Ultra Fractal's layering techniques to express this idea.

This is another place where artistic talent and expression are exercised by fractal artists.  Much like the techniques used in finding a fractal image, the artist uses the tools available to her, such as composites, gradients, and transparency, to coerce the fractal image into her idea of beauty.  These tools are like the brush and canvas of a painter.  The artist learns to use her tools, and learns the effects that they produce.  Eventually, she learns to express herself artistically, no matter what the medium is. 

