I79 Answer ― 2D Function


Here is the relevant part of the solution:

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

double fun( double x, double y)
{
  return   sin( x*x + y*y )/ (x*x + y*y) ;
}

int main(int argc, char *argv[])
{
  int r, nrows, c, ncols, j;
  int red, grn, blu;
  double x, y, z ;
  FILE *image;

  /* check the command line parameters */
  if ( argc != 8 )
  {
    printf("topoMap fileName.ppm nrows ncols xmin xmax ymin ymax\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] );
  double xmin  = atof( argv[4] );
  double xmax  = atof( argv[5] );
  double ymin  = atof( argv[6] );
  double ymax  = atof( argv[7] );

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

  /* find min and max value of z */
  double minz = fun( xmin, ymin );
  double maxz = fun( xmin, ymin );

  for ( r=0; r<nrows; r++ )
    for ( c=0; c<ncols; c++ )
    {
      x = xmin + (xmax-xmin)*c/ncols;
      y = ymin + (ymax-ymin)*r/nrows;
      z = fun( x, y );
      if ( z < minz ) minz = z;
      if ( z > maxz ) maxz = z;
    }
  
  /* write out the pixel data */
  int height;
  for ( r=0; r<nrows; r++ )
    for ( c=0; c<ncols; c++ )
    {
      /* translate row and column into x and y */
      x = xmin + (xmax-xmin)*c/ncols;
      y = ymin + (ymax-ymin)*(nrows-r)/nrows;
      
      /* get the value of the function */
      z = fun( x, y );
      
      /* translate the value into a level 0..255 */
      height = (int)(255*(z-minz)/(maxz-minz));

      red = height;
      grn = height;
      blu = height;

      /* mark the axes (which might not be in the selected range) */
      if ( fabs(y) <= 1.0/nrows || fabs(x) <= 1.0/ncols  )
      {
        red = 0;
        grn = 0;
        blu = 150;
      }
      fputc( red, image );  fputc( grn, image );  fputc( blu, image );
    }

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

  return 1;
}

Comments: To produce a more visual image of the function, fo more in the translation from the function value into color.