Copyright (C) 1992, Digital Equipment Corporation
All rights reserved.
See the file COPYRIGHT for a full description.
Last modified on Sun Oct 26 14:00:52 PST 1997 by heydon
MODULE JunoPt;
IMPORT JunoAST, JunoASTUtils, JunoValue, RTVal, Point;
<* INLINE *>
PROCEDURE ToHV(READONLY xyPt: T; READONLY xform: Transform): Point.T =
VAR
x := ROUND(xform.xScale * xyPt.x);
y := -ROUND(xform.yScale * xyPt.y);
BEGIN
RETURN Point.Add(Point.T{x, y}, xform.origin);
END ToHV;
<* INLINE *>
PROCEDURE FromHV(READONLY hvPt: Point.T; READONLY xform: Transform): T =
VAR xyPt := Point.Sub(hvPt, xform.origin); BEGIN
RETURN T{
FLOAT( xyPt.h, JunoValue.Real) / xform.xScale,
FLOAT(-xyPt.v, JunoValue.Real) / xform.yScale}
END FromHV;
<* INLINE *>
PROCEDURE ToASTPair(READONLY xyPt: T): JunoAST.Pair =
BEGIN
RETURN JunoASTUtils.NewPoint(xyPt.x, xyPt.y)
END ToASTPair;
<* INLINE *>
PROCEDURE ToValuePair(READONLY xyPt: T): RTVal.Pair =
BEGIN
RETURN RTVal.FromPair(RTVal.FromReal(xyPt.x), RTVal.FromReal(xyPt.y))
END ToValuePair;
<* INLINE *>
PROCEDURE FromValuePair(pr: RTVal.Pair): T RAISES {BadPt} =
BEGIN
TYPECASE pr.car OF
NULL => (* SKIP *)
| RTVal.Number (x) =>
TYPECASE pr.cdr OF
NULL => (* SKIP *)
| RTVal.Number (y) =>
RETURN T{x.val, y.val}
ELSE (* SKIP *)
END
ELSE (* SKIP *)
END;
RAISE BadPt
END FromValuePair;
PROCEDURE RelVal(
cx, cy, ax, ay, bx, by: JunoValue.Real;
VAR (*OUT*) x, y: JunoValue.Real): BOOLEAN =
VAR
v1 := T{cx - ax, cy - ay};
v2 := T{bx - ax, by - ay};
denom := (v2.x * v2.x) + (v2.y * v2.y);
BEGIN
IF denom = 0.0 THEN RETURN FALSE END;
(* x = R2.Dot(v1, v2) / denom *)
(* y = R2.Dot(v1, T{-v2.y, v2.x}) / denom *)
x := (v1.x * v2.x + v1.y * v2.y) / denom;
y := (v1.y * v2.x - v1.x * v2.y) / denom;
RETURN TRUE
END RelVal;
BEGIN
END JunoPt.