PK_BCURVE_splinewise_sf_t   


struct PK_BCURVE_splinewise_sf_s
    {
    int                   degree;           --- The degree = order-1.
    int                   n_positions;      --- The number of positions
    PK_VECTOR_t          *positions;        --- The positions
    PK_PARAM_end_t        t_end;            --- End condition at lower t
    PK_PARAM_end_t        T_end;            --- End condition at upper T
    PK_VECTOR_t           t_deriv;          --- Derivative at lower t
    PK_VECTOR_t           T_deriv;          --- Derivative at upper T
    PK_PARAM_knot_t       how_knot;         --- How knot vector defined
    double               *knot;             --- Knot vector
    };
typedef struct PK_BCURVE_splinewise_sf_s PK_BCURVE_splinewise_sf_t;


This data structure is the splinewise standard form of a 3D b-curve.


Specific Errors:
    PK_ERROR_incompatible_props     only one end is periodic or a periodic
                                    curve has coincident end points.
    PK_ERROR_bad_derivative         t_deriv or T_deriv too large
    PK_ERROR_insufficient_points    not enough spline points
    PK_ERROR_coincident_points      repeated spline points
    PK_ERROR_bad_position           a spline point is outside size box
    PK_ERROR_bad_knots              bad parameterisation
    PK_ERROR_repeated_knots         repeated knots
    PK_ERROR_wrong_number_knots     wrong number of knots
    PK_ERROR_bad_order              degree < 0 or degree > 3 or
                                    degree < 2 and supplied clamping vectors
                                    are incorrect


degree         curve degree.  When the standard form is input to
                 Parasolid (PK_BCURVE_create_splinewise), degree may only be
                 set to 3 to produce cubic curves or 0 in which case
                 Parasolid will select an appropriate degree.

n_positions    number of positions.
                 If t_end is PK_PARAM_end_periodic_c then n_positions
                 must be at least 3, otherwise 'n_positions' must be at
                 least 2.

positions      array of positions.
                 Consecutive positions must not coincide.
                 For a closed, non-periodic curve the start and end
                 positions must coincide.
                 For a periodic curve the start and end positions must not
                 coincide.

t_end          end condition at lower t (ie start of curve)
                 If this is PK_PARAM_end_periodic_c then T_end must also be
                 PK_PARAM_end_periodic_c.
                 If this is PK_PARAM_end_clamped_vector_c then t_deriv must
                 be set to the start derivative.

T_end          end condition at upper T (ie end of curve)
                 If this is PK_PARAM_end_periodic_c then t_end must also be
                 PK_PARAM_end_periodic_c.
                 If this is PK_PARAM_end_clamped_vector_c then T_deriv
                 must be set to the end derivative.

't_deriv'        derivative at start of curve if t_end is
                 PK_PARAM_end_clamped_vector_c

'T_deriv'        derivative at end of curve if T_end is
                 PK_PARAM_end_clamped_vector_c

how_knot       how the knot vector is defined

knot           if how_knot is PK_PARAM_knot_defined_c then knot is the
                 knot vector of length n_positions if the curve is not
                 periodic or n_positions + 1 if the curve is periodic.