<<>> <> <> <> DIRECTORY G3dBasic, G3dMatrix, G3dSpline, IO, Rope; G3dCurve: CEDAR DEFINITIONS ~ BEGIN <> <> <> Error: SIGNAL [code: ATOM, reason: ROPE ¬ NIL]; -- able to resume this error <> Triple: TYPE ~ G3dBasic.Triple; RealSequence: TYPE ~ G3dBasic.RealSequence; Matrix: TYPE ~ G3dMatrix.Matrix; Spline: TYPE ~ G3dSpline.Spline; SplineSequence: TYPE ~ G3dSpline.SplineSequence; STREAM: TYPE ~ IO.STREAM; ROPE: TYPE ~ Rope.ROPE; <> Curve: TYPE ~ REF CurveRep; CurveRep: TYPE ~ RECORD [ length: CARDINAL ¬ 0, totalLength: REAL ¬ 0.0, element: SEQUENCE maxLength: CARDINAL OF Section ]; Section: TYPE ~ RECORD [ spline: Spline ¬ NIL, -- cubic coefficients of this section accumLength: REAL ¬ 0.0, -- total length of curve up to this section length: REAL ¬ 0.0, -- approximate length of this section fragments: Fragments ¬ NIL -- res number of pieces of this section ]; Fragment: TYPE ~ RECORD [ t0: REAL ¬ 0.0, -- parametric start of this fragment t1: REAL ¬ 0.0, -- parametric end of this fragment dt: REAL ¬ 0.0, -- parametric difference length: REAL ¬ 0.0, -- approximate length of this fragment accumLength: REAL ¬ 0.0]; -- total length of curve up to this fragment Fragments: TYPE ~ REF FragmentsRep; FragmentsRep: TYPE ~ RECORD [s: SEQUENCE length: CARDINAL OF Fragment]; Spot: TYPE ~ RECORD [ spline: Spline ¬ NIL, -- a cubic spline section t: REAL ¬ 0.0 -- parametric position within spline ]; CurveSequence: TYPE ~ REF CurveSequenceRep; CurveSequenceRep: TYPE ~ RECORD [ length: CARDINAL ¬ 0, element: SEQUENCE maxLength: CARDINAL OF Curve ]; <> CurveFromSplines: PROC [splines: SplineSequence, res: NAT ¬ 100] RETURNS [Curve]; <> <> <> Transform: PROC [curve: Curve, matrix: Matrix]; <> <> SpotFromT: PROC [c: Curve, t: REAL] RETURNS [Spot]; <> <<>> SpotFromArcLength: PROC [c: Curve, arcLength: REAL] RETURNS [Spot]; <> <<>> ArcLengthFromT: PROC [c: Curve, t: REAL] RETURNS [REAL]; <> ArcLengthFromTs: PROC [c: Curve, t0, t1: REAL] RETURNS [REAL]; <> <> <> <> <<>> PositionT: PROC [c: Curve, t: REAL] RETURNS [Triple]; <> VelocityT: PROC [c: Curve, t: REAL] RETURNS [Triple]; <> AccelerationT: PROC [c: Curve, t: REAL] RETURNS [Triple]; <> CurvatureT: PROC [c: Curve, t: REAL] RETURNS [Triple]; <> <<>> CurvatureMagT: PROC [c: Curve, t: REAL] RETURNS [REAL]; <> <> <> <> <<>> PositionA: PROC [c: Curve, arcLength: REAL] RETURNS [Triple]; <> VelocityA: PROC [c: Curve, arcLength: REAL] RETURNS [Triple]; <> AccelerationA: PROC [c: Curve, arcLength: REAL] RETURNS [Triple]; <> CurvatureA: PROC [c: Curve, arcLength: REAL] RETURNS [Triple]; <> <<>> CurvatureMagA: PROC [c: Curve, arcLength: REAL] RETURNS [REAL]; <> <> Write: PROC [out: STREAM, c: Curve, name: ROPE ¬ NIL]; < splines:" to the output stream, followed by each spline in c.>> <> <<>> Read: PROC [in: STREAM] RETURNS [Curve]; <> <> <> <> CopyCurveSequence: PUBLIC PROC [curves: CurveSequence] RETURNS [CurveSequence]; <> <<>> AddToCurveSequence: PUBLIC PROC [curves: CurveSequence, curve: Curve] RETURNS [CurveSequence]; <> <<>> LengthenCurveSequence: PUBLIC PROC [curves: CurveSequence, amount: REAL ¬ 1.3] RETURNS [new: CurveSequence]; <> <<>> END.