DIRECTORY Complex, Cubic, LSPiece, Seq, Vector, LSSpline; LSSplineImpl: CEDAR PROGRAM IMPORTS LSPiece EXPORTS LSSpline = BEGIN Handle: TYPE = LSSpline.Handle; Rec: TYPE = LSSpline.Rec; Create: PUBLIC PROCEDURE [lengthHint: NAT _ 10] RETURNS [handle: Handle] = { handle _ NEW[Rec]; handle.z _ NEW[Seq.ComplexSequenceRec[lengthHint]]; handle.tan _ NEW[Seq.ComplexSequenceRec[lengthHint]]; handle.t _ NEW[Seq.RealSequenceRec[lengthHint]]; handle.length _ 0; }; Reset: PUBLIC PROCEDURE [handle: Handle] = {handle.length _ 0}; Sample: PUBLIC PROCEDURE [handle: Handle, samplePoint, tangent: Complex.Vec _ [0,0]] = { WHILE handle.length >= handle.z.length DO temp: Handle _ Create[handle.length + handle.length/2 + 1]; FOR i:NAT IN [0..handle.length) DO Sample[temp, handle.z[i], handle.tan[i]]; ENDLOOP; handle^ _ temp^; ENDLOOP; handle.z[handle.length] _ samplePoint; handle.tan[handle.length] _ tangent; handle.length _ handle.length + 1; }; CubicProc: TYPE = PROCEDURE [Cubic.Bezier]; Subdivide: PUBLIC PROCEDURE [handle: Handle, cubicProc: CubicProc, tolerance: REAL, from: NAT _ 0, thru: NAT _ LAST[NAT]] = { b: Cubic.Bezier; err: REAL; iterations: NAT; maxDev: REAL; IF handle.length = 0 THEN RETURN; thru _ MIN[thru, handle.length - 1]; IF from >= thru THEN RETURN; IF thru = from+1 THEN { b0: Vector.Vec _ handle.z[from]; b3: Vector.Vec _ handle.z[thru]; cubicProc[[b0, b0, b3, b3]]; RETURN; }; [b, err, iterations, maxDev] _ LSPiece.FitPiece[ z: handle.z, t: handle.t, from: from, thru: thru, maxd: tolerance, maxit: firstTryIterationLimit, initTangent: handle.tan[from], finalTangent: handle.tan[thru] ]; stats.firstTryCount _ stats.firstTryCount + 1; stats.firstTryIterations _ stats.firstTryIterations + iterations; IF maxDev <= tolerance*firstTryToleranceFactor THEN { [b, err, iterations, maxDev] _ LSPiece.FitPiece[ z: handle.z, t: handle.t, from: from, thru: thru, maxd: tolerance/secondTryOptimistFactor, maxit: secondTryIterationLimit, initTangent: handle.tan[from], finalTangent: handle.tan[thru], useOldTValues: TRUE ]; stats.secondTryCount _ stats.secondTryCount + 1; stats.secondTryIterations _ stats.secondTryIterations + iterations; }; IF maxDev <= tolerance THEN cubicProc[b] ELSE { mid: NAT _ (from+thru)/2; Subdivide[handle, cubicProc, tolerance, from, mid]; Subdivide[handle, cubicProc, tolerance, mid, thru]; }; }; firstTryIterationLimit: NAT _ 3; firstTryToleranceFactor: REAL _ 3.0; secondTryIterationLimit: NAT _ 20; secondTryOptimistFactor: REAL _ 2.0; stats: RECORD [ firstTryCount: INT _ 0, firstTryIterations: INT _ 0, secondTryCount: INT _ 0, secondTryIterations: INT _ 0 ]; END. NLSSplineImpl.mesa last edited by Michael Plass August 4, 1982 10:19 am Ęđ˜Jšœ™Jšœ5™5J˜JšĎk œ0˜9J˜Jš œœœœ œ ˜>Jš˜J˜Jšœœ˜Jšœœ˜J˜š Ďnœœ œœœ˜LJšœ œ˜Jšœ œ%˜3Jšœ œ%˜5Jšœ œ"˜0J˜J˜J˜—Jšžœœ œ(˜?J˜šžœœ œ@˜Xšœ"˜)J˜;šœœœ˜"J˜)Jšœ˜—J˜Jšœ˜—J˜&J˜$J˜"J˜J˜—Jšž œœ œ˜+J˜šž œœ œ3œœ œœœ˜}J˜Jšœœ˜ Jšœ œ˜Jšœœ˜ Jšœœœ˜!Jšœœ˜$Jšœœœ˜šœœ˜J˜ J˜ J˜Jšœ˜J˜—˜0J˜ J˜ J˜ J˜ J˜J˜J˜J˜J˜—J˜.J˜Ašœ-œ˜5˜0J˜ J˜ J˜ J˜ J˜(J˜J˜J˜Jšœ˜J˜—J˜0J˜CJ˜—Jšœœ ˜(šœ˜Jšœœ˜J˜3J˜3J˜—J˜J˜—Jšœœ˜ Jšœœ˜$Jšœœ˜"Jšœœ˜$J˜šœœ˜Jšœœ˜Jšœœ˜Jšœœ˜Jšœœ˜J˜J˜—Jšœ˜J˜J˜—…— F „