Perceptron ( Rapid Fractal Rendering with Conformal Mapping and Video Feedback )
The fractals shown in previous posts were all rendered in real time using an interactive program “Perceptron”, which is still very much under development. I will attempt to explain the Perceptron rendering algorithm here, so that other people may implement similar programs and expand upon this idea.
At some basic level, the Perceptron algorithm is similar to pointing a video camera back at a screen displaying the camera feed. Examples of fractals rendered using analog video feedback can be found here. Examples of iterated conformal maps can be found here. Perceptron renders fractals by taking an image, applying to that image some simple 2D visual effects and a mathematical transformation, and then feeding the result back into the program as the original image. When this process is repeated with the right mathematical transformations, fractal patterns emerge. The mathematical transformations used are similar to, and perhaps simpler than, those used to render iterated function system “flame” fractals like Electric Sheep.
( To clarify notation, the mathematical transformations applied to the image warp and distort the image in some fashion will be referred to as maps )
Perceptron renders fractals as a continuous animation, so the image on screen is constantly being updated. The algorithm uses the previous frame of the animation to render subsequent frames. The algorithm is not intrinsically faster than traditional iterated function system rendering methods ( as you might use to render the Mandelbrot set or a frame of an Electric Sheep animation ). Perceptron will take just as many iterations to converge upon a rendering of a Julia set as any other algorithm, but the image on screen is updated on each iteration rather than after all iterations have complete, and the animation is continuous.
For rendering, it is convenient to represent an image as a scalar function over the complex plain. Pixel locations (x,y) are represented as a single complex number x + iy = z, and the color or image value at a certain pixel z is denoted as I(z). Image coordinates are transformed so that the center of the image corresponds to the origin in the complex plane, and scaled so that the image spans some units in the complex plane ( usually four to six units ). This transformation of coordinates makes it easier to represent maps on the image as functions of complex numbers. For instance, Julia sets may be rendered by applying maps of the form f(z) = z^2 + c.

An Escher print under under a single application of a conformal map. Fractal patterns can emerge when repeatedly applying maps to an image.
To render the next frame I[n+] based on frame I[n] :
—Iterate over the pixels of the I[n+]
——for each z in I[n] retrieve pixel data from previous frame under some map f
———color = I[n](f(z))
——do various effects on color, such as invert, rotate hue, fade out, etc...
—draw over top of rendered frame if desired ( drawing will be projected into the fractal )
repeat indefinitely
When I[n](f(z)) is outside the boundaries of the previous frame, color values may be determined by substituting a default color, reflecting the image, extending the edges of the image, or some other procedure of your choice. It is also possible to overlay video feed, images, and other rendered graphics into the feedback loop. The "various effects" step is essential, and is where most of the fine tuning occurs ( that and designing maps ). A map projection of a dark image is still just an empty image.

This particular image was rendered by inverting the colors on each iteration, then drawing a black border around the image before feeding the rendered frame back into the loop. The border is the only source of structure in the image, and has been mapped after many iterations into the tree and spiral structures. I can not remember what mapping was used, possibly something of the form a*(e^z+e^(iz))+c where a and c are complex constants.
Thats all for now. I can try to write up a more technical explanation with more extensive pseudocode if there is interest.
At some basic level, the Perceptron algorithm is similar to pointing a video camera back at a screen displaying the camera feed. Examples of fractals rendered using analog video feedback can be found here. Examples of iterated conformal maps can be found here. Perceptron renders fractals by taking an image, applying to that image some simple 2D visual effects and a mathematical transformation, and then feeding the result back into the program as the original image. When this process is repeated with the right mathematical transformations, fractal patterns emerge. The mathematical transformations used are similar to, and perhaps simpler than, those used to render iterated function system “flame” fractals like Electric Sheep.
( To clarify notation, the mathematical transformations applied to the image warp and distort the image in some fashion will be referred to as maps )
Perceptron renders fractals as a continuous animation, so the image on screen is constantly being updated. The algorithm uses the previous frame of the animation to render subsequent frames. The algorithm is not intrinsically faster than traditional iterated function system rendering methods ( as you might use to render the Mandelbrot set or a frame of an Electric Sheep animation ). Perceptron will take just as many iterations to converge upon a rendering of a Julia set as any other algorithm, but the image on screen is updated on each iteration rather than after all iterations have complete, and the animation is continuous.
For rendering, it is convenient to represent an image as a scalar function over the complex plain. Pixel locations (x,y) are represented as a single complex number x + iy = z, and the color or image value at a certain pixel z is denoted as I(z). Image coordinates are transformed so that the center of the image corresponds to the origin in the complex plane, and scaled so that the image spans some units in the complex plane ( usually four to six units ). This transformation of coordinates makes it easier to represent maps on the image as functions of complex numbers. For instance, Julia sets may be rendered by applying maps of the form f(z) = z^2 + c.

An Escher print under under a single application of a conformal map. Fractal patterns can emerge when repeatedly applying maps to an image.
To render the next frame I[n+] based on frame I[n] :
—Iterate over the pixels of the I[n+]
——for each z in I[n] retrieve pixel data from previous frame under some map f
———color = I[n](f(z))
——do various effects on color, such as invert, rotate hue, fade out, etc...
—draw over top of rendered frame if desired ( drawing will be projected into the fractal )
repeat indefinitely
When I[n](f(z)) is outside the boundaries of the previous frame, color values may be determined by substituting a default color, reflecting the image, extending the edges of the image, or some other procedure of your choice. It is also possible to overlay video feed, images, and other rendered graphics into the feedback loop. The "various effects" step is essential, and is where most of the fine tuning occurs ( that and designing maps ). A map projection of a dark image is still just an empty image.

This particular image was rendered by inverting the colors on each iteration, then drawing a black border around the image before feeding the rendered frame back into the loop. The border is the only source of structure in the image, and has been mapped after many iterations into the tree and spiral structures. I can not remember what mapping was used, possibly something of the form a*(e^z+e^(iz))+c where a and c are complex constants.
Thats all for now. I can try to write up a more technical explanation with more extensive pseudocode if there is interest.






