-- FilterImpl.mesa -- Last modified by Maureen Stone July 16, 1982 5:35 pm -- Last modified by Michael Plass August 20, 1982 2:55 pm DIRECTORY Curve, DynFit, Vector, Seq, JaMFnsDefs; FilterImpl: PROGRAM IMPORTS JaMFnsDefs, DynFit, Curve = { AveFilter: PROC = { samples: Seq.ComplexSequence ← Curve.CurrentSamples[Curve.defaultHandle]; double: BOOLEAN; length: NAT; prev,current,next: Vector.Vec; IF samples=NIL THEN RETURN; double ← samples[0]=samples[samples.length-1]; length ← samples.length; IF double THEN length ← length-1; prev ← samples[length-1]; FOR i: NAT IN [0..length) DO current ← samples[i]; next ← IF i=length-1 THEN samples[0] ELSE samples[i+1]; 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; Curve.StartSamples[Curve.defaultHandle, samples[0].x,samples[0].y]; FOR i: NAT IN [1..length) DO Curve.AddSample[Curve.defaultHandle, samples[i].x,samples[i].y]; ENDLOOP; IF double THEN Curve.AddSample[Curve.defaultHandle, samples[0].x,samples[0].y]; }; AveFilterLeavingCorners: PROC = { samples: Seq.ComplexSequence ← Curve.CurrentSamples[Curve.defaultHandle]; node: Seq.NatSequence; tangent: Seq.ComplexSequence; double: BOOLEAN; length: NAT; nextNode: NAT ← 0; prev,current,next: Vector.Vec; [node, tangent] ← Curve.CurrentNodes[Curve.defaultHandle]; IF samples=NIL THEN RETURN; double ← samples[0]=samples[samples.length-1]; length ← samples.length; IF double THEN length ← length-1; prev ← samples[length-1]; FOR i: NAT IN [0..length) DO current ← samples[i]; next ← IF i=length-1 THEN samples[0] ELSE samples[i+1]; IF NOT (i = node[nextNode] AND tangent[nextNode] = [0,0]) THEN { samples[i].x ← (prev.x+2*current.x+next.x)/4; samples[i].y ← (prev.y+2*current.y+next.y)/4; }; IF i = node[nextNode] THEN nextNode ← nextNode+1; prev ← current; ENDLOOP; Curve.StartSamples[Curve.defaultHandle, samples[0].x,samples[0].y]; FOR i: NAT IN [1..length) DO Curve.AddSample[Curve.defaultHandle, samples[i].x,samples[i].y]; ENDLOOP; IF double THEN Curve.AddSample[Curve.defaultHandle, samples[0].x,samples[0].y]; Curve.ResetNodes[Curve.defaultHandle]; FOR i: NAT IN [0..node.length) DO Curve.AddNode[Curve.defaultHandle, node[i], tangent[i]] ENDLOOP; }; Dynfilter: PROCEDURE = { tolerance: REAL = JaMFnsDefs.GetReal[]; totalBadness: REAL ← 0; segments: DynFit.Segments; newZ: Seq.ComplexSequence; len: NAT; sList: Seq.ComplexSequence ← Curve.CurrentSamples[Curve.defaultHandle]; IF sList=NIL THEN RETURN; [segments,totalBadness] ← DynFit.FitSegments[sList,tolerance]; [newZ,len] ← DynFit.SampleSegments[segments,sList]; Curve.StartSamples[Curve.defaultHandle, newZ[0].x,newZ[0].y]; FOR i:NAT IN [1..len) DO Curve.AddSample[Curve.defaultHandle, newZ[i].x,newZ[i].y] ENDLOOP; }; JaMFnsDefs.Register[".dfsa"L,Dynfilter]; JaMFnsDefs.Register[".afsa"L,AveFilter]; JaMFnsDefs.Register[".filterbetweencorners"L,AveFilterLeavingCorners]; }.