# Continuity

## Continuity in ACIS

Continuity is a measure of the smoothness of a curve or surface. Parametric continuity, denoted by Cn, describes the maximum derivative of a curve or surface's parametric equation that is continuous. For example, if a curve's equation is continuous over the range of the curve, the curve is said to be positionally continuous or C0. If in addition, the first derivative of the curve's equation is continuous over the range of the curve, the curve is said to be tangentially continuous or C1. If in addition, the second derivative of the curve's equation is continuous over the range of the curve, the curve is C2. C2 curves have a continuous radius of curvature. Geometric continuity, denoted by Gn, is a geometric property describing the smoothness of a curve or surface that is independent of parameterization. A G0 curve or surface is positionally continuous. A G1 curve or surface has continuous tangent directions, although the magnitude of tangent vectors may not be continuous. (The magnitude of tangent vectors depends on the parameterization.) A G2 curve has a continuous radius of curvature. In general, the higher the order of continuity, the smoother the curve or surface.

A non-G0 discontinuity is a jump in position, a non-G1 discontinuity is a jump in unit normal direction, and a non-G2 discontinuity is a jump in curvature. Non-Gn discontinuities are purely geometric. A non-Cn discontinuity can be a jump in only the magnitude of the nth derivative, but need not be a jump in direction; for example, a non-C1 discontinuity can be a jump in speed. Non-Cn discontinuities can be purely parametric. Sided evaluations are often required near discontinuities.

A bi-cubic b-spline surface is depicted in Figure. A G2 Surface. (For simplicity, this surface is linear in one direction.) This surface is C3, except at its knots, where it is only C2. Regardless of how it is parameterized, this surface will always have points where it is only G2. The surface in Figure. A Surface with a Non-G2 Discontinuity is a NURBS surface constructed of two cylindrical portions. (A NURBS surface can precisely represent a portion of a cylinder.) These two cylindrical portions have different radii, but are joined tangentially; therefore, this surface is only G1 along the iso-parameter line where the two cylindrical portions are joined. (The principal curvatures are constant on each side of the discontinuity, but there is a sudden jump in the maximum principal curvature as one crosses the discontinuity.) The surface in Figure. A Surface with a Non-G1 Discontinuity is somewhat similar: it is constructed of two cylindrical portions that have the same radii, but the two portions are not joined tangentially. This surface is only G0 along the iso-parameter line where the two cylindrical portions are joined. The final figure, Figure. A Surface with a Non-G0 Discontinuity, depicts a surface that is not G0. This surface has a gap in it and is illegal in ACIS.

 A G2 Surface A Surface with a Non-G2 Discontinuity A Surface with a Non-G1 Discontinuity A Surface with a Non-G0 Discontinuity

A non-G1 discontinuity is problematic because point-perp is not defined near the discontinuity, nor is offsetting. While it is possible to have ACIS curves and surfaces with non-G1 discontinuities, it is strongly discouraged. Higher-level ACIS geometric operators (such as Blending, Booleans, and Offsetting) may not reliably operate on non-G1 geometry. Curves and surfaces should be split at non-G1 discontinuities whenever possible. Use api_split_edge_at_disc or api_split_face_at_disc, as needed.

Curves and surfaces with non-G0 discontinuities are not permitted in ACIS. More precisely, intcurves and splines with non-G0 discontinuities are not permitted. The analytic curves and surfaces in ACIS do not have discontinuities.

## Curve Discontinuity Marking

ACIS marks non-Gn discontinuities on intcurves. In addition, non-Cn discontinuities are marked on intcurves that are based on par_int_curs.

Discontinuities are stored in each intcurve and can be interrogated using the functions given below. Note that the second method is non-const, but the others are const. Non-G1, non-G2 and non-G3 discontinuities are usually stored. Although the functions below are member functions of the curve class, in practice, only intcurves can have discontinuities.

const double* curve::discontinuities(int& n, int order) const
const double* curve::all_discontinuities(int& n, int order)
int curve::discontinuous_at(double t) const
Returns the order of the discontinuity at t (or zero, if no discontinuity exists at the given parameter value).

## Surface Discontinuity Marking

ACIS marks something in between non-Gn and non-Cn discontinuities on spline surfaces - it marks non-Gn discontinuities of iso-parameter lines. Note that for surfaces, non-Gn discontinuities are jumps in the unit normal and its derivatives with respect to arc length. These are purely geometric quantities. The jumps ACIS measures may be purely parametric. An example is a geometrically planar B-spline surface with a non-G1 kink in its iso-parameter lines. The surface is Gn for all n because it is planar, but ACIS would mark the kink as an order-one discontinuity. Such a surface is depicted in the figure below.

A Planar Surface with a Non-G1 Discontinuity in Its Iso-parameter Lines

Discontinuities are stored in a spline surface and can be interrogated using the functions given below. Note that the third and fourth methods are non-const, but the others are const. Non-G1, non-G2 and non-G3 discontinuities are usually stored. Although the functions below are member functions of the surface class, in practice, only splines can have discontinuities.

const double* surface::discontinuities_u(int& n, int order) const
const double* surface::discontinuities_v(int& n, int order) const
const double* surface::all_discontinuities_u(int& n, int order)
Provides read-only access to the array of discontinuities in the u-direction of up to the supplied order.
const double* surface::all_discontinuities_v(int& n, int order)
Provides read-only access to the array of discontinuities in the v-direction of up to the supplied order.
int surface::discontinuous_at_u(double u) const
Returns the order of discontinuity at u (or zero, if no discontinuity exists at the given parameter value).
int surface::discontinuous_at_v(double v) const
Returns the order of discontinuity at v (or zero, if no discontinuity exists at the given parameter value).