I80 Answer ― Mandelbrot Set


#include <stdlib.h>
#include <stdio.h>
#include <math.h>

const int countLimit = 800;

int MandelSetCount( double startx, double starty, int limit)
{
  int count;
  double x=startx, y=starty;
  double newx, newy, funSq;
  funSq = startx*startx + starty*starty;
  
  for (count=0; count<limit && funSq<4.0; count++ )
  {
    newx = x*x - y*y + startx;
    newy = 2.0*x*y + starty;
    funSq = newx*newx + newy*newy;
    x = newx; y = newy;
  }
  return   count ;
}

int main(int argc, char *argv[])
{
  int r, nrows, c, ncols ;
  int red, grn, blu;
  double x, y ;
  const double xmin = -1.50, xmax  = 1.00;
  const double ymin  = -1.25, ymax  = 1.25;
  FILE *image;

  if ( argc != 4 )
  {
    printf("mandel fileName.ppm nrows ncols\n");
    return 0;
  }

  /* open the image file for writing in binary mode */
  if ( (image = fopen( argv[1], "wb") ) == NULL )
  {
    printf("file %s could not be created\n", argv[1]);
    return 0;
  }

  nrows = atoi( argv[2] );
  ncols = atoi( argv[3] );

  /* write out the PPM Header information */
  fprintf( image, "P6 ");
  fprintf( image, "%d %d %d ", ncols, nrows, 255 );

  /* write out the pixel data */
  for ( r=0; r<nrows; r++ )
    for ( c=0; c<ncols; c++ )
    {
      x = xmin + (xmax-xmin)*c/ncols;
      y = ymin + (ymax-ymin)*(nrows-r)/nrows;

      if ( MandelSetCount( x, y, countLimit )==countLimit )
      {
        red = 0; grn = 0; blu = 0;
      }
      else
      {
        red = 220; grn = 250; blu = 220;
      }

      fputc( red, image );  fputc( grn, image );  fputc( blu, image );
    }

  /* close the file */
  fclose ( image );

  return 1;
}

Comments: Creating a more colorful image is up to you.