home *** CD-ROM | disk | FTP | other *** search
/ Carousel Volume 2 #1 / carousel.iso / mactosh / code / c_fracta.sit < prev    next >
Encoding:
Text File  |  1988-06-20  |  4.9 KB  |  208 lines

  1. 18-Jun-88 14:29:29-MDT,5181;000000000000
  2. Return-Path: <u-lchoqu%sunset@cs.utah.edu>
  3. Received: from cs.utah.edu by SIMTEL20.ARPA with TCP; Sat, 18 Jun 88 14:29:20 MDT
  4. Received: by cs.utah.edu (5.54/utah-2.0-cs)
  5.     id AA22218; Sat, 18 Jun 88 14:29:21 MDT
  6. Received: by sunset.utah.edu (5.54/utah-2.0-leaf)
  7.     id AA24600; Sat, 18 Jun 88 14:29:19 MDT
  8. Date: Sat, 18 Jun 88 14:29:19 MDT
  9. From: u-lchoqu%sunset@cs.utah.edu (Lee Choquette)
  10. Message-Id: <8806182029.AA24600@sunset.utah.edu>
  11. To: rthum@simtel20.arpa
  12. Subject: FractalStack.c
  13.  
  14. /*
  15.     fractal xcmd v0.3 -- Doug Felt, Oct 14, 1987
  16.     
  17.     This draws a fractal on the screen.  Not to the card, yet.  Function is
  18.     f(z) = z * z + c, julia set mapped to 4 patterns.
  19.     
  20.     Format:
  21.          Fractal seed.h seed.v [res = 8 [limit = 32 [lock = 0]]]
  22.          
  23.     seed is the complex constant c (v imaginary)
  24.     res is the number of pixels on a side for the point to plot 
  25.     limit is the max number of iterations (best between 16 & 128, multiple of 4),
  26.        lower limit means most complex regions of the fractal are white
  27.     if lock is 0, pressing the mouse will immediately stop the drawing, otherwise
  28.       pressing the mouse has no effect and drawing can only be stopped by reboot or
  29.       fancy macsbug work.
  30.    
  31.     Doug Felt, AIR/CAT Project
  32.     duggie@jessica.stanford.edu
  33.  
  34.     
  35.     To compile and link in MPW C:
  36.  
  37.     C -q2 Fractal.c
  38.     link -sn Main=Fractal -sn STDIO=Fractal [line continuation symbol]
  39.          -sn INTENV=Fractal -rt XCMD=104 [line continuation symbol]
  40.          -m FRACTAL Fractal.c.o "{CLibraries}CRunTime.o" [line continuation symbol]
  41.          -o HyperCommands
  42. */
  43.  
  44. #include <Types.h>
  45. #include <Memory.h>
  46. #include <OSUtils.h>
  47. #include <QuickDraw.h>
  48. #include <Events.h>
  49. #include <HyperXCmd.h>
  50. pascal void Debugger() extern 0xA9FF;   
  51.  
  52.  
  53. pascal void Fractal(paramPtr)
  54. XCmdBlockPtr paramPtr;
  55. {
  56. extended ParamToExt();
  57. long ParamToNum();
  58. int nolock,res,hsize,vsize,i,j,iter,limit,rbaseh;
  59. extended rat,seedh,seedv,valh,valv,temp,basev,baseh,hsq,vsq;
  60. extended real2,realn2,real100;
  61. long fake256,fake171,fake2,fake100;
  62. Rect r;
  63. struct _aPattern {
  64.     long long1,long2;
  65.     } pats[4];
  66.  
  67.     if (paramPtr->paramCount<2)
  68.         return;
  69.  
  70.     pats[0].long1 = 0;
  71.     pats[0].long2 = 0;
  72.     pats[1].long1 = 0xaa005500;
  73.     pats[1].long2 = 0xaa005500;
  74.     pats[2].long1 = 0x55ffaaff;
  75.     pats[2].long2 = 0x55ffaaff;
  76.     pats[3].long1 = 0xffffffff;
  77.     pats[3].long2 = 0xffffffff;
  78.     
  79.     res = 8;
  80.     limit = 32;
  81.     nolock = 1;
  82.     
  83.     seedh = ParamToExt(paramPtr,0);
  84.     seedv = ParamToExt(paramPtr,1);
  85.     if (paramPtr->paramCount>2) {
  86.         res = ParamToNum(paramPtr,2);
  87.         if (res <= 0)
  88.             res = 1;
  89.     }
  90.     
  91.     if (paramPtr->paramCount>3) {
  92.         limit = ParamToNum(paramPtr,3);
  93.         if (limit<4) 
  94.             limit = 4;
  95.     }
  96.     
  97.     if (paramPtr->paramCount>4) {
  98.         nolock = !ParamToNum(paramPtr,4);
  99.     };
  100.     
  101.         
  102.     /* map screen onto -2 to 2 range */
  103.     
  104.     /* 0,0 is at 512/2, 342/2 = 256,171 */
  105.     
  106.     /* gridding to res requires that I find out how many boxes wide and tall
  107.        the image is, and map each box onto a value in r2.  then i iterate over
  108.        all the boxes calling the function until the x or y exceeds some limit.
  109.        then i map the number of iterations into a 'color' */
  110.        
  111.     /* since we don't have a global data area for extended constants to live in,
  112.        use longs and fake the compiler into making the correct SANE calls to 
  113.        build the extended values.  Is there a better way (besides using Pascal!) */
  114.     
  115.     fake256 = 256;
  116.     fake171 = 171;
  117.     fake2 = 2;
  118.     fake100 = 100;
  119.     
  120.     hsize = (fake256/res)+1;            /* integer math truncates */
  121.     vsize = (fake171/res)+1;
  122.     real100 = fake100;                    /* fools the not-too-bright compiler. */
  123.     real2 = fake2;
  124.     realn2 = -fake2;
  125.     rat = real2/hsize;                    /* reals intermediate result because of real2 */
  126.     
  127.     rbaseh = 256-hsize*res;
  128.     r.top = 171-vsize*res;
  129.     r.bottom = r.top + res;
  130.     basev = realn2*fake171/fake256;        /* center it */
  131.     
  132.     for (i=-vsize; i<vsize; ++i) {
  133.         r.left = rbaseh;
  134.         r.right = r.left + res;
  135.         baseh = realn2;
  136.         for (j=-hsize; j<hsize; ++j) {
  137.             valh = baseh;
  138.             valv = basev;
  139.             iter = 0;
  140.             do {
  141.                 hsq = valh * valh;
  142.                 vsq = valv * valv;
  143.                 temp = hsq - vsq + seedh;
  144.                 valv = real2*valh*valv + seedv;
  145.                 valh = temp;
  146.                 ++iter;
  147.             } while ((hsq+vsq<real100) && (iter<limit));
  148.  
  149.             PenPat(&pats[iter & 0x03]);
  150.             PaintRect(&r);
  151.  
  152.             r.left += res;
  153.             r.right += res;
  154.             baseh += rat;
  155.             if (nolock && Button())
  156.                     return;
  157.         }
  158.         r.top += res;
  159.         r.bottom += res;
  160.         basev += rat;
  161.     }
  162. }
  163.  
  164.  
  165. long ZeroToNum(paramPtr,zeroStr)
  166. XCmdBlockPtr paramPtr;
  167. char *zeroStr;
  168. {
  169. Str255 str;
  170.  
  171.     ZeroToPas(paramPtr,zeroStr,&str);
  172.     return StrToNum(paramPtr,&str);
  173. }
  174.  
  175. long ParamToNum(paramPtr,index)
  176. XCmdBlockPtr paramPtr;
  177. int index;
  178. {
  179. long ZeroToNum();
  180.  
  181.     return ZeroToNum(paramPtr,*(paramPtr->params[index]));
  182. }
  183.  
  184. extended ZeroToExt(paramPtr,zeroStr)
  185. XCmdBlockPtr paramPtr;
  186. char *zeroStr;
  187. {
  188. Str255 str;
  189. extended res;
  190.  
  191.     ZeroToPas(paramPtr,zeroStr,&str);
  192.     StrToExt(paramPtr,&str,&res);
  193.     return res;
  194. }
  195.  
  196. extended ParamToExt(paramPtr,index)
  197. XCmdBlockPtr paramPtr;
  198. int index;
  199. {
  200. extended ZeroToExt();
  201.  
  202.     return ZeroToExt(paramPtr,*(paramPtr->params[index]));
  203. }
  204.  
  205.  
  206. #include <XCmdGlue.inc.c>
  207.  
  208.