|
|
1.1 ! root 1: /** Mstat.c - display Mandelbrot set statistics ! 2: * R. A. Garmoe 87/01/07 ! 3: */ ! 4: ! 5: ! 6: ! 7: /** Mstat displays the statistics of the Mandelbrot set contained ! 8: * in the specified file. The Mandelbrot set is defined by ! 9: * ! 10: * z = z**2 + c ! 11: * ! 12: * where z and c are in the complex plane and z = 0 + 0i for the first ! 13: * iteration. ! 14: */ ! 15: ! 16: /* ! 17: * The .cnt file has the format ! 18: * int number of points along the real axis ! 19: * int number of points along the imaginary axis ! 20: * int maximum iteration point for each point ! 21: * double real coordinate of upper left ! 22: * double imaginary coordinate of upper left ! 23: * double real coordinate of lower right ! 24: * double imaginary coordinate lower rightft ! 25: * double increment between points on real axis ! 26: * double increment between points on imaginary axis ! 27: * long (loop + 1) counters for histogram values ! 28: * ! 29: * The remainder of the file is the run length encoded scan ! 30: * lines encoded as: ! 31: * int number of words in scan line encoded as: ! 32: * +int actual count value for pixel ! 33: * -int int The first value is the run length and ! 34: * second value is the run value ! 35: */ ! 36: ! 37: ! 38: ! 39: ! 40: #include <stdio.h> ! 41: ! 42: #define FALSE 0 ! 43: #define TRUE ~FALSE ! 44: ! 45: #define MAXREAL 2000 /* maximum number of real coordinates */ ! 46: #define MAXLOOP 1000 /* maximum number of iterations */ ! 47: ! 48: struct cmplx { ! 49: double realp; /* real part of number */ ! 50: double imagp; /* imaginary part of number */ ! 51: }; ! 52: char pmand[60] = "mandel.cnt"; ! 53: FILE *fmand; ! 54: ! 55: struct cmplx ul; /* coordinates of upper left corner */ ! 56: struct cmplx lr; /* coordinates of lower right corner */ ! 57: ! 58: int nimag; /* number of imaginary coordinates */ ! 59: int mloop; /* maximum loop count */ ! 60: int nreal; /* number of real coordinates */ ! 61: int verbose = FALSE; /* print verbose statistics */ ! 62: ! 63: double rinc; /* increment in real coordinate */ ! 64: double iinc; /* increment in imaginary coordinate */ ! 65: double aspect; /* aspect ratio */ ! 66: ! 67: long hist[MAXLOOP + 1] = {0}; /* histogram counters */ ! 68: ! 69: main (argc, argv) ! 70: int argc; ! 71: char **argv; ! 72: { ! 73: int lnr; ! 74: int lni; ! 75: int ni; ! 76: int i; ! 77: int j; ! 78: long *hp; ! 79: ! 80: nextarg (argc, argv); ! 81: if ((fmand = fopen (pmand, "rb")) == NULL) { ! 82: printf ("Unable to open count file %s\n", pmand); ! 83: exit (3); ! 84: } ! 85: ! 86: if (fread ((char *)&nreal, sizeof (int), 1, fmand) != 1) { ! 87: printf ("Error reading maximum number of reals %d\n", nreal); ! 88: exit (2); ! 89: } ! 90: lnr = (nreal > 640)? 640: nreal; ! 91: printf ("nreal = %d %d\n", nreal, lnr); ! 92: if (fread ((char *)&nimag, sizeof (int), 1, fmand) != 1) { ! 93: printf ("Error reading maximum number of imaginaries %d\n", nimag); ! 94: exit (2); ! 95: } ! 96: lni = (nimag > 350)? 350: nimag; ! 97: printf ("nimag = %d %d\n", nimag, lni); ! 98: if (fread ((char *)&mloop, sizeof (int), 1, fmand) != 1) { ! 99: printf ("Error reading maximum loop count %d\n", mloop); ! 100: exit (2); ! 101: } ! 102: printf ("mloop = %d\n", mloop); ! 103: if (fread ((char *)&ul, sizeof (ul), 1, fmand) != 1) { ! 104: printf ("Error reading upper left coordinates\n"); ! 105: exit (2); ! 106: } ! 107: printf ("ul = %e+%ei\n", ul.realp, ul.imagp); ! 108: if (fread ((char *)&lr, sizeof (lr), 1, fmand) != 1) { ! 109: printf ("Error reading lower right coordinates\n"); ! 110: exit (2); ! 111: } ! 112: printf ("lr = %e+%ei\n", lr.realp, lr.imagp); ! 113: ! 114: if (fread ((char *)&rinc, sizeof (rinc), 1, fmand) != 1) { ! 115: printf ("Error reading real increment\n"); ! 116: exit (2); ! 117: } ! 118: printf ("rinc = %e\n", rinc); ! 119: if (fread ((char *)&iinc, sizeof (iinc), 1, fmand) != 1) { ! 120: printf ("Error reading imaginary increment\n"); ! 121: exit (2); ! 122: } ! 123: printf ("iinc = %e\n", iinc); ! 124: if (fread ((char *)&aspect, sizeof (aspect), 1, fmand) != 1) { ! 125: printf ("Error reading aspect ratio\n"); ! 126: exit (2); ! 127: } ! 128: printf ("aspect = %e\n", aspect); ! 129: ! 130: if (fread ((char *)hist, sizeof (long), mloop + 1, fmand) != mloop + 1) { ! 131: printf ("Error reading histogram\n"); ! 132: exit (2); ! 133: } ! 134: if (verbose) { ! 135: printf (" "); ! 136: for ( i = 0; i < 10; i++) ! 137: printf ("%7d", i); ! 138: printf ("\n"); ! 139: ni = (mloop + 1) / 10; ! 140: hp = hist; ! 141: for (i = 0; i < ni; i++) { ! 142: printf ("%4d ", i * 10); ! 143: for (j = 0; j < 10; j++) ! 144: printf ("%7ld", *hp++); ! 145: printf ("\n"); ! 146: } ! 147: if ((j = (mloop + 1 - ni * 10)) > 0) { ! 148: printf ("%4d ", ni * 10); ! 149: for (; j > 0; j--) ! 150: printf ("%7ld", *hp++); ! 151: printf ("\n"); ! 152: } ! 153: } ! 154: } ! 155: ! 156: ! 157: ! 158: ! 159: /** nextarg - process arguments ! 160: * ! 161: */ ! 162: ! 163: ! 164: nextarg (argc, argv) ! 165: int argc; ! 166: char **argv; ! 167: { ! 168: ! 169: argv++; ! 170: while ((argc-- > 0) && (**argv == '-')) { ! 171: switch (*(*argv+1)) { ! 172: case 'f': ! 173: argv++; ! 174: /* set file name */ ! 175: strcpy (pmand, *argv); ! 176: strcat (pmand, ".cnt"); ! 177: break; ! 178: ! 179: case 'v': ! 180: argv++; ! 181: verbose = TRUE; ! 182: break; ! 183: ! 184: default: ! 185: printf ("Unknown argument %s\n", *argv); ! 186: exit (1); ! 187: ! 188: } ! 189: } ! 190: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.