struct PK_CONE_sf_s { PK_AXIS2_sf_t basis_set; --- a point, reference direction and an axis double radius; --- the radius of a circle on the cone(>=0) double semi_angle; --- the half angle of the cone in radians }; typedef struct PK_CONE_sf_s PK_CONE_sf_t; Specific Errors: PK_ERROR_radius_lt_0 The radius for the cone was less than zero PK_ERROR_bad_angle The semi-angle was not strictly between 0 and PI/2 The half cone represented by this data structure passes through the circle with centre `basis_set.location', axis `basis_set.axis' and radius as radius. The direction of the axis will be the direction of increasing circle radius (i.e pointing away from the apex in the infinite direction of the cone). The semi_angle defines the angle between the axis and any line on the surface of the cone. This is slightly different to the handling of cones in the KI. See documentation for PK_AXIS2_sf_t. The parameterisation of a cone is as follows: P = basis_set.location x = basis_set.ref_direction y = basis_set.axis X basis_set.ref_direction ( cross product ) z = basis_set.axis R = radius w = semi_angle S(u, v) = P + ( R + v(tan w) )((cos u)x + (sin u)y) + vz ( 0 <= u < 2PI , -r(cot w) <= v < infinity ) Where as in the STEP definition of a cone, the v parameter is in the range minus infinity to plus infinity, hence including two half cones sharing a common apex, only one of the two half cones is represented by this data structure.