-- LSSplineCmds.mesa
--last edited by Michael Plass  August 12, 1982 1:22 pm

DIRECTORY Cubic, Complex, LSSpline, Curve, JaMFnsDefs, Seq;

LSSplineCmds: PROGRAM IMPORTS Complex, LSSpline, Curve, JaMFnsDefs =
BEGIN

lsSpline: LSSpline.Handle ← LSSpline.Create[];

Subdivide: PROC = {
	tolerance: REAL ← JaMFnsDefs.GetReal[];
	cubicProc: PROC[b: Cubic.Bezier] = {Curve.AddLink[Curve.defaultHandle, b]};
	currentSamples: Seq.ComplexSequence ← Curve.CurrentSamples[Curve.defaultHandle];
	closed: BOOLEAN ← (currentSamples[0] = currentSamples[currentSamples.length-1]);
	lsSpline.Reset[];
	Curve.ResetLinks[Curve.defaultHandle];
	FOR i: NAT IN [0..currentSamples.length) DO
		tangent: Complex.Vec ← [0,0];
		IF i IN (0..currentSamples.length-1) THEN
			tangent ← Complex.Sub[currentSamples[i+1], currentSamples[i-1]]
		ELSE IF closed THEN tangent ←
				Complex.Sub[currentSamples[1], currentSamples[currentSamples.length-2]];
		lsSpline.Sample[currentSamples[i], tangent];
		ENDLOOP;
	lsSpline.Subdivide[cubicProc, tolerance];
	};

JaMFnsDefs.Register[".subdividespline", Subdivide]; 

END.

Michael Plass  August 12, 1982 1:22 pm. Fixed tangent calculation for closed samples.