<> <> <> <> DIRECTORY IO, Matrix3d, Vector3d; Spline3d: CEDAR DEFINITIONS ~ BEGIN <> RealSequence: TYPE ~ Vector3d.RealSequence; RealSequenceRep: TYPE ~ Vector3d.RealSequenceRep; Triple: TYPE ~ Vector3d.Triple; TripleSequence: TYPE ~ Vector3d.TripleSequence; TripleSequenceRep: TYPE ~ Vector3d.TripleSequenceRep; Pair: TYPE ~ Vector3d.Pair; Line: TYPE ~ Vector3d.Line; Matrix: TYPE ~ Matrix3d.Matrix; MatrixRep: TYPE ~ Matrix3d.MatrixRep; <> <> <> <<>> Coeffs: TYPE ~ Matrix; CoeffsRep: TYPE ~ Matrix3d.MatrixRep; CoeffsSequence: TYPE ~ REF CoeffsSequenceRep; CoeffsSequenceRep: TYPE ~ RECORD [ length: CARDINAL _ 0, element: SEQUENCE maxLength: CARDINAL OF Coeffs ]; Bezier: TYPE ~ RECORD [b0, b1, b2, b3: Triple]; Bspline: TYPE ~ RECORD [b0, b1, b2, b3: Triple]; Hermite: TYPE ~ RECORD [p0, p1, tan0, tan1: Triple]; Near3d: TYPE ~ RECORD [point: Triple, t, distance: REAL]; Near2d: TYPE ~ RECORD [point: Pair, t, distance: REAL]; origin: Triple ~ Vector3d.origin; <> InterpolateCyclic: PUBLIC PROC [knots: TripleSequence, tension: REAL _ 1.0] RETURNS [CoeffsSequence]; <> <> <<>> Interpolate: PROC [ knots: TripleSequence, tan0, tan1: Triple _ origin, tension: REAL _ 1.0, c: CoeffsSequence _ NIL] RETURNS [CoeffsSequence]; <> <> <> CoeffsFromBezier: PROC [b: Bezier, out: Coeffs _ NIL] RETURNS [Coeffs]; <> CoeffsFromBspline: PROC [b: Bspline, out: Coeffs _ NIL] RETURNS [Coeffs]; <> <<>> CoeffsFromHermite: PROC [h: Hermite, out: Coeffs _ NIL] RETURNS [Coeffs]; <> <<>> BezierFromCoeffs: PROC [c: Coeffs] RETURNS [Bezier]; <> <<>> BsplineFromCoeffs: PROC [c: Coeffs] RETURNS [Bspline]; <> HermiteFromCoeffs: PROC [c: Coeffs] RETURNS [Hermite]; <> <> PerPointProc: TYPE = PROC [p: Triple]; WalkBezier: PROC [b: Bezier, proc: PerPointProc, epsilon: REAL _ 0.05, doLast: BOOL _ TRUE]; <> <> <> FwdDif: PROC [in: Coeffs, nSegments: INTEGER, out: Coeffs _ NIL] RETURNS [Coeffs]; <> Samples: PROC [c: Coeffs, nPoints: NAT, points: TripleSequence _ NIL] RETURNS [TripleSequence]; <> Position: PROC [c: Coeffs, t: REAL] RETURNS [Triple]; <> Velocity: PROC [c: Coeffs, t: REAL] RETURNS [Triple]; <> Acceleration: PROC [c: Coeffs, t: REAL] RETURNS [Triple]; <> Tangent: PROC [c: Coeffs, t: REAL] RETURNS [Triple]; <> <<>> MinAcceleration: PROC [c: Coeffs] RETURNS [t: REAL]; <> <<>> CurvatureMag: PROC [c: Coeffs, t: REAL] RETURNS [REAL]; <> <<>> Curvature: PROC [c: Coeffs, t: REAL] RETURNS [Triple]; <> <<>> RefVec: PROC [c: Coeffs, t: REAL] RETURNS [Triple]; <> <<>> IsStraight: PROC [c: Coeffs, epsilon: REAL _ 0.01] RETURNS [BOOL]; <> <> <> <> Length: PROC [c: Coeffs] RETURNS [REAL]; <> ConvexHullArea: PROC [b: Bezier] RETURNS [REAL]; <> ConvexHullLength: PUBLIC PROC [b: Bezier] RETURNS [REAL]; <> <<>> FlatBezier: PROC [b: Bezier, epsilon: REAL _ 0.05] RETURNS [BOOL]; <> <> <> <> Tiny: PROC [c: Coeffs, epsilon: REAL _ 0.05] RETURNS [BOOL]; <> Resolution: PROC [c: Coeffs, epsilon: REAL] RETURNS [INTEGER]; <> <> <> InflectionPoint: PROC [c: Coeffs] RETURNS [REAL]; <> <> <<>> NearestPoint: PROC [ p: Triple, c: Coeffs, t0: REAL _ 0.0, t1: REAL _ 1.0, epsilon: REAL _ 0.01] RETURNS [Near3d]; <> <> <> <> <> <<>> PreciseNearestPoint: PUBLIC PROC [p: Triple, c: Coeffs] RETURNS [n: Near3d]; <> <<2-5 times slower than NearestPoint, depending on the position of p with respect to the curve.>> <<>> NearestPair: PROC [p: Pair, c: Coeffs, persp: BOOL _ FALSE, t0: REAL _ 0.0, t1: REAL _ 1.0] RETURNS [Near2d]; <> <> <> <<>> NearestLine: PROC [ line: Line, c: Coeffs, t0: REAL _ 0.0, t1: REAL _ 1.0, epsilon: REAL _ 0.01] RETURNS [cPt, lPt: Triple, t, dist: REAL]; <> <> <> <<>> NearestSpline: PROC [c1, c2: Coeffs, epsilon: REAL _ 0.01] RETURNS [t1, t2: REAL]; <> <> <<>> FurthestPoint: PROC [c: Coeffs] RETURNS [Near3d]; <> <> <> SplitCurve: PROC [c: Coeffs, out1, out2: Coeffs _ NIL] RETURNS [c1, c2: Coeffs]; <> SplitBezier: PROC [b: Bezier] RETURNS [b1, b2: Bezier]; <> Subdivide: PROC [c: Coeffs, t: REAL] RETURNS [c1, c2: Coeffs]; <> Reparameterize: PROC [in: Coeffs, t0, t1: REAL, out: Coeffs _ NIL] RETURNS [Coeffs]; <> <> <> CopyCoeffs: PROC [in: Coeffs, out: Coeffs _ NIL] RETURNS [Coeffs]; <> <<>> CopyCoeffsSequence: PROC [in: CoeffsSequence] RETURNS [CoeffsSequence]; <> <> GetA: PROC [c: Coeffs] RETURNS [Triple]; <> <<>> GetB: PROC [c: Coeffs] RETURNS [Triple]; <> <<>> GetC: PROC [c: Coeffs] RETURNS [Triple]; <> <<>> GetD: PROC [c: Coeffs] RETURNS [Triple]; <> <<>> Tame: PROC [in: Coeffs, out: Coeffs _ NIL] RETURNS [Coeffs]; <> Same: PROC [c1, c2: Coeffs] RETURNS [BOOL]; <> <<>> END. .. TPos: TYPE ~ RECORD [t: REAL, p: Triple]; TPosSequence: TYPE ~ REF TPosSequenceRep; TPosSequenceRep: TYPE ~ RECORD [element: SEQUENCE maxLength: NAT OF TPos]; TPosFromCoeffs: PROC [ c: Coeffs, num: NAT, t0: REAL _ 0.0, t1: REAL _ 1.0, tpos: TPosSequence _ NIL] RETURNS [TPosSequence]; <>