/* Apfelmaennchen fuer PLOT */
/* (C) M. Thole 1995       */

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>

void
Move (int x, int y)
{
  printf ("m%c%c%c%c", x & 0xff, x >> 8, y & 0xff, y >> 8);
}

void
Cont (int x, int y)
{
  printf ("n%c%c%c%c", x & 0xff, x >> 8, y & 0xff, y >> 8);
}

void
Point (int x, int y)
{
  printf ("p%c%c%c%c", x & 0xff, x >> 8, y & 0xff, y >> 8);
}


void
Line (int x0, int y0, int x1, int y1)
{
  printf ("l%c%c%c%c%c%c%c%c", x0 & 0xff, x0 >> 8, y0 & 0xff, y0 >> 8,
	  x1 & 0xff, x1 >> 8, y1 & 0xff, y1 >> 8);
}

void
Label (char *text)
{
  printf ("t%s\n", text);
}

void
Arc (int x0, int y0, int x1, int y1, int x2, int y2)
{
  printf ("a%c%c%c%c%c%c%c%c%c%c%c%c", x0 & 0xff, x0 >> 8, y0 & 0xff, y0 >> 8,
	  x1 & 0xff, x1 >> 8, y1 & 0xff, y1 >> 8,
	  x2 & 0xff, x2 >> 8, y2 & 0xff, y2 >> 8);
}

void
Circle (int x, int y, int r)
{
  printf ("c%c%c%c%c%c%c", x & 0xff, x >> 8, y & 0xff, y >> 8,
	  r & 0xff, r >> 8);
}

void
Erase ()
{
  printf ("e");
}

void
Linemod (int lm)
{
  char *linemod = (char *) NULL;

  switch (lm)
    {
    case 1:
      linemod = "dotted";
      break;
    default:
    case 2:
      linemod = "solid";
      break;
    case 3:
      linemod = "longdashed";
      break;
    case 4:
      linemod = "shortdashed";
      break;
    case 5:
      linemod = "dotdashed";
      break;
    }

  printf ("f%s\n", linemod);
}

void
Space (int x0, int y0, int x1, int y1)
{
  printf ("s%c%c%c%c%c%c%c%c", x0 & 0xff, x0 >> 8, y0 & 0xff, y0 >> 8,
	  x1 & 0xff, x1 >> 8, y1 & 0xff, y1 >> 8);
}

int main(int argc, char *argv[])
{
	double		xa, xe, ya, ye, ix, iy, inx, iny;
	double          zr, zi, zrq, ziq;
	int             itmax, it;

	if (argc != 6 ) {
		fprintf(stderr,"\nUsage: xa xe ya ye itmax\n");
		fprintf(stderr,"Example: %s -2.25 0.75 -1.5 1.5 10\n",argv[0]);
		exit(1);
	}
	sscanf(argv[1],"%lf",&xa);		/* -2.25 */
	sscanf(argv[2],"%lf",&xe);		/* 0.75 */
	sscanf(argv[3],"%lf",&ya);		/* -1.5 */
	sscanf(argv[4],"%lf",&ye);		/* 1.5 */
	sscanf(argv[5],"%d",&itmax);		/* 10 */

        Space(0,0,3120,3120);
	Erase();

	/**********************************************************************/

	inx = (xe - xa) / 512.0;
	iny = (ye - ya) / 512.0;
	for (ix = xa; ix <= xe; ix += inx) {
		for (iy = ya; iy <= ye; iy += 2*iny) {
			it = 0;
			zr = 0;
			zi = 0;
			do {
				zrq = zr * zr;
				ziq = zi * zi;
				it++;
				zi = 2 * zr * zi + iy;
				zr = zrq - ziq + ix;
			} while (zrq + ziq < 4 && it < itmax);
			if ((it % 2) == 1)
				Point((ix - xa) / inx, (iy - ya) / iny);
		}
	}

	/**********************************************************************/

        Move(0, 3000);

	exit(0);
}
