/************************************************************************ * Version 1.00 TREE.C - Draw a Recursive Tree 08-May-86 * * Commodore Amiga Only Module TREE.C * ************************************************************************* * Copyright (c) 1986, Robert S. French * * --------------------------------------------------------------------- * * This program has been placed in the public domain. A limited * * license is hereby granted for the unlimited use and distribution of * * this program, provided it is not used for commercial or profit- * * making purposes. Thank you. * ************************************************************************* * Author information: | Disclaimer: * * | * * Name: Robert S. French | The author takes no responsibil- * * USnail: 2740 Frankfort Avenue | ity for damages incurred during * * Louisville, KY 40206 | the use of this program. * * Phone: (502) 897-5096 \-----------------------------------* * ARPA: French#Robert%d@LLL-MFE UUCP: ihnp4!ptsfa!well!french * ************************************************************************* * Please send any comments, suggestions, or bugs to one of the above * * addresses. * ************************************************************************* * Acknowledgements * * ================ * * * * Original version presented for IBM BASIC by William K. Balthrop in * * Home Computer Magazine, Vol. 5, No. 6. * * * * Random number generator from the Encyclopedia of Computer Science * * and Engineering, second edition. * ************************************************************************/ /* Necessary includes */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* Library Pointers */ struct IntuitionBase *IntuitionBase = 0; struct GfxBase *GfxBase = 0; /* Initial Graphics Conditions */ struct NewScreen newscr = { 0, /* Left */ 0, /* Top */ 640, /* Width */ 200, /* Height */ 4, /* Depth */ 0, /* DPen */ 1, /* BPen */ HIRES, /* View Modes */ CUSTOMSCREEN, /* Type */ 0, /* Font */ "Recursive Tree (1.00) by Robert French - Right mouse button to exit", /* Title */ 0, /* Gadgets */ 0 /* Bitmap */ }; struct NewWindow newwin = { 0, /* Left */ 0, /* Top */ 640, /* Width */ 200, /* Height */ -1, /* DPen */ -1, /* BPen */ MOUSEBUTTONS, /* IDCMP */ BACKDROP | BORDERLESS | ACTIVATE | RMBTRAP, /* Flags */ 0, /* Gadgets */ 0, /* Check */ 0, /* Title */ 0, /* Screen */ 0, /* Bitmap */ 0, /* MinWidth */ 0, /* MinHeight */ 0, /* MaxWidth */ 0, /* MaxHeight */ CUSTOMSCREEN /* Screen type */ }; UWORD colors[16] = { 0x000, 0xfff, 0xf00, 0xff0, 0x0d0, 0x0b0, 0x090, 0xa84, 0x973, 0x970, 0x960, 0x860, 0x850, 0x750, 0x740, 0x640 }; struct Screen *scr = 0; struct Window *win = 0; struct RastPort *rp; struct ViewPort *vp; /* Random Number Definitions */ long seeds[17]; int seedp1,seedp2,seedp3; /* Direction Definitions */ struct s_dir { int x; int y; } offset[8] = { { 0, -1 }, { 2, -1 }, { 2, 0 }, { 2, 1 }, { 0, 1 }, { -2, 1 }, { -2, 0 }, { -2, -1 } }, boff[4] = { { -1, 0 }, { -1, -1 }, { 0, -1 }, { 1, -1 } }; main() { int i; if ((IntuitionBase = (struct Intuitionbase *)OpenLibrary("intuition.library",0)) == 0) abort("Can't open intuition.library"); if ((GfxBase = (struct GfxBase *)OpenLibrary("graphics.library")) == 0) abort("Can't open graphics.library"); if ((scr = (struct Screen *)OpenScreen(&newscr)) == 0) abort("Can't open screen"); newwin.Screen = scr; if ((win = (struct Window *)OpenWindow(&newwin)) == 0) abort("Can't open window"); rp = win->RPort; vp = &scr->ViewPort; LoadRGB4(vp,colors,16); SetDrMd(rp,JAM1); init_rand(); for (;;) { SetAPen(rp,0); RectFill(rp,0,10,639,199); draw_ground(); branch(320,120,14,0,1); /* Draw first right branch */ branch(320,120,14,0,-1); /* Draw first left branch */ for (i=0;i<10;i++) { Delay(60); chk_done(); } } abort(""); } abort(s) char *s; { if (win) CloseWindow(win); if (scr) CloseScreen(scr); if (IntuitionBase) CloseLibrary(IntuitionBase); if (GfxBase) CloseLibrary(GfxBase); printf("%s\n",s); exit(0); } branch(xs,ys,len,dir,rl) int xs,ys,len,dir; { int r,xe,ye; chk_done(); if (len > 11) len--; else { r = my_rand(); switch (r) { case 12: len /= 2; break; case 1: len *= 7; len /= 10; break; case 2: case 3: len *= 8; len /= 10; break; case 4: len *= 9; len /= 10; break; default: len--; break; } } dir = (dir+rl) & 7; xe = xs+len*offset[dir].x; ye = ys+len*offset[dir].y; r = my_rand(); switch (r) { case 0: xe--; break; case 1: xe++; break; case 2: ye--; break; case 3: ye++; break; } drawbranch(xs,ys,xe,ye,dir,len); if (len < 1) return; branch(xe,ye,len,dir,1); /* Draw right branch */ branch(xe,ye,len,dir,-1); /* Draw left branch */ } drawbranch(x,y,ex,ey,d,l) int x,y,ex,ey,d,l; { SetAPen(rp,l+2); if (l > 9) { Move(rp,x+boff[d&3].x,y+boff[d&3].y); Draw(rp,ex+boff[d&3].x,ey+boff[d&3].y); } if (l > 6) { Move(rp,x-boff[d&3].x,y-boff[d&3].y); Draw(rp,ex-boff[d&3].x,ey-boff[d&3].y); } Move(rp,x,y); Draw(rp,ex,ey); } init_rand() { long sec,mic,x; int i; CurrentTime(&sec,&mic); x = sec*(mic | 1); for (i=0;i<17;i++) { seeds[i] = x; x = x*3+mic; } seedp1 = 4; seedp2 = 16; seedp3 = 0; } my_rand() { long result; result = seeds[seedp1]+seeds[seedp2]; seeds[seedp3] = result; if (++seedp1 > 16) seedp1 = 0; if (++seedp2 > 16) seedp2 = 0; if (++seedp3 > 16) seedp3 = 0; return (result & 31); } draw_ground() { int i,j,x,y,c; SetAPen(rp,5); RectFill(rp,0,194,639,199); SetAPen(rp,14); x = 28; y = 199; for (c=0;c<13;c++) { for (j=0;j<2;j++) { for (i=0;iUserPort)) { class = message->Class; code = message->Code; ReplyMsg(message); if (class == MOUSEBUTTONS && code == MENUDOWN) abort(""); } }