CurveExtras.mesa
Michael Plass November 30, 1982 9:16 am
Maureen Stone
DIRECTORY
Cubic,
Curve,
JaMFnsDefs,
LSCurve,
LSFit,
LSPiece,
Real,
Seq,
SafeStorage,
Vector;
CurveExtras: CEDAR PROGRAM
IMPORTS Cubic, Curve, JaMFnsDefs, LSCurve, LSFit, Real, SafeStorage =
BEGIN
lsHandle: LSFit.Handle ← NIL;
lscurve: LSCurve.Handle ← NIL;
LinksFromPatches: PROC [x, y: LSFit.PatchSequence] =
BEGIN
Curve.ResetLinks[Curve.defaultHandle];
FOR i:NAT IN [0..x.length) DO
Curve.AddLink[Curve.defaultHandle, Cubic.CoeffsToBezier[[
c0: [x[i].c0, y[i].c0],
c1: [x[i].c1, y[i].c1],
c2: [x[i].c2, y[i].c2],
c3: [x[i].c3, y[i].c3]]]];
ENDLOOP;
END;
GetPoint: PROC RETURNS [v: Vector.Vec] = {
v.y ← JaMFnsDefs.GetReal[];
v.x ← JaMFnsDefs.GetReal[];
};
BezierGet: PROC = { OPEN Vector;
x,y: INTEGER ← 0;
b: Cubic.Bezier;
addSample: PROC [v: Vector.Vec] = {Curve.AddSample[Curve.defaultHandle, v.x,v.y]};
b.b3 ← GetPoint[];
b.b2 ← GetPoint[];
b.b1 ← GetPoint[];
b.b0 ← GetPoint[];
Curve.ResetSamples[Curve.defaultHandle];
Cubic.BezierPolygon[b,0.5,addSample];
};
InitialSpline: PROCEDURE =
BEGIN ENABLE Real.RealException =>
TRUSTED {JaMFnsDefs.JaMExec["(Real Exception) .print"]; CONTINUE};
nknots: INTEGER ← JaMFnsDefs.PopInteger[];
lsHandle ← LSFit.Create[Curve.CurrentSamples[Curve.defaultHandle]];
lsHandle.closedCurve ← FALSE;
LSFit.InitialKnots[lsHandle,nknots];
LSFit.InitialTValues[lsHandle];
LSFit.FitXAndY[lsHandle];
LinksFromPatches[lsHandle.xPatches, lsHandle.yPatches];
END;
InitialClosedSpline: PROCEDURE =
BEGIN ENABLE Real.RealException =>
TRUSTED {JaMFnsDefs.JaMExec["(Real Exception) .print"]; CONTINUE};
nknots: INTEGER ← JaMFnsDefs.PopInteger[];
lsHandle ← LSFit.Create[Curve.CurrentSamples[Curve.defaultHandle]];
lsHandle.closedCurve ← TRUE;
LSFit.InitialKnots[lsHandle,nknots+1];
LSFit.InitialTValues[lsHandle];
LSFit.FitXAndY[lsHandle];
LinksFromPatches[lsHandle.xPatches, lsHandle.yPatches];
END;
ImproveSpline: PROCEDURE =
BEGIN
LSFit.ImproveParametricSpline[lsHandle];
LinksFromPatches[lsHandle.xPatches, lsHandle.yPatches];
END;
Lsamples: PROC =
BEGIN
lscurve ← LSCurve.Create[Curve.CurrentSamples[Curve.defaultHandle]];
END;
Lresults: PROC =
BEGIN
x,y: LSCurve.PatchSequence;
[x:x, y:y] ← LSCurve.PatchesOf[lscurve];
LinksFromPatches[x,y];
END;
Lsmoothbasis: PROC =
BEGIN
LSCurve.SmoothBasis[lscurve,JaMFnsDefs.PopInteger[]];
END;
Lbsplinebasis: PROC =
BEGIN
LSCurve.BSplineBasis[lscurve,JaMFnsDefs.PopInteger[]];
END;
Lcubicbasis: PROC =
BEGIN
LSCurve.CubicBasis[lscurve];
END;
Lcubicpiecebasis: PROC =
BEGIN
LSCurve.CubicPieceBasis[lscurve];
END;
Lparabolabasis: PROC =
BEGIN
LSCurve.ParabolaBasis[lscurve];
END;
Lcirclebasis: PROC =
BEGIN
LSCurve.CircleBasis[lscurve];
END;
Lellipsebasis: PROC =
BEGIN
LSCurve.EllipseBasis[lscurve];
END;
Lpointslope: PROC =
BEGIN
bezier: Cubic.Bezier;
bezier.b3 ← GetPoint[];
bezier.b2 ← GetPoint[];
bezier.b1 ← GetPoint[];
bezier.b0 ← GetPoint[];
LSCurve.PointSlopeBasis[lscurve,bezier];
END;
Larclen: PROC =
BEGIN
LSCurve.ArcLengthInitialTValues[lscurve];
END;
Lunit: PROC =
BEGIN ENABLE ABORTED => GOTO Quit;
LSCurve.UnitInitialTValues[lscurve];
EXITS Quit => {}
END;
Langle: PROC =
BEGIN
LSCurve.AngleInitialTValues[lscurve];
END;
Lsolve: PROC =
BEGIN
LSCurve.SolveCurve[lscurve];
END;
Ladjust: PROC =
BEGIN
JaMFnsDefs.PushReal[LSCurve.AdjustTValues[lscurve]];
END;
Laccel: PROC =
BEGIN
r,d: REAL;
[r,d] ← LSCurve.AccelTValues[lscurve];
JaMFnsDefs.PushReal[d];
JaMFnsDefs.PushReal[r];
END;
Lfree: PROC =
BEGIN
n: INTEGER ← JaMFnsDefs.PopInteger[];
IF lscurve=NIL OR lscurve.free=NIL OR n<0 OR n>=lscurve.free.length THEN {
JaMFnsDefs.JaMExec["(bad basis function index) .print"];
RETURN};
lscurve.free[n] ← TRUE;
END;
Lfix: PROC =
BEGIN
n: INTEGER ← JaMFnsDefs.PopInteger[];
IF lscurve=NIL OR lscurve.free=NIL OR n<0 OR n>=lscurve.free.length THEN {
JaMFnsDefs.JaMExec["(bad basis function index) .print"];
RETURN};
lscurve.free[n] ← FALSE;
END;
LShowT: PROC = {
IF lscurve=NIL THEN RETURN;
FOR i:NAT IN [lscurve.l..lscurve.n] DO
Curve.DrawLine[lscurve.z[i], LSCurve.XYat[lscurve,lscurve.t[i]]];
ENDLOOP;
};
LSort: PROC = {
IF lscurve=NIL THEN RETURN;
LSFit.Sort[lscurve.t];
};
JaMFnsDefs.Register[".bezierget"L,BezierGet];
LSFit calls
JaMFnsDefs.Register[".initspline"L,InitialSpline];
JaMFnsDefs.Register[".initclosedspline"L,InitialClosedSpline];
JaMFnsDefs.Register[".improvespline"L,ImproveSpline];
LSCurve calls
JaMFnsDefs.Register[".lsamples"L,Lsamples];
JaMFnsDefs.Register[".lresults"L,Lresults];
JaMFnsDefs.Register[".lpointslope"L,Lpointslope];
JaMFnsDefs.Register[".lsmoothbasis"L,Lsmoothbasis];
JaMFnsDefs.Register[".lbsplinebasis"L,Lbsplinebasis];
JaMFnsDefs.Register[".lcubicbasis"L,Lcubicbasis];
JaMFnsDefs.Register[".lcubicpiecebasis"L,Lcubicpiecebasis];
JaMFnsDefs.Register[".lparabolabasis"L,Lparabolabasis];
JaMFnsDefs.Register[".lcirclebasis"L,Lcirclebasis];
JaMFnsDefs.Register[".lellipsebasis"L,Lellipsebasis];
JaMFnsDefs.Register[".larclen"L,Larclen];
JaMFnsDefs.Register[".lunit"L,Lunit];
JaMFnsDefs.Register[".langle"L,Langle];
JaMFnsDefs.Register[".lsolve"L,Lsolve];
JaMFnsDefs.Register[".ladjust"L,Ladjust];
JaMFnsDefs.Register[".laccel"L,Laccel];
JaMFnsDefs.Register[".lfree"L,Lfree];
JaMFnsDefs.Register[".lfix"L,Lfix];
JaMFnsDefs.Register[".lshowt"L,LShowT];
JaMFnsDefs.Register[".lsort"L,LSort];
END.