[comp.sys.amiga] B-SPLINE scratch pad

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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
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