home *** CD-ROM | disk | FTP | other *** search
/ The CDPD Public Domain Collection for CDTV 2 / CDPD_II_2352.bin / ab20 / ab20_archive / graphics / mandelbrot / chaos.lzh / Chaos.c < prev    next >
C/C++ Source or Header  |  1989-04-04  |  5KB  |  148 lines

  1. /********************************* Chaos.c *********************************/
  2. /* :ts=8 - for z editor */
  3. /* Inspired by Public Broadcast System's broadcast of NOVA episode "Chaos".*/
  4. /* Encouragement form Gene E. Toye who wrote C128 version in basic 1st.    */
  5. /* Original Window & Screen definitions by PowerWindows 2.0 and modified.  */
  6.  
  7. /* This source code and executable are hereby placed in the public domain  */
  8. /* with all the implications thereof, etc., etc. legal gobbledeegook.      */
  9.  
  10. #include <stdio.h>
  11. #include <graphics/gfxbase.h>
  12. #include <intuition/intuitionbase.h>
  13.  
  14. struct LPoint {
  15.     long     X,
  16.          Y;
  17.     };
  18.  
  19. struct LPoint     Corners[3] = {
  20.     {0L, 0L}, {639L, 0L}, {319L, 389L}
  21.     };
  22.  
  23. struct NewScreen NScreen = {
  24.     0,0,    /* screen XY origin relative to View */
  25.     640,400,    /* screen width and height */
  26.     2,    /* screen depth (number of bitplanes) */
  27.     0,1,    /* detail and block pens */
  28.     HIRES+LACE,    /* display modes for this screen */
  29.     CUSTOMSCREEN,    /* screen type */
  30.     NULL,    /* pointer to default screen font */
  31.     (UBYTE *)"Chaos Reigns!  <click left mouse button to exit, right to pause>",    /* screen title */
  32.     NULL,    /* first in list of custom screen gadgets */
  33.     NULL    /* pointer to custom BitMap structure */
  34.     };
  35. struct NewWindow NWindow = {
  36.     0,10,    /* window XY origin relative to TopLeft of screen */
  37.     640,390,    /* window width and height */
  38.     0,1,    /* detail and block pens */
  39.     MOUSEBUTTONS,    /* IDCMP flags */
  40.     BORDERLESS+ACTIVATE+RMBTRAP+NOCAREREFRESH,    /* other window flags */
  41.     NULL,    /* first gadget in gadget list */
  42.     NULL,    /* custom CHECKMARK imagery */
  43.     NULL,    /* window title */
  44.     NULL,    /* custom screen pointer */
  45.     NULL,    /* custom bitmap */
  46.     640,390,    /* minimum width and height */
  47.     640,390,    /* maximum width and height */
  48.     CUSTOMSCREEN    /* destination screen type */
  49.     };
  50.  
  51. struct GfxBase        *GfxBase;
  52. struct IntuitionBase    *IntuitionBase;
  53. struct Screen        *Screen;
  54. struct Window        *Window;
  55.  
  56. main(argc, argv)
  57. short     argc;
  58. char    *argv[];
  59. {
  60.     /* regs for speed! */
  61.     register struct IntuiMessage*Message;
  62.     register short         NextCorner;
  63.     register long         X,
  64.                  Y;
  65.  
  66.     extern void             DisplayBeep(),
  67.                  Move(),
  68.                  ReplyMsg(),
  69.                  Terminate(),
  70.                  WritePixel();
  71.     extern long             Wait();
  72.     extern double         ran();
  73.     extern struct GfxBase    *GfxBase;
  74.     extern struct IntuitionBase    *IntuitionBase;
  75.     extern struct IntuiMessage    *GetMsg(),
  76.                 *WaitPort();
  77.     extern struct Library    *OpenLibrary();
  78.     extern struct LPoint     Corners[3];
  79.     extern struct NewWindow     NWindow;
  80.     extern struct Screen    *OpenScreen(),
  81.                 *Screen;
  82.     extern struct Window    *OpenWindow(),
  83.                 *Window;
  84.  
  85.     /* open things */
  86.     if ((IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0L)) == NULL) Terminate();
  87.     if ((GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",0L)) == NULL) Terminate();
  88.     if ((Screen = OpenScreen(&NScreen)) == NULL) Terminate();
  89.     NWindow.Screen = Screen;
  90.     if ((Window = OpenWindow(&NWindow)) == NULL) Terminate();
  91.  
  92.     /* set up things */
  93.     SetAPen(Window->RPort, 1L);
  94.     SetBPen(Window->RPort, 0L);
  95.     SetDrMd(Window->RPort, JAM1);
  96.  
  97.     /* set starting point */
  98.     X = (long)(ran()*639.9);
  99.     Y = (long)(ran()*389.9);
  100.  
  101.     /* plot initial points */
  102.     WritePixel(Window->RPort, Corners[0].X, Corners[0].Y);
  103.     WritePixel(Window->RPort, Corners[1].X, Corners[1].Y);
  104.     WritePixel(Window->RPort, Corners[2].X, Corners[2].Y);
  105.  
  106.     /* enter main loop */
  107.     FOREVER {
  108.     if ((Message = GetMsg(Window->UserPort))!=NULL) {
  109.         if ((Message->Class ==  MOUSEBUTTONS) && (Message->Code == SELECTDOWN)) {
  110.         ReplyMsg(Message);
  111.         Terminate();
  112.         }
  113.         else if (Message->Class ==  MOUSEBUTTONS) {
  114.         ReplyMsg(Message);
  115.         Message = WaitPort(Window->UserPort);     /* pause until UP */
  116.         Message = GetMsg(Window->UserPort);
  117.         ReplyMsg(Message);          /* reply to message ASAP */
  118.         }
  119.         else ReplyMsg(Message);
  120.         };
  121.     WritePixel(Window->RPort, X, Y);
  122.     NextCorner = (short)(ran()*2.9);
  123.     X = (Corners[NextCorner].X-X)/2+X;
  124.     Y = (Corners[NextCorner].Y-Y)/2+Y;
  125.     } /* end FOREVER */
  126. } /* end main */
  127.  
  128. void Terminate()
  129. {
  130.     extern void             CloseLibrary(),
  131.                  CloseScreen(),
  132.                  CloseWindow(),
  133.                  exit();
  134.     extern struct GfxBase    *GfxBase;
  135.     extern struct IntuitionBase    *IntuitionBase;
  136.     extern struct Screen    *Screen;
  137.     extern struct Window    *Window;
  138.  
  139.     /* close everything up before ending */
  140.     if (Window) CloseWindow(Window);
  141.     if (Screen) CloseScreen(Screen);
  142.     if (GfxBase) CloseLibrary(GfxBase);
  143.     if (IntuitionBase) CloseLibrary(IntuitionBase);
  144.     exit(0);                       /* completely exit program! */
  145. } /* end Terminate() */
  146.  
  147. /* EOF - Chaos.c */
  148.