Mandlebrots on the Arduino TouchSlide

These are ACTUAL screen shots of the Liquidware TouchSlide running Mandlebrot cacalulations!


#define		kQmax				340
#define		kStartColor			1
#define		kMaxItterations		255

#define		kMandel_FarLeft		-2.01
#define		kMandel_FarRight	1.0
#define		kMandel_FarTop		-1.2
#define		kMandel_FarBottom	1.2


//*******************************************************************************
void	DoMandleBrot(void)
{
float		XMax, YMax, XMin, YMin;
float		X, Y, Xsquare, Ysquare;
float		QQtemp;
float		QQ[kQmax];
float 		PP, deltaP, deltaQ;
long		color;
short		row, col;
short		maxcol;
short		maxrow;
RGBColor	rgbColor;
short		itteration;
Boolean		keepGoing;
short		deltaColumn;
short		ii;
short		startOffset[10]	=	{0,  16, 8,  4, 2, 1, 3, 0};
short		columnSteps[10]	=	{32, 32, 16, 8, 4, 4, 4, 0};

#ifdef _ENABLE_SCREEN_ROTATION_
byte	oldScreenOrientation;
	
	oldScreenOrientation	=	SetScreenOrientation(kScreenOrientation_Landscape);
#endif

	XMin	=	kMandel_FarLeft;
	XMax	=	kMandel_FarRight;
	YMin	=	kMandel_FarTop;
	YMax	=	kMandel_FarBottom;

	itteration	=	0;
	keepGoing	=	true;
	while (keepGoing)
	{
		switch(itteration)
		{
			case 0:
				XMin	=	kMandel_FarLeft * 3;
				XMax	=	kMandel_FarRight * 3;
				YMin	=	kMandel_FarTop * 3;
				YMax	=	kMandel_FarBottom * 3;
				break;
			
			case 1:
				XMin	=	kMandel_FarLeft * 2;
				XMax	=	kMandel_FarRight * 2;
				YMin	=	kMandel_FarTop * 2;
				YMax	=	kMandel_FarBottom * 2;
				break;
			
			case 2:
				XMin	=	kMandel_FarLeft;
				XMax	=	kMandel_FarRight;
				YMin	=	kMandel_FarTop;
				YMax	=	kMandel_FarBottom;
				break;
			
			case 3:
				XMin	=	(kMandel_FarLeft / 3) - 1.5;
				XMax	=	(kMandel_FarRight / 3) - 1.5;
				YMin	=	kMandel_FarTop / 3;
				YMax	=	kMandel_FarBottom / 3;
				break;
			
			case 4:
				XMin	=	-1.7018;
				XMax	=	-1.7016;
				YMin	=	-0.000075;
				YMax	=	 0.000075;
				break;

			case 5:
				XMin	=	-0.197272275682447305;
				XMax	=	-0.196537412401197305;
				YMin	=	-0.67495234375;
				YMax	=	-0.67436640625;
				
				itteration	=	-1;	//*	this will reset back to the first
				break;

		}
		maxcol	=	GetScreenWidth();
		maxrow	=	GetScreenHeight();
		deltaP	=	(XMax - XMin) / (maxcol);
		deltaQ	=	(YMax - YMin) / (maxrow);
		
		QQ[0]	=	YMin;
		for (row=1; row<=maxrow; row++)
		{
			QQ[row]	=	QQ[row-1] + deltaQ;
		}

		ii	=	0;
		while (columnSteps[ii] > 0)
		{
			deltaColumn	=	columnSteps[ii];
			for (col=startOffset[ii]; col < maxcol; col += deltaColumn)
			{
				PP	=	XMin + (deltaP * col);

				for (row=0; row < maxrow; row++)
				{
					X		=	Y	=	Xsquare	=	Ysquare	=	0.0;
					color	=	kStartColor;
					QQtemp	=	QQ[row];
					while ((color < kMaxItterations)  && ((Xsquare + Ysquare) < 4))
					{
						Xsquare =	X * X;
						Ysquare =	Y * Y;
						Y		*=	X;
						Y		+=	Y + QQtemp;
						X		=	Xsquare - Ysquare + PP;
						color++;
					}
					rgbColor.red	=	(255 - color) & 0xe0;
					rgbColor.green	=	((255 - color) << 3) & 0xe0;;
					rgbColor.blue	=	((255 - color) << 6) & 0xe0;;
					setPixel(col, row, rgbColor);
				}
				if (gettouch())
				{
					keepGoing	=	false;
					break;
				}
			}
			ii++;
			if (gettouch())
			{
				keepGoing	=	false;
				break;
			}
		}
		if (keepGoing)
		{
			delay(500);
		}
		itteration++;	

	}

#ifdef _ENABLE_SCREEN_ROTATION_
	SetScreenOrientation(oldScreenOrientation);
#endif

}