[comp.sys.amiga] Splurge #3 ... Bouncing Beziers

dillon@CORY.BERKELEY.EDU (Matt Dillon) (05/11/87)

	Oh what the hell..  Here's Bezier again, but this time I've added
an automation option... you can watch the Bezier curve bounce all over its
window by specifying a random seed:

	bezier [seed [delay]]

	example:
		bezier 24

	If you don't want it to run continuously, you can specify a delay
(passed directly to Delay()):

		bezier 24 10

	Otherwise, if you give it no arguments, it allows you to play with the
	bezier curve like in my first posting.

P.S.  running it on automatic 'bezier #', and setting the granularity to
about 40 looks very impressive....  I've found it somewhat appeasing to have
running on my workbench screen.  I also optimized the source quite a bit.

			-Matt

#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
#	bezier.c
#	bezier.uue
# This archive created: Sun May 10 23:18:04 1987
export PATH; PATH=/bin:/usr/bin:$PATH
echo shar: "extracting 'bezier.c'" '(7410 characters)'
if test -f 'bezier.c'
then
	echo shar: "will not over-write existing file 'bezier.c'"
else
cat << \!Funky!Stuff! > 'bezier.c'

/*
 *  BEZIER.C
 *
 *  Matthew Dillon.
 *  Public Domain (no Copyrights whatsoever)
 *
 *  -Assumes AZTEC compilation,  +L (32 bit ints), with all AMIGA symbols
 *  precompiled.  Additionally expects certain typedefs and routines
 *  found in MY.LIB, as well as some MY.LIB #include files.
 *
 *  An experienced programmer can remove the MY.LIB dependancies
 *  (openlibs() call), and figure out what typedefs have been assumed if
 *  he wishes to compile the program.  You can also simply extract the
 *  Bezier functions for your own use.
 *
 *  BEZIER EQUATIONS:
 *
 *	c(t) = T(t)BP
 *
 *	T(t) = (t^3 t^2 t 1)		P= ( P1 )
 *	B = (  -1   3  -3   1	)	   ( P2 )
 *	    (	3  -6	3   0	)	   ( P3 )
 *	    (  -3   3	0   0	)	   ( P4 )
 *	    (	1   0	0   0	)
 *
 *	t:  range 0 to 1
 *	C:  coordinate matrix  1xD matrix (D = dimensions)
 *	B:  Bezier matrix      4x4
 *	P:  Ctrl. Point matrix 4xD matrix (D = dimensions)
 *
 *	using D = 2
 */

#include <typedefs.h>
#include <xmisc.h>

#define     SHIFTS  9
#define     ONE     (1<<SHIFTS)

typedef struct PropInfo XPI;
typedef struct Image	IM;

extern IMESS *GetMsg();

#define MYGADGETS   (WINDOWSIZING|WINDOWDRAG|WINDOWDEPTH|WINDOWCLOSE)

NW Nw = {
    64, 64, 320, 100,
    0, 1,
    NEWSIZE|MOUSEBUTTONS|MOUSEMOVE|CLOSEWINDOW|GADGETDOWN|GADGETUP,
    MYGADGETS|REPORTMOUSE|ACTIVATE|NOCAREREFRESH,
    0, 0, (UBYTE *)"Bezier, By Matthew Dillon", NULL, NULL,
    32, 64, -1, -1, WBENCHSCREEN
};

WIN *Win;
RP  *Rp;
short Ux, Uy, Lx, Ly;
short Step = 128;

