Many thanks

int BlockSize = 1; // resolution // set of colours to color the set. Color[] ColourSet = { Color.White, Color.Yellow, Color.Orange, Color.Red, Color.Black, Color.Green, Color.Gray, Color.Gold, Color.Fuchsia, Color.DarkViolet, Color.DarkBlue}; float Limit = 0f; //I wasn't sure if the set had to be bounded by 2, could someone answer this also? public Form1() { InitializeComponent(); } private void Form1_Paint(object sender, PaintEventArgs e) { Limit = 2f; float AVal = 0, BVal = 0; // real (A) and imaginary (B)/>/>/> parts of C. for (float xpos = 0; xpos < this.Height; xpos += BlockSize) { // Set real part between -Limit and Limit depending on location. AVal = (((2 * Limit) / (this.Height - 1)) * xpos) - (Limit); for (float ypos = 0; ypos < this.Height; ypos += BlockSize) { // Set imaginary part between -Limit and Limit depending on location. BVal = (((2 * Limit) / (this.Height - 1)) * ypos) - (Limit); // Draw at location using colour defined by iterations taken to escape set e.Graphics.FillRectangle( new SolidBrush(ColourSet[EscapeIterations(AVal, BVal) - 1]), new Rectangle((int)xpos, (int)ypos, BlockSize, BlockSize)); } } } /// <summary> /// Returns iterations taken to escape the set /// </summary> /// <param name="a">real part of C</param> /// <param name="b">imaginary part of C</param> /// <returns></returns> private int EscapeIterations(float a, float B)/>/>/> { int returnVal = 0; float p = 0, q = 0; // real and imaginary starting points of Z do { p = (p * p) - (q * q) + a; // update real part of Z q = (2 * p * q) + b; // update imaginary part of Z if (returnVal == 11) break; // break loop if not brokenm by 11 iterations returnVal++; } while (((p * p) + (q * q)) <= Limit * Limit); // while abs(Z) is less than 2 return returnVal; } }