POV-Ray : Newsgroups : povray.binaries.images : Is there a spline solution out there? : Re: Is there a spline solution out there? Server Time
1 Oct 2024 15:24:03 EDT (-0400)
  Re: Is there a spline solution out there?  
From: Greg M  Johnson
Date: 11 Aug 2000 09:24:43
Message: <3993FD6E.C2FD0D1F@my-dejanews.com>
Thanks, but I want it to work WITHIN pov. It's the angle of rotation of a knee in a
walk cycle.  This is come kind of "C" code, no?

Ben Birdsey wrote:

>         There are a whole lotta representations for splines.  It is pretty hard
> to make a suggestion, since I don't know what you want your spline to
> look like.
>
>         So, let me suggest a beta-spline.  This is a cubic spline, but two of
> the end matching conditions are relaxed to give you two more parameters
> to tweak (skewness and tension).  This can give you all sorts of cool
> effects including "sharp" corners id you turn up the tension at a node.
>
>         If you're up to it, you could probably convert this C-code to POV, but
> I'm not sure if this'll compile without errors as is.
>
>         Good luck on finding your spline solution!
>
>         In Him,
>         Ben
>
> /* C-code follows */
>
> float BernsteinP3(int order, float u)  {
>
>         float rv;
>
>         if(order>3 || order<0) return -HUGEVAL; /* return an error */
>
>         switch(order) {
>                 case 0:
>                         rv = (1-u)*(1-u)*(1-u);
>                         break;
>                 case 1:
>                         rv = 3*u*(1-u)*(1-u);
>                         break;
>                 case 2:
>                         rv = 3*u*u*(1-u);
>                         break;
>                 case 3:
>                         rv = u*u*u;
>         };
>
>         return rv;
> }
>
> float BetaP(int order, float s, float t, float u)  {
>
>         float rv;
>         float delta = 2*s*s*s + 4*s*s + 4*s + t + 2;
>
>         if(order>1 || order<-2) return -HUGEVAL; /* return an error */
>
>         switch(order) {
>                 case -2:
>                         rv = 12./d * s*s*s * BernsteinP3(0.,u);
>                         break;
>                 case -1:
>                         rv =
>                                 2.*s*(s+1.)/d*(
>                                         2.*BernsteinP3(0,u) +
>                                         (1.+s)*BernsteinP3(1,u) +
>                                         s*BernsteinP3(2,u) +
>                                         s*s*BernsteinP3(3,u)
>                                 ) +
>                                 t/d*(BernsteinP3(0,u) + BernsteinP3(1,u));
>                         break;
>                 case 0:
>                         rv =
>                                 2./d*(
>                                         BernsteinP3(0,u) +
>                                         (1+s)*BernsteinP3(1,u) +
>                                         (1+s)*(1+s)*BernsteinP3(2,u) +
>                                         2*s*(1+s)*BernsteinP3(3,u)
>                                 ) +
>                                 t/d*(BernsteinP3(2,u) + BernsteinP3(3,u));
>                         break;
>                 case 1:
>                         rv = 2./d * BernsteinP3(3,u);
>         };
>
>         return rv;
> }
>
> float BetaSpline( float control_point[], int i, float s[], float t[],
> float u ) {
>         float rv;
>         int j;
>
>         if( u<0. || u>1.) return -HUGEVAL; /* return an error */
>
>         /* the array must be defined to be as large as MAXVAL, or you might get
> an error */
>         for(j=-2, rv=0; j<2; j++)
>                 if(i+j>=0 && i+j <MAXVAL)
>                         rv += control_point[i+j] * BetaP(j, s[i], t[i], u);
>
>         return rv;
>
> }
>
> /* end C-code */


Post a reply to this message

Copyright 2003-2023 Persistence of Vision Raytracer Pty. Ltd.