File:  [OS/2 SDKs] / os2sdk / demos / apps / mandel / mstat.c
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs
Thu Aug 9 12:25:59 2018 UTC (7 years, 9 months ago) by root
Branches: msft, MAIN
CVS tags: os2sdk-1988, HEAD
Microsoft OS/2 SDK 03-01-1988

/**	Mstat.c - display Mandelbrot set statistics
 *
 *  Created by Microsoft Corp. 1986
 */



/**	Mstat displays the statistics of the Mandelbrot set contained
 *	in the specified file.	The Mandelbrot set is defined by
 *
 *		z = z**2 + c
 *
 *	where z and c are in the complex plane and z = 0 + 0i for the first
 *	iteration.
 */

/*
 *	The .cnt file has the format
 *		int	number of points along the real axis
 *		int	number of points along the imaginary axis
 *		int	maximum iteration point for each point
 *		double	real coordinate of upper left
 *		double	imaginary coordinate of upper left
 *		double	real coordinate of lower right
 *		double	imaginary coordinate lower rightft
 *		double	increment between points on real axis
 *		double	increment between points on imaginary axis
 *		long	(loop + 1) counters for histogram values
 *
 *	The remainder of the file is the run length encoded scan
 *	lines encoded as:
 *		int	number of words in scan line encoded as:
 *			+int	    actual count value for pixel
 *			-int int    The first value is the run length and
 *				    second value is the run value
 */

#include <os2def.h>
#include <stdio.h>

#define MAXREAL 2000		/* maximum number of real coordinates */
#define MAXLOOP 1000		/* maximum number of iterations */

struct cmplx {
	double	 realp; 	/* real part of number */
	double	 imagp; 	/* imaginary part of number */
};
char	pmand[60] = "mandel.cnt";
FILE	*fmand;

struct	cmplx ul;		/* coordinates of upper left corner */
struct	cmplx lr;		/* coordinates of lower right corner */

int	nimag;			/* number of imaginary coordinates */
int	mloop;			/* maximum loop count */
int	nreal;			/* number of real coordinates */
int	verbose = FALSE;	/* print verbose statistics */

double	rinc;			/* increment in real coordinate */
double	iinc;			/* increment in imaginary coordinate */
double	aspect; 		/* aspect ratio */

long	hist[MAXLOOP + 1] = {0}; /* histogram counters */

main (argc, argv)
int	argc;
char	**argv;
{
	int	lnr;
	int	lni;
	int	ni;
	int	i;
	int	j;
	long   *hp;

	nextarg (argc, argv);
	if ((fmand = fopen (pmand, "rb")) == NULL) {
		printf ("Unable to open count file %s\n", pmand);
		exit (3);
	}

	if (fread ((char *)&nreal, sizeof (int), 1, fmand) != 1) {
		printf ("Error reading maximum number of reals %d\n", nreal);
		exit (2);
	}
	lnr = (nreal > 640)? 640: nreal;
	printf ("nreal = %d %d\n", nreal, lnr);
	if (fread ((char *)&nimag, sizeof (int), 1, fmand) != 1) {
		printf ("Error reading maximum number of imaginaries %d\n", nimag);
		exit (2);
	}
	lni = (nimag > 350)? 350: nimag;
	printf ("nimag = %d %d\n", nimag, lni);
	if (fread ((char *)&mloop, sizeof (int), 1, fmand) != 1) {
		printf ("Error reading maximum loop count %d\n", mloop);
		exit (2);
	}
	printf ("mloop = %d\n", mloop);
	if (fread ((char *)&ul, sizeof (ul), 1, fmand) != 1) {
		printf ("Error reading upper left coordinates\n");
		exit (2);
	}
	printf ("ul = %e+%ei\n", ul.realp, ul.imagp);
	if (fread ((char *)&lr, sizeof (lr), 1, fmand) != 1) {
		printf ("Error reading lower right coordinates\n");
		exit (2);
	}
	printf ("lr = %e+%ei\n", lr.realp, lr.imagp);

	if (fread ((char *)&rinc, sizeof (rinc), 1, fmand) != 1) {
		printf ("Error reading real increment\n");
		exit (2);
	}
	printf ("rinc = %e\n", rinc);
	if (fread ((char *)&iinc, sizeof (iinc), 1, fmand) != 1) {
		printf ("Error reading imaginary increment\n");
		exit (2);
	}
	printf ("iinc = %e\n", iinc);
	if (fread ((char *)&aspect, sizeof (aspect), 1, fmand) != 1) {
		printf ("Error reading aspect ratio\n");
		exit (2);
	}
	printf ("aspect = %e\n", aspect);

	if (fread ((char *)hist, sizeof (long), mloop + 1, fmand) != mloop + 1) {
		printf ("Error reading histogram\n");
		exit (2);
	}
	if (verbose) {
		printf ("     ");
		for ( i = 0; i < 10; i++)
			printf ("%7d", i);
		printf ("\n");
		ni = (mloop + 1) / 10;
		hp = hist;
		for (i = 0; i < ni; i++) {
			printf ("%4d ", i * 10);
			for (j = 0; j < 10; j++)
				printf ("%7ld", *hp++);
			printf ("\n");
		}
		if ((j = (mloop + 1 - ni * 10)) > 0) {
			printf ("%4d ", ni * 10);
			for (; j > 0; j--)
				printf ("%7ld", *hp++);
			printf ("\n");
		}
	}
}




/**	nextarg - process arguments
 *
 */


nextarg (argc, argv)
int	argc;
char	**argv;
{

	argv++;
	while ((argc-- > 0) && (**argv == '-')) {
		switch (*(*argv+1)) {
			case 'f':
				argv++;
				/* set file name */
				strcpy (pmand, *argv);
				strcat (pmand, ".cnt");
				break;

			case 'v':
				argv++;
				verbose = TRUE;
				break;

			default:
				printf ("Unknown argument %s\n", *argv);
				exit (1);

		}
	}
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.