<> <> <> <> <> DIRECTORY DynFit USING [FitSegments, Segments], Filters USING [], FitBasic USING [SampleHandle], FitState USING [Handle], FitStateUtils USING [AtEnd, ForAllSamples, NextSa, PrevSa, SampleProc], Seq USING [ComplexSequence, ComplexSequenceRec, NatSequence], Vector USING [VEC]; FiltersImpl: CEDAR PROGRAM IMPORTS DynFit, FitStateUtils EXPORTS Filters = { AveFilter: PUBLIC PROC[samples: Seq.ComplexSequence, closed: BOOLEAN, skips: Seq.NatSequence _ NIL] RETURNS [Seq.ComplexSequence]= { length: NAT _ samples.length; nextSkip: NAT _ 0; prev,current,next: Vector.VEC; prev _ IF closed THEN samples[length-1] ELSE samples[0]; FOR i: NAT IN [0..length) DO current _ samples[i]; IF i=length-1 THEN {IF closed THEN next _ samples[0]} --else just leave next at end ELSE next _ samples[i+1]; IF skips#NIL AND i = skips[nextSkip] THEN IF nextSkip < skips.length-1 THEN nextSkip _ nextSkip+1 ELSE {IF closed THEN nextSkip _ 0} ELSE { samples[i].x _ (prev.x+2*current.x+next.x)/4; samples[i].y _ (prev.y+2*current.y+next.y)/4; }; prev _ current; ENDLOOP; RETURN[samples]; }; AveFilterHandle: PUBLIC PROC[handle: FitState.Handle, skipForced: BOOLEAN _ TRUE] = { <> closed: BOOLEAN _ handle.closed; prev,current,next: Vector.VEC; do: FitStateUtils.SampleProc = { current _ s.xy; next _ FitStateUtils.NextSa[handle.slist, s, closed ! FitStateUtils.AtEnd => { next _ s.xy; CONTINUE}].xy; IF NOT skipForced OR s.jointType#forced THEN { s.xy.x _ (prev.x+2*current.x+next.x)/4; s.xy.y _ (prev.y+2*current.y+next.y)/4; }; prev _ current; }; prev _ FitStateUtils.PrevSa[handle.slist, handle.slist.first, closed ! FitStateUtils.AtEnd => { prev _ handle.slist.first.xy; CONTINUE}].xy; FitStateUtils.ForAllSamples[handle.slist, do]; }; Dynfilter: PUBLIC PROCEDURE[samples: Seq.ComplexSequence, closed: BOOLEAN, tolerance: REAL] RETURNS [new: Seq.ComplexSequence, totalBadness: REAL] = { segments: DynFit.Segments; len: NAT; [segments,totalBadness] _ DynFit.FitSegments[samples, closed,tolerance]; len _ IF closed THEN segments.length-1 ELSE segments.length; --remove duplicate new _ NEW [Seq.ComplexSequenceRec[len]]; FOR i: NAT IN [0..new.length) DO new[i] _ samples[segments[i]]; ENDLOOP; RETURN[new, totalBadness]; }; }.