Proceed to Safety

Exponential Map  

Robert P. Munafo, 2010 Dec 5.

Coordinates can be transformed between polar and orthogonal in a mathematically natural way by using the complex exponential and logarithm functions.

An exponential coordinate transformaion can be applied to a Mandelbrot or Julia view to give additional insight into its structure.

Here is an ordinary zoom sequence:

Center: -0.128219857864 +0.839741062363 i; size ranges from 2.0 down to 2.0×10-8 in successive powers of 10

And here is the same location in the Mandelbrot set viewed through an exponential map:

There is another example in my Leavitt navigation description.


Some things to note about exponential maps:

Optimization for Zoom Animations

If rendered at suitable resolution, and using bilinear interpolation, an exponential strip image can be used as source data for rendering frames of a Mandelbrot zoom animation. An inverse mapping (using the complex logarithm function) is used to compute the location (in the strip) of needed data for any given location in the normal orthogonal coordinate space.

This is an almost ideal speed improvement: all features will be rendered at exactly the resolution needed for the zoom animation, and no Mandelbrot iterations get computed twice.


I discovered the utility of this coordinate transform in April 2002 while searching for the "Polaftis" image (see Reverse Bifurcation) of Jonathan Leavitt

C Source Code

The above images were created by replacing the "normal" coordinate transform:

Normal grid-scan plotting (showing coordinate computation only) /* Plot a single pixel, row i and column j   NOTE: itmax is the maximum number of Mandelbrot iterations ctr_r and ctr_i are the real and imaginary coordinates of the center of the view we want to plot min_r is the real coordinate of the left edge of the image max_i is the imaginary coordinate of the top of the image px_spacing is the width of the image (in real coordinates) divided by the number of pixels in a row px_radius is half the width of the image (in real coordinates) */ void pixel_53(int i, int j, int itmax) { double cr, ci;   ci = max_i - ((double) i) * px_spacing; cr = min_r + ((double) j) * px_spacing; evaluate_and_plot(cr, ci, itmax, i, j); }

With an exponential mapping:

The equivalent routine for a grid scan with exponential coordiante mapping /* Plot a single pixel, row i and column j. Use as many rows as you need for the image to show the whole Mandelbrot set. */ void pixel_53(int i, int j, int itmax) { double cr, ci, o_r, o_i, angle, radius;   /* compute angle and radius */ angle = ((double) j) * px_spacing / px_radius * 3.14159265359; radius = ((double) i) * px_spacing / px_radius * 3.14159265359;   /* compute offsets */ o_r = cos(angle) * px_radius * exp(radius); o_i = sin(angle) * px_radius * exp(radius);   ci = ctr_i + o_i; cr = ctr_r + o_r; evaluate_and_plot(cr, ci, itmax, i, j); }

revisions: 20101205 First version; 20101206 simplify source code and clarify comments

From the Mandelbrot Set Glossary and Encyclopedia, by Robert Munafo, (c) 1987-2022.     Mu-ency index

Robert Munafo's home pages on AWS   © 1996-2022 Robert P. Munafo.aboutcontact
This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. Details here.

This page was written in the "embarrassingly readable" markup language RHTF, and was last updated on 2010 Dec 14. s.27