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.