PK_BLENDSF_sf_t   


    struct PK_BLENDSF_sf_s
        {
        PK_GEOM_t     geom_1;       --- first supporting geometry
        PK_GEOM_t     geom_2;       --- second supporting geometry
        double        radii[2];     --- blend surface radii
        PK_CURVE_t    spine;        --- blend spine
        PK_INTERVAL_t spine_extent; --- parameter range of spine
        };
    typedef struct PK_BLENDSF_sf_s PK_BLENDSF_sf_t;



This structure is the standard form of a blendsf: a rolling ball blend surface.

Used in:

PK_BLENDSF_ask


The surface is defined by:

 - Two supporting geometries, 'geom_1' and 'geom_2', to which the blendsf is
   tangential.
 - Two 'radii' whose common magnitude is the radius of the rolling ball and
   whose algebraic sign determines on which side of each supporting surface
   the blendsf lies.
 - A 'spine' curve which is the locus of the centre of the rolling ball.
 - A 'spine_extent', which is the parameter range of the 'spine' over which
   the blendsf is defined.

'spine' is the intersection of a surface offset from 'geom_1' by radii[0] and a
surface offset from 'geom_2' by radii[1].  When a value in 'radii' is positive
then the offset is in the same direction as the surface normal ( as returned
by PK_SURF_eval_with_normal ).  When a value in 'radii' is negative, then the
offset is in the opposite direction to the surface normal.

A blendsf is parameterised as:

    R(u,v) = C(u) + rX(u)cos(va(u)) + rY(u)sin(va(u))

where:

    - C is the 'spine' curve
    - r is the magnitude of `radii[0]' and `radii[1]'
    - u has the range 'spine_extent'
    - R(u,0) and R(u,1) are the curves where the blendsf meets the supporting
      geometries.
    - X(u) is in the direction R(u,0) - C(u)
    - X(u) and Y(u) are unit vectors such that dC(u)/du, X(u) and Y(u) form
      an orthogonal set
    - a(u) is the angle subtended by points R(u,0) and R(u,1) at the spine
    - 0 <= v <= 1