main(ac, av)
char *av[];
{
    register IMESS *mess;
    short notdone = 1;
    short pt = -1;
    short ptarray[4][2];
    short auarray[4][2];    /* auto move */
    short au = 0;
    long  delay = 0;

    short gy, gg = 0;
    XPI *po;

    if (ac >= 2) {
	if (ac >= 3)
	    delay = atoi(av[2]);
	au = 1;
	loadauto(auarray, atoi(av[1]));
    }

    init_gadgets(&Nw, &po);
    exiterr(!openlibs(INTUITION_LIB|GRAPHICS_LIB), "unable to open libs");
    exiterr(!(Win = OpenWindow(&Nw)), "unable to open window");
    Rp = Win->RPort;
    SetAPen(Rp, 1);
    setpoint(ptarray, 0, 32, 32);
    setpoint(ptarray, 1, 40, 40);
    setpoint(ptarray, 2, 50, 50);
    setpoint(ptarray, 3, 60, 60);
    setbounds(ptarray);
    while (notdone) {
	short mx, my, mm = 0;
	if (au == 0) {
	    WaitPort(Win->UserPort);
	} else {
	    if (delay)
		Delay(delay);
	    moveauto(auarray, ptarray);
	}
	while (mess = GetMsg(Win->UserPort)) {
	    switch(mess->Class) {
	    case CLOSEWINDOW:
		notdone = 0;
		break;
	    case NEWSIZE:
		setbounds(ptarray);
		break;
	    case GADGETUP:
	    case GADGETDOWN:
		{
		    gg = mess->Class;
		    gy = po->VertPot / 256;
		}
		break;
	    case MOUSEBUTTONS:
		switch(mess->Code) {
		case SELECTDOWN:
		    pt = getpoint(ptarray, mess->MouseX, mess->MouseY);
		    movepoint(ptarray, pt, mess->MouseX, mess->MouseY);
		    drawcurve(ptarray);
		    break;
		case SELECTUP:
		    pt = -1;
		    break;
		}
		break;
	    case MOUSEMOVE:
		if (gg == GADGETDOWN) {
		    gy = po->VertPot / 256;
		    break;
		}
		mm = 1;
		mx = mess->MouseX;
		my = mess->MouseY;
		break;
	    default:
		break;
	    }
	    ReplyMsg(mess);
	}
	if (mm && pt >= 0) {
	    movepoint(ptarray, pt, mx, my);
	    drawcurve(ptarray);
	}
	if (gg) {
	    char buf[32];
	    if (gg == GADGETUP)
		gg = 0;
	    if (gy + 1 >= 0 && gy + 1 != Step) {
		Step = gy + 1;
		sprintf(buf, "gran: %4ld/%ld", Step, ONE);
		drawcurve(ptarray);
		Move(Rp, Ux + 1, Uy + 16);
		Text(Rp, buf, strlen(buf));
	    }
	}
    }
    exiterr(1, NULL);
}

exiterr(n, str)
char *str;
{
    if (n) {
	if (str)
	    puts(str);
	if (Win)
	    CloseWindow(Win);
	closelibs(-1);
	exit(1);
    }
}

setbounds(a)
register long *a;
{
    Ux = Win->BorderLeft;
    Uy = Win->BorderTop;
    Lx = Win->Width - Win->BorderRight;
    Ly = Win->Height- Win->BorderBottom + 1;
    drawcurve(a);
}

setpoint(a, pt, x, y)
register short a[4][2];
{
    a[pt][0] = x;
    a[pt][1] = y;
    drawpoints(a, pt, pt + 1);
}

getpoint(a, x, y)
register short a[4][2];
{
    register short i, bi;
    register long r, br;

    for (i = bi = 0, br = 0x7FFFFFFF; i < 4; ++i) {
	r = (x-a[i][0])*(x-a[i][0]) + (y-a[i][1])*(y-a[i][1]);
	if (r < br) {
	    bi = i;
	    br = r;
	}
    }
    return(bi);
}

movepoint(a, pt, x, y)
register short a[4][2];
{
    SetAPen(Rp, 0);
    drawpoints(a, pt, pt + 1);
    SetAPen(Rp, 1);
    setpoint(a, pt, x, y);
}

#define S10(x)	 ((x) >> SHIFTS)
#define S20(x)	 ((x) >> (2*SHIFTS))
#define MUL3(x)  ((x)+((x)<<1))

/*
 *  So I can use integer arithmatic, I am defining 512 as 1 (as far
 *  as the mathematics go), which means that I must divide any power
 *  multiplication by 512^(n-1).  E.G. .5^2 = .25 ... to make 256^2
 *  equal 128, I must divide by 512^1
 */

