CubicPaths.mesa
Copyright Ó 1985, 1986, 1987, 1992 by Xerox Corporation. All rights reserved.
Written by: Maureen Stone August 5, 1985 8:39:13 pm PDT
Last edited by Bier on December 1, 1986 4:42:55 pm PST
Russ Atkinson (RRA) February 2, 1987 10:43:11 pm PST
Pier, August 5, 1987 3:50:29 pm PDT
Doug Wyatt, April 8, 1992 5:49 pm PDT
DIRECTORY
Imager USING [Rectangle, VEC, Transformation],
ImagerPath USING [MoveToProc, CurveToProc],
CubicSplines USING [CoeffsSequence],
Cubic2 USING [Bezier];
CubicPaths: CEDAR DEFINITIONS ~ BEGIN
VEC: TYPE = Imager.VEC;
Bezier: TYPE = Cubic2.Bezier;
Path: TYPE = REF PathRec;
PathRec: TYPE = RECORD[bounds: Imager.Rectangle, cubics: REF PathSequence];
PathSequence: TYPE = RECORD[bezier: SEQUENCE length: NAT OF Bezier];
PathFromCubic: PROC [coeffs: CubicSplines.CoeffsSequence, newBounds: BOOL ¬ TRUE]
RETURNS [Path];
EnumeratePath: PROC [path: Path,
moveTo: ImagerPath.MoveToProc, curveTo: ImagerPath.CurveToProc];
Call this inside of an Imager.PathProc to display the path.
ie: pathProc: ImagerPath.PathProc = {EnumeratePath[path, moveTo, curveTo]};
PointProc: TYPE = PROC [p: VEC] RETURNS [stop: BOOLEAN ¬ FALSE];
WalkPath: PROC [path: Path, tol: REAL, proc: PointProc];
Enumerates all the points on the curve. Uses subdivision. tol is for the flatness test
PointOnPath: PROC [pt: VEC, path: Path, tol: REAL] RETURNS [BOOLEAN];
TranslatePath: PROC [path: Path, offset: VEC];
TransformPath: PROC [path: Path, tranformation: Imager.Transformation,
newBounds: BOOL ¬ TRUE];
UpdateBounds: PROC [path: Path];
updates the bounding rectangle
ClosestPoint: PROC [pt: VEC, path: Path] RETURNS[VEC];
CopyPath: PROC [path: Path] RETURNS[Path];
ReversePath: PROC [path: Path];
reverses it in place
ClosestPointAnalytic: PROC[pt: VEC, path: Path, tolerance: REAL ¬ 9999.0]
RETURNS [closest: VEC, success: BOOL];
Faster than ClosestPointSubdivide, more accurate, and almost as robust. If success = TRUE, the point returned is guaranteed to be quite close to the Bezier path. The point is quite close because it results from plugging in a value of the parameter. The point returned is also quite close to the actual closest point, since the parameter chosen is within a floating point round-off error of being a root of the "closest point" polynomials. IF success = FALSE, no point on path is within tolerance of pt. In this case, closest is not valid data.
GetParam: PROC [bezier: Bezier, pt: VEC] RETURNS [u: REAL];
Given a bezier curve, and a point on the curve, find the parameter value u that generates pt.
CubicMeetsLine: PROC [bezier: Bezier, a, b, c: REAL]
RETURNS [points: ARRAY [0..2] OF VEC, hitCount: [0..3], tangency: ARRAY [0..2] OF BOOL];
Find the intersection points of the Bezier cubic piece bezier and the line: ax + by + c = 0.
END.