🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: comp.lang.postscript
Article #1620

splines

#1620
From: Tomas G. Rokicki
Date: Wed, 24 Jan 1990 03:55
67 lines
2950 bytes
> I recently had a conversation with a very mathematically oriented freind in 
> California, in which he mentioned that it would be possible to evaluate a 
> Bezier spline with *NO* multiplies using a "diffrence table"

Howdy, Woody.

There are a number of ways to do splines without multiplies or floating
point.  The simplest is the recursive subdivision trick that's most
commonly used; sample code is appended.  Forward differencing also
works (and is mathematically equivalent for certain interval sizes,
but without the call overhead of the recursive subdivision.)

Standard graphics texts illustrate these procedures; I believe Foley
and van Dam (I'm sure I've butchered the name; I'll look it up when I
get in to school tomorrow.)

The advantage of the recursive subdivision method is you can compute
and check the flatness of the curve at any point.  Note that the
shifts in the following code can be eliminated (actually done up
front), since the splines are always drawn at the same depth, but
since X is so slow anyway, the performance difference is negligible.
(Why doesn't X have a spline primitive?)

It is also possible to use general conics as the decomposition primitive
rather than lines; there are Siggraph papers on this . . .

XPoint splinepoints[2000], *spp ;
void rdrawspline(x1, y1, x2, y2, x3, y3, x4, y4, l)
long x1, y1, x2, y2, x3, y3, x4, y4 ;
int l ;
{
   long x12, x23, x34, x123, x234, x1234 ;
   long y12, y23, y34, y123, y234, y1234 ;

   if (l < 5) {
      x12 = (x1 + x2) >> 1 ;
      x23 = (x2 + x3) >> 1 ;
      x34 = (x3 + x4) >> 1 ;
      x123 = (x12 + x23) >> 1 ;
      x234 = (x23 + x34) >> 1 ;
      x1234 = (x123 + x234) >> 1 ;
      y12 = (y1 + y2) >> 1 ;
      y23 = (y2 + y3) >> 1 ;
      y34 = (y3 + y4) >> 1 ;
      y123 = (y12 + y23) >> 1 ;
      y234 = (y23 + y34) >> 1 ;
      y1234 = (y123 + y234) >> 1 ;
      rdrawspline(x1, y1, x12, y12, x123, y123, x1234, y1234, l+1) ;
      rdrawspline(x1234, y1234, x234, y234, x34, y34, x4, y4, l+1) ;
   } else {
      spp->x = x4 >> 8 ;
      spp->y = y4 >> 8 ;
      spp++ ;
   }
}
void drawspline(x1, y1, x2, y2, x3, y3, x4, y4) /* crude hack for now */
long x1, y1, x2, y2, x3, y3, x4, y4 ;
{
   spp = splinepoints ;
   spp->x = x1 ;
   spp->y = y1 ;
   spp++ ;
   rdrawspline(x1<<8, y1<<8, x2<<8, y2<<8, x3<<8, y3<<8, x4<<8, y4<<8, 0) ;
   XDrawLines(display, windowId, gc, splinepoints, spp-splinepoints,
                                                          CoordModeOrigin) ;
   Move(x4, y4) ;
}
Technical Details
Message-ID: <1990Jan24.035540.1182@Neon.Stanford.EDU>
Path: arc1-ca.pugleaf.net!utzoo!utgpu!jarvis.csri.toronto.edu!cs.utexas.edu!tut.cis.ohio-state.edu!purdue!decwrl!shelby!neon!rokicki

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!utgpu!jarvis.csri.toronto.edu!cs.utexas.edu!tut.cis.ohio-state.edu!purdue!decwrl!shelby!neon!rokicki
From: rokicki@Neon.Stanford.EDU (Tomas G. Rokicki)
Newsgroups: comp.lang.postscript
Subject: splines
Message-ID: <1990Jan24.035540.1182@Neon.Stanford.EDU>
Date: 24 Jan 90 03:55:40 GMT
Organization: Computer Science Department, Stanford University
Lines: 67