drawcurve(a)
register short a[4][2];
{
    long  mr[4];		/* Holds T(t)B partial result	*/
    char  lastpt;
    short array[ONE][2];	/* hold points to plot		*/
    register long  ttt3, t3, tt3;
    register short t, i, n;
    register long tt, ttt;

    lastpt = 0;
    for (t = n = 0; t <= ONE; t += Step) {     /*  t = 0 to 1	   */
oncemore:
	tt = t * t;
	ttt= tt * t;
	ttt3 = S20(MUL3(ttt));
	tt3  = S10(MUL3(tt));
	t3   = MUL3(t);
	ttt  = S20(ttt);

	mr[0] = -ttt + tt3 - t3 + ONE;
	mr[1] = ttt3 - (tt3<<1) + t3;
	mr[2] = -ttt3 + tt3;
	/* MR[3] is ttt     */

	for (i = 0; i < 2; ++i) {
	    array[n][i] = (mr[0] * a[0][i] + mr[1] * a[1][i] +
		      mr[2] * a[2][i] + ttt * a[3][i]) >> SHIFTS;
	}
	++n;
    }
    if (lastpt == 0 && t - Step < ONE) {
	lastpt = 1;
	t = ONE;
	goto oncemore;
    }

    SetAPen(Rp, 0);
    RectFill(Rp, Ux, Uy, Lx - 1, Ly - 1);
    SetAPen(Rp, 1);
    Move(Rp, a[0][0], a[0][1]);
    PolyDraw(Rp, n, array);
    drawpoints(a, 0, 4);
}


drawpoints(a, is, ie)
register short a[4][2];
{
    register short i;
    for (i = is; i < ie; ++i) {
	Move(Rp, a[i][0] - 2, a[i][1]);
	Draw(Rp, a[i][0] + 2, a[i][1]);
	Move(Rp, a[i][0], a[i][1] - 2);
	Draw(Rp, a[i][0], a[i][1] + 2);
    }
}

/*
 *  AUTO ROUTINES   ------------------------------------------------------
 */

loadauto(a, seed)
register short a[4][2];
{
    register short i, j;
    register long n;
    n = random(seed);
    for (i = 0; i < 4; ++i) {
	for (j = 0; j < 2; ++j) {
	    n = random(n);
	    if ((a[i][j] = (((n>>1) & 15) - 7)) == 0)
		a[i][j] = 1;
	}
    }
}

moveauto(au, ar)
register short au[4][2];
register short ar[4][2];
{
    register short i, j;
    short lb[2], mb[2];

    lb[0] = Ux; lb[1] = Uy;
    mb[0] = Lx; mb[1] = Ly;

    for (i = 0; i < 4; ++i) {
	for (j = 0; j < 2; ++j) {
	    if (au[i][j] < 0 && ar[i][j] <= lb[j]+8)
		au[i][j] = -au[i][j];
	    if (au[i][j] > 0 && ar[i][j] >= mb[j]-8)
		au[i][j] = -au[i][j];
	    ar[i][j] += au[i][j];
	}
    }
    drawcurve(ar);
}

random(n)
{
    return((n ^ (n >> 8)) * 13 + 1);
}


/*
 *  GADGET ROUTINES!	------------------------------------------------
 */


#define NG(nn)	&Gadgets[nn+1]
#define G_YGLOB 1
#define G_XGLOB 2

XPI Props[] = {
    { AUTOKNOB|FREEVERT , 0, 0, 0x1FFF, 0x1FFF }
};

IM Images[] = {
    { 0,0,2,1,1, NULL, 1, 0, NULL },
};

GADGET Gadgets[] = {
    {
	NULL, -15, 11, 15, -19, GADGIMAGE|GADGHCOMP|GRELRIGHT|GRELHEIGHT,
	GADGIMMEDIATE|RIGHTBORDER|RELVERIFY,PROPGADGET,
	(APTR)&Images[0],NULL,NULL,0,(APTR)&Props[0], G_YGLOB, 0
    },
};

GADGET *Gc;
long GUx, GUy;

init_gadgets(nw, ppo)
NW *nw;
XPI **ppo;
{
    nw->FirstGadget = &Gadgets[0];
    *ppo = &Props[0];
}


!Funky!Stuff!
fi  # end of overwriting check
echo shar: "extracting 'bezier.uue'" '(12325 characters)'
if test -f 'bezier.uue'
then
	echo shar: "will not over-write existing file 'bezier.uue'"
