DIRECTORY Cubic, Complex, FitState, SafeStorage USING [ReclaimCollectibleObjects], JaM, FitJaM, FitBasic, FitStateUtils, FitIO, Real, Rope, Seq, Vector; FitEditJaM: CEDAR PROGRAM IMPORTS Complex, JaM, Real, Vector, FitState, FitJaM, FitIO, FitStateUtils, SafeStorage = { State: TYPE = JaM.State; GetVec: PROC [state: JaM.State] RETURNS [z:Complex.Vec] = { z.y _ JaM.PopReal[state]; z.x _ JaM.PopReal[state]; }; ResetSa: PROC[state: State] = {FitState.ResetData[FitJaM.defaultFitState, samples]}; StartSa: PROC[state: State] = { y: REAL _ JaM.PopReal[state]; x: REAL _ JaM.PopReal[state]; FitState.StartSamples[FitJaM.defaultFitState, x,y]; }; AddSa: PROC[state: State] = { y: REAL _ JaM.PopReal[state]; x: REAL _ JaM.PopReal[state]; FitState.AddSample[FitJaM.defaultFitState, x,y]; }; CountSa: PROC[state: State] = { n: INT _ 0; count: FitStateUtils.SampleProc = {n _ n+1}; FitStateUtils.ForAllSamples[FitJaM.defaultFitState.slist,count]; JaM.PushInt[state,n]; }; SelectSa: PROC [state: JaM.State] = { closest: FitBasic.SampleHandle; z: Complex.Vec; z.y _ JaM.PopReal[state]; z.x _ JaM.PopReal[state]; [closest,] _ FindSa[z]; IF closest#NIL THEN FitJaM.defaultFitState.slist.selectedSample _ closest; }; TheSa: PROC [state: JaM.State] = { JaM.PushReal[state,FitJaM.defaultFitState.slist.selectedSample.xy.x]; JaM.PushReal[state,FitJaM.defaultFitState.slist.selectedSample.xy.y]; }; FindSa: PROC [z: Complex.Vec] RETURNS[found: FitBasic.SampleHandle, index: NAT] = { closest,d: REAL _ 10.0E+30; i: NAT _ 0; do: FitStateUtils.SampleProc = { p: Complex.Vec _ FitIO.MagnifyPoint[s.xy]; IF ABS[p.x-z.x]k DO v: Complex.Vec _ Complex.Add[s.xy, Vector.Mul[delta, i/(k+1)]]; FitState.InsertBeforeSample[FitJaM.defaultFitState, v.x,v.y]; ENDLOOP; from _ to; }; }; FitStateUtils.ForAllSamples[slist, do]; IF closed THEN [] _ do[slist.header.next]; slist.selectedSample _ selected; }; Subrange: PROC [state: JaM.State] = {OPEN FitJaM.defaultFitState; first,last: FitBasic.SampleHandle; p0,p1: Complex.Vec; i0,i1: NAT; p1.y _ JaM.PopReal[state]; p1.x _ JaM.PopReal[state]; [last,i1] _ FindSa[p1]; p0.y _ JaM.PopReal[state]; p0.x _ JaM.PopReal[state]; [first,i0] _ FindSa[p0]; IF i0 CONTINUE]; }; FitStateUtils.ForAllLinks[FitJaM.defaultFitState.traj,do]; }; ResetCon: PROC[state: State] = {FitState.ResetData[FitJaM.defaultFitState, contour, TRUE]}; CountCon: PROC[state: State] = { JaM.PushInt[state, FitState.CountContours[FitJaM.defaultFitState]]}; AddCon: PROC[state: State] = {FitState.NewContour[FitJaM.defaultFitState]}; NextCon: PROC[state: State] = {FitState.NextContour[FitJaM.defaultFitState]}; SetSLen: PROC[state: State] = {[] _ FitState.MinDist[FitJaM.defaultFitState,JaM.PopReal[state]]}; CollectGarbage: PROC[state: State] = { SafeStorage.ReclaimCollectibleObjects[suspendMe: TRUE, traceAndSweep: TRUE]; }; Init: FitJaM.InitProc = { JaM.Register[state,".startsa", StartSa]; JaM.Register[state,".resetsa", ResetSa]; JaM.Register[state,".addsa", AddSa]; JaM.Register[state,".countsa", CountSa]; JaM.Register[state,".selectsa", SelectSa]; -- x y => . Selects a sample point for editing JaM.Register[state,".interpolatesa", InterpolateSa]; -- d => . Interpolates samples to make deltas no larger than about d JaM.Register[state,".thesa", TheSa]; -- => x y . Returns the current sample JaM.Register[state,".thetan", TheTan]; -- => x y boolean . Returns the tangent of the current sample, and whether it is a node JaM.Register[state,".deletesa", DeleteSa]; -- => . Deletes the current sample JaM.Register[state,".insertsa", InsertSa]; -- x y => . Inserts before the current sample JaM.Register[state,".insertbetween", InsertBetween]; -- x y => . Inserts between the current sample and the neighbor nearest the new point JaM.Register[state,".nodesa", NodeSa]; -- boolean => . Makes or unmakes a node JaM.Register[state,".tansa", TanSa]; -- deltax deltay => . Sets the tangent at a sample JaM.Register[state,".cuspsa", CuspSa]; -- boolean => . Makes or unmakes a cusp JaM.Register[state,".cuspnode", CuspNode]; -- boolean => . Makes or unmakes a cusp ONLY on a node JaM.Register[state,".tanoutsa", TanOutSa]; -- deltax deltay => . Sets the outgoing tangent JaM.Register[state,".homesa", HomeSa]; -- => . Selects the header JaM.Register[state,".makefirstsa", MakeFirstSa]; -- => . Selects the header JaM.Register[state,".nextsa", NextSa]; -- => x y . Moves selection to the next sample JaM.Register[state,".prevsa", PrevSa]; -- => x y . Moves selection to the previous sample JaM.Register[state,".scalesa", ScaleSa]; -- x y => . Scales/rotates all samples by multiplying by x+iy JaM.Register[state,".transa", TranSa]; -- x y => . Translates all samples by adding x+iy JaM.Register[state,".subrange", Subrange]; -- change CurrentSamples so it returns a subrange JaM.Register[state,".allsa", NoSubrange]; -- remove the subrange JaM.Register[state,".resetnodes", ResetDefaultNodes]; -- remove the nodes JaM.Register[state,".resetcusps", ResetDefaultCusps]; -- remove the cusps JaM.Register[state,".foralllinks", ForAllLinks]; JaM.Register[state,".nextcon", NextCon]; JaM.Register[state,".resetcon", ResetCon]; JaM.Register[state,".addcon", AddCon]; JaM.Register[state,".countcon", CountCon]; JaM.Register[state,".setslen", SetSLen]; JaM.Register[state,".collectgarbage", CollectGarbage]; }; FitJaM.RegisterInit[$FitEditJaM, Init]; }. ðFitEditJaM.mesa The point and link editing JaM commands Display commands are in FitIOJaM Last Edited by Maureen Stone July 3, 1984 11:33:19 am PDT Last Edited by Michael Plass December 7, 1982 10:25 am Last Edited by: Stone, November 21, 1983 11:33 am Sample Editing Commands ScaleSa: PROC [state: JaM.State] = { z: Complex.Vec _ GetVec[state]; FOR s: FitBasic.SampleHandle _ slist.header.next, s.next UNTIL s=slist.header DO p:Complex.Vec _ s.xy; s.xy _ Complex.Mul[p,z]; p _ s.tangent; s.tangent _ Complex.Mul[p,z]; ENDLOOP; }; JaM.Register[state,".cornersa", CornerSa]; -- => . moves the selected sample so it is colinear with its two left neightbors and with its two right neighbors CornerSa: PROC = {OPEN Vector; samp: SampleHandle _ IF FitJaM.defaultFitState.slist.selectedSample = IF FitJaM.defaultFitState.slist.header THEN FitJaM.defaultFitState.slist.selectedSample.next ELSE FitJaM.defaultFitState.slist.selectedSample; p: SampleHandle _ IF samp.prev = FitJaM.defaultFitState.slist.header THEN samp.prev.prev ELSE samp.prev; pp: SampleHandle _ IF p.prev = FitJaM.defaultFitState.slist.header THEN p.prev.prev ELSE p.prev; n: SampleHandle _ IF samp.next = FitJaM.defaultFitState.slist.header THEN samp.next.next ELSE samp.next; nn: SampleHandle _ IF n.next = FitJaM.defaultFitState.slist.header THEN n.next.next ELSE n.next; a: Vec _ pp.xy; b: Vec _ p.xy; c: Vec _ nn.xy; d: Vec _ n.xy; coeffMat: Matrix _ [a.y-b.y, b.x-a.x, c.y-d.y, d.x-c.x]; r: Vec _ [Det[[b.x, b.y, a.x, a.y]], Det[[d.x, d.y, c.x, c.y]]]; denom: REAL _ Det[coeffMat]; xTimesDenom: REAL _ Det[[r.x, coeffMat.a12, r.y, coeffMat.a22]]; yTimesDenom: REAL _ Det[[coeffMat.a11, r.x, coeffMat.a21, r.y]]; IF denom=0 THEN RETURN; samp.xy.x _ xTimesDenom/denom; samp.xy.y _ yTimesDenom/denom; }; ÊŸ˜Jšœ™Jšœ'™'J™ Jšœ9™9Jšœ7™7Jšœ1™1J˜šÏk ˜ J˜J˜Jšœ ˜ Jšœ œ˜.J˜J˜J˜ J˜J˜J˜J˜J˜J˜J˜—šœ œ˜JšœT˜[—J˜Jšœœ ˜šÏnœœœ˜;Jšœ˜Jšœ˜Jšœ˜—JšžœœG˜Tšžœœ˜Jšœœ˜Jšœœ˜Jšœ3˜3Jšœ˜—šžœœ˜Jšœœ˜Jšœœ˜Jšœ0˜0Jšœ˜—šžœœ˜Jšœœ˜ J˜,Jšœ@˜@J˜J˜—šžœœ˜%J˜J˜J˜Jšœ˜J˜Jšœ œœ7˜JJ˜J˜—šžœœ˜"JšœE˜EJšœE˜EJšœ˜—J˜šžœœœ&œ˜SJšœ œ ˜Jšœœ˜ šœ ˜ J˜*šœœœœ˜0šœ-˜6Jšœ"˜"Jšœ˜——J˜J˜—Jšœœ˜ Jšœ=˜=J˜J˜—šžœœœ-˜TJ˜J˜J˜J˜J˜—šžœœ˜%Jšœ.˜.J˜J˜—šžœœ˜%Jšœœ˜ J˜J˜Jšœ9˜9J˜J˜—šž œœ˜*J˜Jšœœ˜J˜JJ˜J˜˜J˜T—Jšœœ>˜Ršœ˜J˜_Jšœ>˜>J˜3J˜—J˜J˜—šžœœœ˜?J˜1Jšœœœ˜IJ˜J˜—šžœœ˜"JšœE˜E—J˜šžœœœ˜?JšœP˜P—šžœœœ˜AJšœœ3˜V—šžœœ˜%JšœD˜D—šžœœœ˜?Jšœ$˜$Jšœ˜—šž œœœ˜Dš œœœ%œ*œ˜yJ˜+J˜,J˜)J˜.J˜&J˜&J˜—J˜J˜—šžœœœ˜?J˜1šœ%˜+J˜0—J˜J˜—šžœœœ˜?J˜1šœ%˜+J˜0—J˜J˜—šžœœ˜$J˜GJ˜—šžœœ˜#J˜J˜;J˜J˜—šž œœœ˜BJšœ œœ˜2J˜7Jšœœœ˜J˜0˜ Jšœœœ˜'šœ˜J˜J˜1Jšœœ-˜4J˜šœœ œ˜!J˜?J˜=Jšœ˜ —J˜ Jšœ˜—J˜—J˜'Jšœœ˜*J˜ J˜J˜—J˜šžœœœ˜AJ˜"J˜Jšœœ˜ J˜J˜J˜J˜J˜J˜Jšœœ*œ*˜eJ˜—Jšž œœœ4œ˜dJšžœœJ˜aJšžœœJ˜aJ˜šž œœ˜#J˜šœ˜J˜!J˜!J˜!J˜!J˜!J˜!J˜!J˜!Jšœ&œ˜0Jšœ˜—J˜:J˜J˜—JšžœœFœ˜[šžœœ˜ JšœD˜D—Jšžœœ?˜KJšžœœ@˜MJ˜JšžœœT˜ašžœœ˜&Jšœ1œœ˜LJ˜J˜—J˜˜Jšœ™Jšœ(˜(Jšœ(˜(Jšœ$˜$Jšœ(˜(Jšœ+Ïc.˜YJšœ5ŸD˜yJšœ%Ÿ&˜KJšœ'ŸW˜~Jšœ+Ÿ#˜NJšœ+Ÿ-˜XJšœ5ŸU˜ŠJšœ'Ÿ'˜NJšœ%Ÿ2˜WJšœ'Ÿ'˜NJšœ+Ÿ6˜aJšœ+Ÿ/˜ZJšœ'Ÿ˜AJšœ1Ÿ˜KJšœ'Ÿ.˜UJšœ'Ÿ2˜YJšœ)Ÿ>˜gJšœ'Ÿ2˜YJšœ+Ÿ1˜\Jšœ*Ÿ˜@Jšœ6Ÿ˜IJšœ6Ÿ˜IJ˜0J˜(J˜*J˜&J˜*J˜(Jšœ6˜6J˜—J˜'J˜šžœœ™$J™šœ6œ™PJ™J™J™J™Jšœ™—J™—Jšœ+Ÿq™œšžœœœ™šœœ.™EJšœ%œ1™\Jšœ-™1—Jšœœ1œœ ™hJšœœ.œ œ™`Jšœœ1œœ ™hJšœœ.œ œ™`J™J™J™J™J™8J™@Jšœœ™Jšœ œ/™@Jšœ œ/™@Jšœ œœ™J™J™J™J™—J˜—…—&~6