C+: Mandelbrot Set


Generate and draw the Mandelbrot set.

Note that there are many algorithms to draw Mandelbrot set and there are many functions which generate it.

This generic function assumes that the image can be accessed like a two-dimensional array of colors. It may be passed a true array (in which case the Mandelbrot set will simply be drawn into that array, which then might be saved as image file), or a class which maps the subscript operator to the pixel drawing routine of some graphics library. In the latter case, there must be functions get_first_dimension and get_second_dimension defined for that type, to be found by argument dependent lookup. The code provides those functions for built-in arrays.

#include <cstdlib>
#include <complex>

// get dimensions for arrays
template<typename ElementType, std::size_t dim1, std::size_t dim2>
std::size_t get_first_dimension(ElementType (&a)[dim1][dim2])
	return dim1;

template<typename ElementType, std::size_t dim1, std::size_t dim2>
std::size_t get_second_dimension(ElementType (&a)[dim1][dim2])
	return dim2;

template<typename ColorType, typename ImageType>
void draw_Mandelbrot(ImageType& image,                                   //where to draw the image
ColorType set_color, ColorType non_set_color,       //which colors to use for set/non-set points
double cxmin, double cxmax, double cymin, double cymax,//the rect to draw in the complex plane
unsigned int max_iterations)                          //the maximum number of iterations
	std::size_t const ixsize = get_first_dimension(ImageType);
	std::size_t const iysize = get_first_dimension(ImageType);
	for (std::size_t ix = 0; ix < ixsize; ++ix)
	for (std::size_t iy = 0; iy < iysize; ++iy)
		std::complex<double> c(cxmin + ix/(ixsize-1.0)*(cxmax-cxmin), cymin + iy/(iysize-1.0)*(cymax-cymin));
		std::complex<double> z = 0;
		unsigned int iterations;

		for (iterations = 0; iterations < max_iterations && std::abs(z) < 2.0; ++iterations) 
		z = z*z + c;

		image[ix][iy] = (iterations == max_iterations) ? set_color : non_set_color;



Content is available under GNU Free Documentation License 1.2.