else
cat << \!Funky!Stuff! > 'bezier.uue'
begin 644 bezier
M```#\P`````````#``````````(```>8````_P````$```/I```'F$[Z#%A"
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
M""@00JT`%$JM``QL$D2M``Q*A&P*1(0K?`````$`%"(M``P@!$ZZ`])![($2
M4XH4L`@`(BT`#"`$3KH#RB@`9MY*K0`49P93BA2\`"T@"DS?!!!.74YU3E7_
M%$CG"#`D;0`()FT`#$*M__@K;0`0__P@2U*+$!!(@$C`*`!G``,PN+P````E
M9@`#"D(M_R(K?`````'_]"M\````(/_P*WP``"<0_^P@2U*+$!!(@$C`*`"P
MO````"UF$$*M__0@2U*+$!!(@$C`*`"XO````#!F%"M\````,/_P($M2BQ`0
M2(!(P"@`N+P````J9AH@;?_\6*W__"M0_^@@2U*+$!!(@$C`*`!@-$*M_^A@
M(G(*("W_Z$ZZ"<#0A)"\````,"M`_^@@2U*+$!!(@$C`*`!![($E"#```D@`
M9M*XO````"YF8B!+4HL0$$B`2,`H`+"\````*F8:(&W__%BM__PK4/_L($M2
MBQ`02(!(P"@`8#1"K?_L8")R"B`M_^Q.N@E6T(20O````#`K0/_L($M2BQ`0
M2(!(P"@`0>R!)0@P``)(`&;2*WP````$_^2XO````&QF%B!+4HL0$$B`2,`H
M`"M\````!/_D8!2XO````&AF#"!+4HL0$$B`2,`H`"`$8'XK?`````C_X&`<
M*WP````*_^!@$BM\````$/_@8`@K?/____;_X"\M_^1(;?\B+RW_X"\M__Q.
MNOVT3^\`$"M`_]P@+?_DT:W__&!:(&W__%BM__PK4/_<+RW_W$ZZ`AQ83RM`
M_^1@2B!M__Q8K?_\*!!![?\A*TC_W!"$8"B0O````&-GXE.`9Y20O`````MG
M`/]N68!GM%6`9P#_;E>`9P#_<F#,0>W_(I'M_]PK2/_D("W_Y+"M_^QO!BMM
M_^S_Y$JM__1G<"!M_]P,$``M9PHB;?_<#!$`*V8T#*T````P__!F*E.M_^@@
M;?_<4JW_W!`02(!(P"\`3I)83["\_____V8*</],WPP03EU.=6`8+RW_\$Z2
M6$^PO/____]F!'#_8.)2K?_X("W_Z%.M_^BPK?_D;MI"K?_@8"0@;?_<4JW_
MW!`02(!(P"\`3I)83["\_____V8$</]@JE*M_^`@;?_<2A!G"B`M_^"PK?_L
M;<H@+?_@T:W_^$JM__1F*F`:2'@`($Z26$^PO/____]F!G#_8`#_<%*M__@@
M+?_H4ZW_Z+"M_^1NV&`8+P1.DEA/L+S_____9@9P_V``_TA2K?_X8`#\Q"`M
M__A@`/\X2.=(`$*$2H!J!$2`4D1*@6H&1($*1``!83Y*1&<"1(!,WP`22H!.
M=4CG2`!"A$J`:@1$@%)$2H%J`D2!81H@`6#8+P%A$B`!(A]*@$YU+P%A!B(?
M2H!.=4CG,`!(04I!9B!(038!-`!"0$A`@,,B`$A`,@*"PS`!0D%(04S?``Q.
M=4A!)@$B`$)!2$%(0$)`=`_0@-.!MH%B!)*#4D!1RO_R3-\`#$YU(&\`!"`(
M2AAF_)'`(`A3@$YU3E4``$AL@;PO+0`(3KH`"%!/3EU.=4Y5```O!"@M``@O
M+0`,+P1.N@`T4$^XO`````IF)B!M``P0*``,2(!(P`@```=G%$AX__\O+0`,
M3KH`_E!/*!].74YU8/A.50``+PHD;0`,(%*QZ@`$91H@+0`(P+P```#_+P`O
M"DZZ`-!03R1?3EU.=2!24I(0+0`+$(!(@$C`P+P```#_8.1.50``+PI![(&F
M)$@@2M7\````%B\(81!83T'L@UZUR&7J)%].74YU3E4``$CG""`D;0`(>``@
M"F8*</],WP003EU.=4HJ``QG5`@J``(`#&<,2'C__R\*85903R@`$"H`#4B`
M2,`O`$ZZ!0A83XB`""H``0`,9PHO*@`(3KH"/%A/""H`!0`,9Q0O*@`23KH"
MV%A/+RH`$DZZ`B!83T*20JH`!$*J``A"*@`,(`1@C$Y5__Y(YP@@)&T`"$'Z
M_T(I2(.6""H`!``,9PIP_TS?!!!.74YU""H``@`,9S(H$IBJ``@O!"\J``@0
M*@`-2(!(P"\`3KH"ED_O``RPA&<0".H`!``,0I)"J@`$</]@O@RM_____P`,
M9A`(J@`"``Q"DD*J``1P`&"D2JH`"&8(+PI.N@"D6$\,:@`!`!!F,!MM``__
M_TAX``%(;?__$"H`#4B`2,`O`$ZZ`C)/[P`,L+P````!9I@@+0`,8`#_8"2J
M``@P*@`02,#0J@`()4``!`CJ``(`#"!24I(0+0`/$(!(@$C`P+P```#_8`#_
M,$Y5```O"D'L@:8D2$HJ``QG&-7\````%D'L@UZUR&4(<``D7TY=3G5@XD*2
M0JH`!$*J``@@"F#J3E7__"\*)&T`"$AX!`!.N@#"6$\K0/_\9A@U?``!`!`@
M"M"\````#B5```@D7TY=3G4U?`0``!`(Z@`!``PE;?_\``@0*@`-2(!(P"\`
M3KH`WEA/2H!G!@`J`(``#&#,3E4``$CG`#`D;(-F8!0F4B`J``10@"\`+PI.
MN@124$\D2R`*9NA"K(-F3-\,`$Y=3G5.50``+PI!^O_&*4B#FD*G("T`"%"`
M+P!.N@0`4$\D0$J`9@AP`"1?3EU.=22L@V8E;0`(``0I2H-F(`I0@&#F3E4`
M`"\M``AAMEA/3EU.=4Y5``!(YP`PE\LD;(-F8`X@;0`(48BQRF<2)DHD4B`*
M9NYP_TS?#`!.74YU(`MG!":28`0I4H-F("H`!%"`+P`O"DZZ`ZA03W``8-A.
M50``+PIR!B`M``A.N@*T)$#5[(-V2JT`"&T2,"R#7DC`(BT`"+*`;`1*DF80
M*7P````"@YYP_R1?3EU.=7(&("T`"$ZZ`GP@;(-V+S`(`$ZZ`M183TJ`9P1P
M`6`"<`!@UDY5```O+0`(3KH"GEA/2H!F#DZZ`J@I0(.></].74YU<`!@^$Y5
M``!(YPP@*"T`"$ZZ`'9R!B`$3KH")B1`U>R#=DJ$;0XP+(->2,"X@&P$2I)F
M$BE\`````H.></],WP0P3EU.=3`J``3`?``#9@PI?`````6#GG#_8.(O+0`0
M+RT`#"\23KH"7D_O``PJ`+"\_____V8,3KH"(BE`@YYP_V"Z(`5@MDY5__Q(
M>!``0J=.N@+.4$\K0/_\"```#&<22JR#?F8(("W__$Y=3G5.N@`&<`!@]$Y5
M``!(>``$2'H`'DZZ`?@O`$ZZ`?I/[P`,2'@``4ZZ``Q83TY=3G5>0PH`3E4`
M`$JL@Y9G!B!L@Y9.D"\M``A.N@`(6$].74YU3E7__"\$*VT`"/_\2JR#=F<L
M>`!@"B\$3KH`SEA/4H0P+(->2,"X@&WL,"R#7L'\``8O`"\L@W9.N@'B4$]*
MK(.:9P8@;(.:3I!*K(/:9PHO+(/:3KH!F%A/2JR#UF<*+RR#UDZZ`8A83TJL
M@]YG"B\L@]Y.N@%X6$\L>``$""X`!`$I9Q0O#4OZ``I.KO_B*E]@!D*G\U].
M<TJL@X)F*DJL@Y)G(B\L@XXO+(.23KH!;%!/("R#BE*`Y8`O`"\L@X9.N@%8
M4$]@#DZZ`4@O+(."3KH!@%A/("W__"YL@VI.=2@?3EU.=4Y5``!(YPX@*"T`
M"'(&(`1.N@!$)$#5[(-V2H1M#C`L@UY(P+B`;`1*DF82*7P````"@YYP_TS?
M!'!.74YU,"H`!,!\@`!F""\23KH`+EA/0I)P`&#@2.=P`#0!Q,`F`4A#QL!(
M0T)#U(-(0,#!2$!"0-""3-\`#DYU(B\`!"QL@W).[O_<(B\`!"QL@W).[O^"
M(B\`!"QL@W).[O\Z(B\`!"QL@W).[O^X+&R#<D[N_\HL;(-R3N[_?"(O``0L
M;(-R3N[_*$SO``8`!"QL@W).[O_B+&R#<D[N_\1,[P`.``0L;(-R3N[_T$CG
M`01,[R"```PL;(-N3J[_E$S?((!.=4[Z``(B;P`$+&R#;D[N_F),[P`#``0L
M;(-N3N[_.B)O``0L;(-N3N[^VBQL@VY.[O]\(F\`!"`O``@L;(-N3N[_+D[Z
M``(@;P`$+&R#;D[N_HQ.^@`"+&R#;B)O``0@+P`(3N[]V$[Z``(B;P`$+&R#
M;D[N_H9,[P`#``0L;(-N3N[^SD[Z``(@;P`$+&R#;D[N_H`B;P`$3.\``P`(
M+&R#OD[N_PHB;P`$3.\``P`(+&R#OD[N_Q`B;P`$3.\!`0`(+&R#OD[N_K`B
M;P`$3.\`#P`(+&R#OD[N_LXB;P`$("\`""QL@[Y.[OZJ(F\`!"!O``@@+P`,
M+&R#OB\'3J[_Q"X?3G5,[P,```0L;(/23N[_H"!O``0L;(/23N[_IB!O``0L
M;(/23N[_LB!O``0L;(/"3N[_N"!O``0L;(/"3N[_-````^P````%````````
M"R````OT```,!```#!H```Q&`````P````$```L"```+W```#,X````````#
M\@```^H```#8`$``0`%``&0``0```GH``A(/```````````````$````````
M````(`!`_____P`!`(``!0`````?_Q__```````````````````````"``$`
M`0`````!````````````__$`"P`/_^T`5``3``,```!(````````````````
M````,@`!````````"T````.\```+20```\````M3```#Q```"UT```/(```+
M9@```\P```MQ```#T```"W8```/4```+?@```]@```N(```#W```"Y@```/@
M```+J````^0```NO```#Z```"[4```/L```+NP```_````O!```#]```"\4`
M``/X```````````P,3(S-#4V-S@Y86)C9&5F````("`@("`@("`@,#`P,#`@
M("`@("`@("`@("`@("`@(""00$!`0$!`0$!`0$!`0$!`#`P,#`P,#`P,#$!`
M0$!`0$`)"0D)"0D!`0$!`0$!`0$!`0$!`0$!`0$!`4!`0$!`0`H*"@H*"@("
M`@("`@("`@("`@("`@("`@("0$!`0"```````````````````0`````!````
M``````````````````$!`````0`````````````````````!`@````$`````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````%``````#[````!(````!````;@```'X```",````
ME````)P```"D````K````+0```"\````Q````,P```#4````W````.0```#L
M````]````/P```$$````$0`````````:````B````)````"8````H````*@`
M``"P````N````,````#(````T````-@```#@````Z````/````#X```!````
2``````/R```#ZP````$```/R
`
end
!Funky!Stuff!
fi  # end of overwriting check
exit 0
#	End of shell archive