home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_progs
/
educ
/
splines.lzh
/
SPLINES
/
BSPLINE.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-08-16
|
4KB
|
128 lines
/* The routines in this file are copyright (c) 1987 by Helene (Lee) Taran.
* Permission is granted for use and free distribution as long as the
* original author's name is included with the code.
*/
#include "spline.h"
extern int DrawAFrame;
REAL_POINT *TickMark();
REAL_POINT *Midpoint();
/* Draw_Natural_Bspline : draws the bspline with natural ends that
* is defined by the list of <control_points>. Assumes that there
* are at least three control points.
*/
Draw_Natural_Bspline(w, control_points)
struct Window *w;
DLISTPTR control_points;
{
REAL_POINT t1, t2, t3, t4, first, last;
DLISTPTR a = FIRST(control_points);
DLISTPTR b = NEXT(a);
DLISTPTR c = NEXT(b);
first = *POINT(a);
TickMark(&t1,1,3,POINT(a),POINT(b));
TickMark(&t2,2,3,POINT(a),POINT(b));
if (DrawAFrame) DrawConstructionLine(w,POINT(a),POINT(b));
while (1) {
if (b == LAST(control_points)) {
DrawBezierArc(w,&first,&t1,&t2,POINT(b));
return;
}
TickMark(&t3,1,3,POINT(b),POINT(c));
TickMark(&t4,2,3,POINT(b),POINT(c));
TickMark(&last,1,2,&t2,&t3);
if (DrawAFrame) {
DrawConstructionLine(w,POINT(b),POINT(c));
DrawConstructionLine(w,&t2,&t3);
}
DrawBezierArc(w,&last,&t2,&t1,&first);
first = last; t1 = t3; t2 = t4; a = b; b = c; c = NEXT(c);
}
}
/* Draw_TripleKnot_Bspline : draws the bspline with triple knots at the ends
* defined by the list of <control_points>. Assumes that there
* are at least four control points.
*/
Draw_TripleKnot_Bspline(w, control_points)
struct Window *w;
DLISTPTR control_points;
{
REAL_POINT t1, t2, t3, t4, first, last;
DLISTPTR a = FIRST(control_points);
DLISTPTR b = NEXT(a);
DLISTPTR c = NEXT(b);
DLISTPTR d = NEXT(c);
if (DrawAFrame) DrawConstructionLine(w,POINT(a),POINT(b));
first = *POINT(a);
t1 = *POINT(b);
if (LENGTH(control_points) == 4) t2 = *POINT(c);
else TickMark(&t2,1,2,POINT(b),POINT(c));
while (1) {
if (d == LAST(control_points)) { /* draw the last arc */
if (DrawAFrame) {
DrawConstructionLine(w,POINT(b),POINT(c));
DrawConstructionLine(w,POINT(c),POINT(d));
}
DrawBezierArc(w,&first,&t1,&t2,POINT(d));
return;
}
if (d == PREVIOUS(LAST(control_points))) {
TickMark(&t3,1,2,POINT(c),POINT(d));
t4 = *POINT(d);
} else {
TickMark(&t3,1,3,POINT(c),POINT(d));
TickMark(&t4,2,3,POINT(c),POINT(d));
}
TickMark(&last,1,2,&t2,&t3);
if (DrawAFrame) {
DrawConstructionLine(w,POINT(b),POINT(c));
DrawConstructionLine(w,&t2,&t3);
}
DrawBezierArc(w,&last,&t2,&t1,&first);
first = last; t1 = t3; t2 = t4; a = b; b = c; c = d; d = NEXT(d);
}
}
/* Draw_Closed_Bspline : draws the closed bspline that
* is defined by the list of <control_points>. Assumes that there
* are at least three control points.
*/
Draw_Closed_Bspline(w, control_points)
struct Window *w;
DLISTPTR control_points;
{
REAL_POINT t1, t2, t3, t4, first, last;
DLISTPTR a = FIRST(control_points);
DLISTPTR b = NEXT(a);
DLISTPTR c = NEXT(b);
TickMark(&t1,2,3,POINT(LAST(control_points)),POINT(a));
TickMark(&t2,1,3,POINT(a),POINT(b));
TickMark(&first,1,2,&t1,&t2);
if (DrawAFrame) DrawConstructionLine(w,POINT(a),POINT(b));
do {
if (b == LAST(control_points)) c = FIRST(control_points);
TickMark(&t3,2,3,POINT(a),POINT(b));
TickMark(&t4,1,3,POINT(b),POINT(c));
TickMark(&last,1,2,&t3,&t4);
if (DrawAFrame) {
DrawConstructionLine(w,POINT(b),POINT(c));
DrawConstructionLine(w,&t3,&t4);
}
DrawBezierArc(w,&first,&t2,&t3,&last);
first = last; t1 = t3; t2 = t4; a = b; b = c; c = NEXT(c);
} while (a != FIRST(control_points));
}