DIRECTORY Imager, ImagerTransformation, Vector2; Geom2D: CEDAR DEFINITIONS IMPORTS ImagerTransformation, Vector2 = { Singularity: ERROR; Number: TYPE = REAL; Vec: TYPE = Vector2.VEC --= RECORD[x, y: REAL]--; VecList: TYPE = LIST OF Vec; ZeroVec: Vec = [0, 0]; Line: TYPE = RECORD [from, to: Vec]; --directed line segment Rect: TYPE = Imager.Rectangle --= RECORD [x, y, w, h: REAL]--; RectList: TYPE = LIST OF Rect; ZeroRect: Rect = [0, 0, 0, 0]; Axis: TYPE = {X, Y}; Dir: TYPE = [-1..1]; Direction: TYPE = RECORD [axis: Axis, sgn: Dir]; Transform: TYPE = ImagerTransformation.Transformation; Trans: TYPE = RECORD [dxdx, dydx, dxdy, dydy, dx, dy: Number]; id: Transform; posX: Direction = [X, 1]; negX: Direction = [X, -1]; posY: Direction = [Y, 1]; negY: Direction = [Y, -1]; ToTrans: PROC [tm: Transform] RETURNS [tn: Trans] = INLINE {tn ¬ [dxdx: tm.a, dxdy: tm.b, dx: tm.c, dydx: tm.d, dydy: tm.e, dy: tm.f]}; FromTrans: PROC [tn: Trans] RETURNS [tm: Transform] = INLINE {tm ¬ ImagerTransformation.Create[tn.dxdx, tn.dxdy, tn.dx, tn.dydx, tn.dydy, tn.dy]}; Project: PROC [Vec, Vec] RETURNS [Vec]; Displace: PROC [Vec, Rect] RETURNS [Rect]; DirectionOf: PROC [Vec] RETURNS [Direction]; LineRect: PROC [Line] RETURNS [Rect]; BloatVec: PROC [Vec, Number] RETURNS [Rect]; BloatRect: PROC [Rect, Number] RETURNS [Rect]; BloatLine: PROC [Line, Number] RETURNS [Rect]; UnitNormalToward: PROC [Line, Vec] RETURNS [Vec]; Parallel: PROC [Vec, Vec] RETURNS [BOOLEAN]; --cross product = 0 In: PROC [Vec, Rect] RETURNS [BOOLEAN]; SweepRects: PROC [Rect, Rect] RETURNS [Rect]; UpdateRects: PROC [Rect, Rect] RETURNS [Rect]; --mbb of both-- UpdateFRect: PROC [Rect, FRect] RETURNS [FRect]; FRect: TYPE = RECORD [defined: BOOLEAN ¬ FALSE, r: Rect ¬ ZeroRect]; ExtremaOfRect: PROC [r: Rect, n: Vec] RETURNS [min, max: Vec]; RotateBy90s: PROC [Transform, INTEGER] RETURNS [Transform]; MapVecs: PROC [Transform, VecList] RETURNS [VecList]; MapRects: PROC [Transform, RectList] RETURNS [RectList]; ExtremaRec: TYPE = RECORD [minD, maxD: Number, minV, maxV: Vec]; StartExtreme: PROC [n, v: Vec] RETURNS [ExtremaRec] = INLINE {d: Number ¬ n.Dot[v]; RETURN [[d, d, v, v]]}; Extreme: PROC [n, v: Vec, e: ExtremaRec] RETURNS [ExtremaRec] = INLINE { d: Number ¬ n.Dot[v]; IF d < e.minD THEN RETURN [[d, e.maxD, v, e.maxV]] ELSE IF d > e.maxD THEN RETURN [[e.minD, d, e.minV, v]] ELSE RETURN [e]}; }. V Geom2D.Mesa, from [Cedar]Top>BiScrollers.DF Copyright Σ 1992 by Xerox Corporation. All rights reserved. Last Edited by: Spreitzer, June 9, 1985 12:56:37 pm PDT Mike Spreitzer March 19, 1992 8:35 pm PST some two dimensional geometry dxdx dydx 0 dxdy dydy 0 dx dy 1 Append counterclockwise rotation this number of steps. ΚΫ•NewlineDelimiter –(cedarcode) style™codešœ$Οmœ™8Kšœ Οeœ1™Kšœ ŸœŸœŸœ˜K˜KšœŸœŸœŸœ˜KšœŸœ ˜Kšœ ŸœŸœ˜0Kšœ Ÿœ'˜6KšœŸœŸœ*˜>Kšœ ™ Kšœ ™ Kšœ™K˜K˜KšœŸœ˜KšœŸœ˜KšœŸœ˜KšœŸœ˜K˜š‘œŸœŸœ ˜1KšœŸœM˜U—š‘ œŸœ Ÿœ˜3KšœŸœV˜^—Kš‘œŸœ Ÿœ˜'Kš‘œŸœ Ÿœ˜*Kš‘ œŸœŸœ ˜,Kš‘œŸœŸœ˜%Kš‘œŸœŸœ˜,Kš‘ œŸœŸœ˜.Kš‘ œŸœŸœ˜.Kš‘œŸœ Ÿœ˜1Kš ‘œŸœ ŸœŸœ’˜@Kš‘œŸœ ŸœŸœ˜'Kš‘ œŸœŸœ˜-Kš‘ œŸœŸœ ’˜>š‘ œŸœŸœ ˜0Kš œŸœŸœ ŸœŸœ˜D—Kš‘ œŸœŸœ˜>š‘ œŸœ ŸœŸœ ˜;Kšœ6™6—Kš‘œŸœŸœ ˜5Kš‘œŸœŸœ ˜8K˜K˜Kšœ ŸœŸœ'˜@K˜š‘ œŸœ ŸœŸ˜