Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!mnetor!seismo!rutgers!ames!ucbcad!ucbvax!CORY.BERKELEY.EDU!dillon From: dillon@CORY.BERKELEY.EDU (Matt Dillon) Newsgroups: comp.sys.amiga Subject: Splurge #3 ... Bouncing Beziers Message-ID: <8705110627.AA22443@cory.Berkeley.EDU> Date: Mon, 11-May-87 02:27:18 EDT Article-I.D.: cory.8705110627.AA22443 Posted: Mon May 11 02:27:18 1987 Date-Received: Wed, 13-May-87 00:46:39 EDT Sender: daemon@ucbvax.BERKELEY.EDU Lines: 624 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 #include #define SHIFTS 9 #define ONE (1<= 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" M97II97(L($)Y($UA='1H97<@1&EL;&]N`$Y5_Z@O"CM\``'__CM\_____$)M M_]I"K?_60FW_T@RM`````@`(;3P,K0````,`"&T2(&T`#"\H``A.N@HV6$\K M0/_6.WP``?_:(&T`#"\H``1.N@H>6$\O`$AM_]Q.N@@D4$](;?_.2&R``DZZ M">903TAZ`R)(>``#3KH+,%A/2H!F!'`!8`)P`$C`+P!.N@-`4$](>@,42&R` M`DZZ'9A83RE`@ZIF!'`!8`)P`$C`+P!.N@,<4$\@;(.J*6@`,H.N2'@``2\L M@ZY.NAT.4$](>``@2'@`($*G2&W_[$ZZ`Z!/[P`02'@`*$AX`"A(>``!2&W_ M[$ZZ`XA/[P`02'@`,DAX`#)(>``"2&W_[$ZZ`W!/[P`02'@`/$AX`#Q(>``# M2&W_[$ZZ`UA/[P`02&W_[$ZZ`MY83TIM__YG``)(0FW_R$IM_]IF$"!L@ZHO M*`!63KH<+EA/8!Y*K?_69PHO+?_63KH;*%A/2&W_[$AM_]Q.N@>&4$\@;(.J M+R@`5DZZ&[Y83R1`2H!G``$8("H`%&```-1";?_^8```_$AM_^Q.N@)N6$]@ M``#N.VH`%O_2(&W_SG``,"@`!."(.T#_U&```-1P`#`J`!A@6#`J`")(P"\` M,BH`($C!+P%(;?_L3KH"WD_O``P[0/_\,"H`(DC`+P`R*@`@2,$O`30M__Q( MPB\"2&W_[$ZZ`TI/[P`02&W_[$ZZ`Y183V`8.WS____\8!"0O````&AGH)"\ M````@&?H8&`,;0`@_])F$B!M_\YP`#`H``3@B#M`_]1@1CM\``'_R#MJ`"#_ MS#MJ`"+_RF`R8#!5@&<`_S)=@&<`_U11@&?`D+P````09P#_+)"\````(&<` M_R*0O``````!84)03R1?3EU.=75N M86)L92!T;R!O<&5N(&QI8G,`=6YA8FQE('1O(&]P96X@=VEN9&]W`&=R86XZ M("4T;&0O)6QD``!.50``2JT`"&/__3KH&UEA/2'@``4ZZ%NQ83TY=3G5.50``+PHD;0`((&R# MJA`H`#9(@#E`@Z(@;(.J$"@`-TB`.4"#I"!L@ZHP*``(2,`B;(.J$BD`.$B! M2,&0@3E`@Z8@;(.J,"@`"DC`(FR#JA(I`#E(@4C!D(%2@#E`@Z@O"DZZ`398 M3R1?3EU.=4Y5```O"B1M``@@+0`,Y8`UK0`2"``@+0`,Y8`@0-'*,6T`%@`" M("T`#%*`+P`O+0`,+PI.N@+L3^\`#"1?3EU.=4Y5``!(YP\@)&T`"'H`.`4N M/'____]@:B`M``PR!$C!Y8$T,A@`2,*0@B(M``PV!$C#Y8,T,C@`2,*2@DZZ M%U(O`"`M`!`V!$C#Y8,@0]'*-B@``DC#D(,B+0`0-@1(P^6#(D/3RC8I``)( MPY*#3KH7("Q?+`[<@+R';`0Z!"X&4D2X?``$;9`P!4C`3-\$\$Y=3G5.50`` M+PHD;0`(0J:B-BWW[$C#Y8,R"TC! MXX'6@4WM]^X]@C@`4DNV_``";0#_=%)M]^S>;(`ROGP"`&\`_N!*+?_O9B(P M!TC`,BR`,DC!D(&PO````@!L#AM\``'_[SX\`@!@`/ZX0J6!-#(8`$C"+P(O+(.N3KH5*D_O``Q21#`$2,"PK0`0;0#_/$S?!!!.74YU M3E4``$CG#B`D;0`(+RT`#$ZZ`9Q83RP`>`!@3'H`8$`O!DZZ`8I83RP`(`;B M@,"\````#U^`,@1(P>6!-`5(PN."TH(U@!@`9A0P!$C`Y8`R!4C!XX'0@36\ M``$(`%)%NGP``FVZ4D2X?``$;:Y,WP1P3EU.=4Y5__A(YPPP)&T`""9M``P[ M;(.B__P[;(.D__X[;(.F__@[;(.H__IX`&```/1Z`&```.0P!$C`Y8`R!4C! MXX'0@4IR"`!L2C0$2,+E@C8%2,/C@]2#-C,H`$C#-`5(PN."0>W__#(P*`!( MP5"!MH%N(#`$2,#E@#(%2,'C@="!-`1(PN6"-@5(P^.#U(-$<@@`,`1(P.6` M,@5(P>.!T(%*<@@`;THT!$C"Y8(V!4C#XX/4@S8S*`!(PS0%2,+C@D'M__@R M,"@`2,%1@;:!;2`P!$C`Y8`R!4C!XX'0@30$2,+E@C8%2,/C@]2#1'((`#`$ M2,#E@#(%2,'C@="!-`1(PN6"-@5(P^.#U(,V,B@`UW,(`%)%NGP``FT`_QA2 M1+A\``1M`/\(+PM.NON&6$],WPPP3EU.=4Y5```@+0`(X(`O`"`M``@B`"`? MLX!R#4ZZ$@92@$Y=3G5.50``0>R`7B)M``@C2``20>R`-")M``PBB$Y=3G5. M50``2.<,("1M``AX`'H`#!(`(&8$4HI@]@P2`"UF!%**>@$,$@`P;28,$@`Y M;B`@2E**$!!(@$C`(@3C@="!)`3G@M""*`"8O````#!@U$J%9P8@!$2`8`(@ M!$S?!#!.74YU3E4``$CG""`X+0`*0?D```"()$A@)@@$``!G'"!J``1*D&<4 M(&H`!"\03KD``!T<6$\@:@`$0I#B3%"*2D1G!$J29M),WP003EU.=6=R87!H M:6-S`&EN='5I=&EO;@!E>'!A;G-I;VX`9&ES:V9O;G0`=')A;G-L871O<@!I M8V]N`&UA=&AF9G``;6%T:'1R86YS`&UA=&AI965E9&]U8F)AB!L@WH@O$U!3EA"ITZZ#_183R1`2JH`K&`/M2'H`+$ZZ M#OA03R!L@W8A0``,+RR#AB\L@XI.NO(@4$]"ITZZ#0Y83R1?3EU.=2H`3E4` M`$CG##`D;0`0(&T`""`H`*SE@"@`($0@*``0Y8`F0!`32(!(P-"M``Q4@"E` M@XY"IR\L@XY.N@[@4$\I0(.29@A,WPPP3EU.=1`32(!(P"\`($M2B"\(+RR# MDDZZ`5I/[P`,2'H!4!`32(!(P-"L@Y(O`$ZZ`8Y03R\M``PO"B\L@Y).N@%: M3^\`#$*L@XHF;(.2)$L0$TB`2,`J`+"\````(&<@NKP````)9QBZO`````QG M$+J\````#6<(NKP````*9@12BV#,#!,`(&T``(P,$P`B9C)2BR!+4HL0$$B` M2,`J`&<@($I2BA"%NKP````B9A`,$P`B9@12BV`&0BK__V`"8-)@1"!+4HL0 M$$B`2,`J`&@`F;(.28!H@!>6`(&R#AB&+"``O"TZZ M!DY83U*`U\!2A;JL@XIMX"`%Y8`@;(.&0K`(`&``_HX@`$SO`P``!"`((B\` M#&`"$-E7R?_\9P9206`"0AA1R?_\3G4P/'__8`0P+P`.(&\`!$H89OQ32")O M``A30!#95\C__&<"0A`@+P`$3G4@;P`$(`@B;P`($-EF_$YU3E4``"\*)&T` M"$H29R0@2E**$!!(@$C`+P!.N@7&6$^PO/____]F"'#_)%].74YU8-A(>``* M3KH%JEA/8.Q.50``2.<.,"1M``A"ITAZ`(Y.N@SX4$\I0(/29@A,WPQP3EU. M=2!M``PB:``D+RD`!$ZZ#:)83R@`9U)(>@!M($0O*``V3KH-=%!/)D!*@&@`X3KH+ M_%!/)4``H"\$3KH-0%A/+RR#TDZZ#")83T*L@])@@&EC;VXN;&EB0!7 M24Y$3U<`*@!.50``+P0I;0`(@V)(;0`0+RT`#$AZ`!I.N@"\3^\`#"@`(&R# M8D(0(`0H'TY=3G5.50``(&R#8E*L@V(0+0`+$(!(@$C`P+P```#_3EU.=4Y5 M``!(YP@@)&T`$`RM````!``49@@@;0`(*!!@%$JM``QO""!M``@H$&`&(&T` 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#_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*``@ M"F8*R#=DJ$;0XP+(->2,"X@&P$2I)F M$BE\`````H.>!``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`!@"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