dillon@CORY.BERKELEY.EDU (Matt Dillon) (05/11/87)
Again, a very *small* program which I wrote to fool
around with B-SPLINES. Note that there are some cosmetic errors,
and the 'add point' routine isn't perfect (but these little
programs are just splurges on my part so don't bother to mail
me the bugs you find).
-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:
# bspline.c
# bspline.uue
# This archive created: Sun May 10 20:18:36 1987
export PATH; PATH=/bin:/usr/bin:$PATH
echo shar: "extracting 'bspline.c'" '(9256 characters)'
if test -f 'bspline.c'
then
echo shar: "will not over-write existing file 'bspline.c'"
else
cat << \!Funky!Stuff! > 'bspline.c'
/*
* BSPLINE.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.
*
* BSPLINE EQUATIONS:
*
* c(t) = T(t)BP
*
* T(t) = (t^3 t^2 t 1) P= ( Pi-1 )
* B = ( -1 3 -3 1 ) ( Pi )
* ( 3 -6 3 0 ) ( Pi+1 )
* ( -3 0 3 0 ) ( Pi+2 )
* ( 1 4 1 0 )
*
* t: range 0 to 1
* C: coordinate matrix 1xD matrix (D = dimensions)
* B: Bspline matrix 4x4
* P: Ctrl. Point matrix 4xD matrix (D = dimensions)
*
* using D = 2. For B-Spline, must loop through all control points
* beginning at Pi+1 and ending at Pend-2
*/
#include <typedefs.h>
#include <xmisc.h>
#define SHIFTS 9
#define ONE (1<<SHIFTS)
#define MAXPTS 256 /* Maximum # of bspline points allowed */
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|MENUPICK,
MYGADGETS|REPORTMOUSE|ACTIVATE|NOCAREREFRESH,
0, 0, (UBYTE *)"Bspline, By Matthew Dillon", NULL, NULL,
32, 64, -1, -1, WBENCHSCREEN
};
WIN *Win;
RP *Rp;
short Ux, Uy, Lx, Ly;
short Step = 128;
short Display = 1;
short Pts[MAXPTS+1][2], Npts;
main(ac, av)
char *av[];
{
register IMESS *mess;
short notdone = 1;
short pt = -1;
char mode = 0; /* 0=move pts, 1=add pts, 2=del pts */
short gy, gg = 0;
XPI *po;
init_gadgets(&Nw, &po);
exiterr(!openlibs(INTUITION_LIB|GRAPHICS_LIB), "unable to open libs");
exiterr(!(Win = OpenWindow(&Nw)), "unable to open window");
init_menu(Win);
Rp = Win->RPort;
SetAPen(Rp, 3);
SetDrMd(Rp, COMPLEMENT);
setpoint(Pts, 0, 32, 32);
setpoint(Pts, 1, 40, 40);
setpoint(Pts, 2, 100, 50);
setpoint(Pts, 3, 200, 60);
Npts = 4;
setbounds(Pts, Npts);
while (notdone) {
short mx, my, mm = 0;
WaitPort(Win->UserPort);
while (mess = GetMsg(Win->UserPort)) {
switch(mess->Class) {
case CLOSEWINDOW:
notdone = 0;
break;
case NEWSIZE:
setbounds(Pts, Npts);
break;
case GADGETUP:
case GADGETDOWN:
{
gg = mess->Class;
gy = po->VertPot / 256;
}
break;
case MOUSEBUTTONS:
switch(mess->Code) {
case SELECTDOWN:
pt = getpoint(Pts, Npts, mess->MouseX, mess->MouseY);
switch(mode) {
case 0:
mm = 1;
mx = mess->MouseX;
my = mess->MouseY;
goto break2;
case 1:
if (pt < 0)
pt = 0;
if (Npts != MAXPTS) {
bmov(Pts[pt], Pts[pt+1], (Npts-pt)*sizeof(Pts[0]));
Pts[pt][0] = mess->MouseX;
Pts[pt][1] = mess->MouseY;
++Npts;
}
break;
case 2:
if (pt >= 0 && pt < Npts) {
bmov(Pts[pt+1], Pts[pt], (Npts-pt)*sizeof(Pts[0]));
--Npts;
}
break;
}
clearall();
drawcurve(Pts, Npts);
drawpoints(Pts, 0, Npts);
break;
case SELECTUP:
pt = -1;
break;
}
break2:
break;
case MENUPICK:
switch(MENUNUM(mess->Code)) {
case 0:
mode = ITEMNUM(mess->Code);
break;
case 1:
drawpoints(Pts, 0, Npts);
Display = ITEMNUM(mess->Code); /* 0=cross 1=nums */
drawpoints(Pts, 0, Npts);
}
break;
case MOUSEMOVE:
if (gg == GADGETDOWN) {
gy = po->VertPot / 256;
break;
}
if (mode == 0 || mode == 1) {
mm = 1;
mx = mess->MouseX;
my = mess->MouseY;
}
break;
default:
break;
}
ReplyMsg(mess);
}
if (mm && pt >= 0) {
register int i;
register int n;
i = (pt - 3 < 0) ? 0 : pt - 3;
n = (i + 7 > Npts) ? Npts - i : 7;
drawpoints(Pts, pt, pt+1);
drawcurve(&Pts[i], n);
setpoint(Pts, pt, mx, my);
drawcurve(&Pts[i], n);
drawpoints(Pts, pt, pt+1);
}
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);
clearall();
drawcurve(Pts, Npts);
drawpoints(Pts, 0, Npts);
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) {
uninit_menu(Win);
CloseWindow(Win);
}
closelibs(-1);
exit(1);
}
}
setbounds(a, na)
register long *a;
{
Ux = Win->BorderLeft;
Uy = Win->BorderTop;
Lx = Win->Width - Win->BorderRight;
Ly = Win->Height- Win->BorderBottom + 1;
clearall();
drawcurve(a, na);
drawpoints(a, 0, na);
}
setpoint(a, pt, x, y)
register short a[4][2];
{
a[pt][0] = x;
a[pt][1] = y;
}
getpoint(a, na, x, y)
register short a[][2];
{
register short i, bi;
register long r, br;
for (i = bi = 0, br = 0x7FFFFFFF; i < na; ++i) {
r = (x-a[i][0])*(x-a[i][0]) + (y-a[i][1])*(y-a[i][1])*3;
if (r < br) {
bi = i;
br = r;
}
}
return(bi);
}
clearall()
{
SetAPen(Rp, 0);
SetDrMd(Rp, JAM2);
RectFill(Rp, Ux, Uy, Lx - 1, Ly - 1);
SetAPen(Rp, 3);
SetDrMd(Rp, COMPLEMENT);
}
#define S10(x) ((x) >> SHIFTS)
#define S20(x) ((x) >> (2*SHIFTS))
/*
* 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
*/
static short Array[ONE+4][2]; /* hold points to plot */
drawcurve(a, na)
register short a[][2];
{
long mr[4];
register short n, i, t;
long tt, ttt;
short last;
for (i = 1; i < na - 2; ++i) {
for (t = n = last = 0; t <= ONE; t += Step) {
oncemore:
tt = t * t;
ttt= tt* t;
mr[0] = -S20(ttt/6) + S10(tt/2) - t/2 + ONE/6;
mr[1] = S20(ttt/2) - S10(tt) + ONE*2/3;
mr[2] = -S20(ttt/2) + S10(tt/2) + t/2 + ONE/6;
mr[3] = S20(ttt/6);
Array[n][0] = (mr[0] * a[i-1][0] + mr[1] * a[i][0] + mr[2] * a[i+1][0] + mr[3] * a[i+2][0]) >> SHIFTS;
Array[n][1] = (mr[0] * a[i-1][1] + mr[1] * a[i][1] + mr[2] * a[i+1][1] + mr[3] * a[i+2][1]) >> SHIFTS;
if (++n == ONE + 4) {
--n;
puts("software error: OVERFLOW");
}
}
if (last == 0 && t > ONE) {
t = ONE;
last = 1;
goto oncemore;
}
Move(Rp, Array[0][0], Array[0][1]);
PolyDraw(Rp, n, Array);
}
}
drawpoints(a, is, ie)
register short a[][2];
{
register short i;
for (i = is; i < ie; ++i) {
if (Display) {
char buf[32];
Move(Rp, a[i][0], a[i][1]);
Draw(Rp, a[i][0], a[i][1]);
Move(Rp, a[i][0] - 16, a[i][1] + 4);
sprintf(buf, "%ld", i);
Text(Rp, buf, strlen(buf));
} else {
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);
}
}
}
/*
* 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];
}
/*
* MENU ROUTINES! -----------------------------------------------------
*/
ITEXT Itext[] = {
{ 0,1,JAM2,0,0,NULL,(UBYTE *)" Move", NULL },
{ 0,1,JAM2,0,0,NULL,(UBYTE *)" Add", NULL },
{ 0,1,JAM2,0,0,NULL,(UBYTE *)" Delete",NULL },
{ 0,1,JAM2,0,0,NULL,(UBYTE *)" Cross", NULL },
{ 0,1,JAM2,0,0,NULL,(UBYTE *)" Number",NULL }
};
MENUITEM Item0[] = {
{ &Item0[1], 0, 0, 8*11, 8, CHECKIT|ITEMENABLED|COMMSEQ|HIGHCOMP|ITEMTEXT,
0xFE, (APTR)&Itext[0], NULL, 'M', NULL, NULL
},
{
&Item0[2], 0, 8, 8*11, 8, CHECKIT|ITEMENABLED|COMMSEQ|HIGHCOMP|ITEMTEXT,
0xFD, (APTR)&Itext[1], NULL, 'A', NULL, NULL
},
{
NULL, 0,16, 8*11, 8, CHECKIT|ITEMENABLED|COMMSEQ|HIGHCOMP|ITEMTEXT,
0xFB, (APTR)&Itext[2], NULL, 'D', NULL, NULL
}
};
MENUITEM Item1[] = {
{ &Item1[1], 0, 0, 8*11, 8, CHECKIT|ITEMENABLED|COMMSEQ|HIGHCOMP|ITEMTEXT,
0xFE, (APTR)&Itext[3], NULL, 'C', NULL, NULL
},
{
NULL , 0, 8, 8*11, 8, CHECKIT|ITEMENABLED|COMMSEQ|HIGHCOMP|ITEMTEXT,
0xFD, (APTR)&Itext[4], NULL, 'N', NULL, NULL
}
};
MENU Menu[] = {
{ &Menu[1], 0, 0,8*11, 8, MENUENABLED, "Control", &Item0[0] },
{ NULL , 8*11,0,8*11, 8, MENUENABLED, "Display", &Item1[0] }
};
init_menu(win)
WIN *win;
{
SetMenuStrip(win, &Menu[0]);
}
uninit_menu(win)
WIN *win;
{
ClearMenuStrip(win);
}
!Funky!Stuff!
fi # end of overwriting check
echo shar: "extracting 'bspline.uue'" '(13690 characters)'
if test -f 'bspline.uue'
then
echo shar: "will not over-write existing file 'bspline.uue'"
else
cat << \!Funky!Stuff! > 'bspline.uue'
begin 644 bspline
M```#\P`````````#``````````(```@J```$6`````$```/I```(*D[Z#H)"
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
M3RM`__QF\``$`$"`*T+P````.)4``""1?3EU.=35\!```$`CJ``$`#"5M
M__P`"!`J``U(@$C`+P!.N@#>6$]*@&<&`"H`@``,8,Q.50``2.<`,"1LC,)@
M%"92("H`!%"`+P`O"DZZ!$903R1+(`IFZ$*LC,),WPP`3EU.=4Y5```O"D'Z
M_\8I2(SV0J<@+0`(4(`O`$ZZ`_103R1`2H!F"'``)%].74YU)*R,PB5M``@`
M!"E*C,(@"E"`8.9.50``+RT`"&&V6$].74YU3E4``$CG`#"7RR1LC,)@#B!M
M``A1B+'*9Q(F2B12(`IF[G#_3-\,`$Y=3G4@"V<$)I)@!"E2C,(@*@`$4(`O
M`"\*3KH#G%!/<`!@V$Y5```O"G(&("T`"$ZZ`K0D0-7LC-)*K0`(;1(P+(2J
M2,`B+0`(LH!L!$J29A`I?`````*,^G#_)%].74YU<@8@+0`(3KH"?"!LC-(O
M,`@`3KH"R%A/2H!G!'`!8`)P`?E4``"\M``A.N@*26$]*@&8.3KH"G"E`
MC/IP_TY=3G5P`Ϥ``$CG#"`H+0`(3KH`=G(&(`1.N@(F)$#5[(S22H1M
M#C`LA*I(P+B`;`1*DF82*7P````"C/IP_TS?!#!.74YU,"H`!,!\``-F#"E\
M````!8SZ</]@XB\M`!`O+0`,+Q).N@)23^\`#"H`L+S_____9@Q.N@(6*4",
M^G#_8+H@!6"V3E7__$AX$`!"ITZZ`L)03RM`__P(```,9Q)*K(S:9@@@+?_\
M3EU.=4ZZ``9P`&#T3E4``$AX``1(>@`>3KH!["\`3KH![D_O``Q(>``!3KH`
M#%A/3EU.=5Y#"@!.50``2JR,\F<&(&R,\DZ0+RT`"$ZZ``A83TY=3G5.5?_\
M+P0K;0`(__Q*K(S29RQX`&`*+P1.N@#.6$]2A#`LA*I(P+B`;>PP+(2JP?P`
M!B\`+RR,TDZZ`=903TJLC/9G!B!LC/9.D$JLC3AG"B\LC3A.N@&,6$]*K(TT
M9PHO+(TT3KH!?%A/2JR-/&<*+RR-/$ZZ`6Q83RQX``0(+@`$`2EG%"\-2_H`
M"DZN_^(J7V`&0J?S7TYS2JR,WF8J2JR,[F<B+RR,ZB\LC.Y.N@%@4$\@+(SF
M4H#E@"\`+RR,XDZZ`4Q03V`.3KH!/"\LC-Y.N@%T6$\@+?_\+FR,QDYU*!].
M74YU3E4``$CG#B`H+0`(<@8@!$ZZ`$0D0-7LC-)*A&T.,"R$JDC`N(!L!$J2
M9A(I?`````*,^G#_3-\$<$Y=3G4P*@`$P'R``&8(+Q).N@`N6$]"DG``8.!(
MYW``-`'$P"8!2$/&P$A#0D/4@TA`P,%(0$)`T(),WP`.3G4B+P`$+&R,SD[N
M_]PB+P`$+&R,SD[N_X(B+P`$+&R,SD[N_[@L;(S.3N[_RBQLC,Y.[O]\(B\`
M!"QLC,Y.[O\H3.\`!@`$+&R,SD[N_^(L;(S.3N[_Q$SO``X`!"QLC,Y.[O_0
M2.<!!$SO((``#"QLC,I.KO^43-\@@$YU3OH``B)O``0L;(S*3N[^8DSO``,`
M!"QLC,I.[O\Z(F\`!"QLC,I.[O[:+&R,RD[N_WPB;P`$("\`""QLC,I.[O\N
M3OH``B!O``0L;(S*3N[^C$[Z``(L;(S*(F\`!"`O``A.[OW83OH``B)O``0L
M;(S*3N[^ADSO``,`!"QLC,I.[O[.3OH``B!O``0L;(S*3N[^@")O``1,[P`#
M``@L;(T<3N[_"B)O``1,[P`#``@L;(T<3N[_$")O``1,[P$!``@L;(T<3N[^
ML")O``1,[P`/``@L;(T<3N[^SB)O``0@+P`(+&R-'$[N_JHB;P`$("\`""QL
MC1Q.[OZ>(F\`!"!O``@@+P`,+&R-'"\'3J[_Q"X?3G5,[P,```0L;(TP3N[_
MH"!O``0L;(TP3N[_IB!O``0L;(TP3N[_LB!O``0L;(T@3N[_RB!O``0L;(T@
M3N[_N"!O``0L;(T@3N[_-$SO`P``!"QLC2!.[O[X```#[`````4````````-
M2@``#AX```XN```.1```#G`````#`````0``#2P```X&```.^`````````/R
M```#Z@```2L`0`!``4``9``!```#>@`"$@\```````````````0`````````
M```@`$#_____``$`@``!``4`````'_\?_P```````````````````````@`!
M``$``````0```````````/_Q``L`#__M`%0`$P`#````2@``````````````
M`````#0``0```````0$```````````````Q````````!`0``````````````
M#$<```````$!```````````````,30```````0$```````````````Q6````
M```!`0``````````````#%X````````!$```````6``(`%<```#^````B@``
M``!-`````````````3(````(`%@`"`!7````_0```)X`````00``````````
M````````$`!8``@`5P```/L```"R`````$0````````````!=@``````6``(
M`%<```#^````Q@````!#```````````````````(`%@`"`!7````_0```-H`
M````3@````````````&V``````!8``@``0``#&@```#N````````````````
M`%@```!8``@``0``#'````%4``````````````UJ```-&@``#7,```T>```-
M?0``#2(```V'```-)@``#9````TJ```-FP``#2X```V@```-,@``#:@```TV
M```-L@``#3H```W"```-/@``#=(```U"```-V0``#48```W?```-2@``#>4`
M``U.```-ZP``#5(```WO```-5@``````````,#$R,S0U-C<X.6%B8V1E9@``
M`"`@("`@("`@(#`P,#`P("`@("`@("`@("`@("`@("`@D$!`0$!`0$!`0$!`
M0$!`0`P,#`P,#`P,#`Q`0$!`0$!`"0D)"0D)`0$!`0$!`0$!`0$!`0$!`0$!
M`0%`0$!`0$`*"@H*"@H"`@("`@("`@("`@("`@("`@("`D!`0$`@````````
M``````````$``````0`````````````````````!`0````$`````````````
M`````````0(````!````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M`````````````````````````````````````````!0``````^P````=````
M`0```'````"`````[@```0````$0```!(@```40```%4```!9@```8@```&8
M```!J@```<@```'8```!X````>@```'P```!^````@````((```"$````A@`
M``(@```"*````C````(X```"0````D@```)0````&``````````:````E@``
M`*H```"^````T@```.8```&F```!Q````=0```'<```!Y````>P```'T```!
M_````@0```(,```"%````AP```(D```"+````C0```(\```"1````DP`````
0```#\@```^L````!```#\AP`
`
end
!Funky!Stuff!
fi # end of overwriting check
exit 0
# End of shell archive