(* Copyright 1989 Digital Equipment Corporation. *) (* Distributed only by permission. *) (* Created by stolfi on Sat Mar 3 0:08:44 PST 1990 *) (* Last modified on Tue Jul 21 16:10:38 PDT 1992 by harrison *) (* modified on Wed May 9 3:27:47 PDT 1990 by stolfi *) MODULE R2Box; IMPORT R2, Fuzzy; PROCEDURE FromEdges (h1, h2, v1, v2: REAL): T = BEGIN IF h1 >= h2 OR v1 >= v2 THEN RETURN Empty END; RETURN T{Fuzzy.T{h1, h2}, Fuzzy.T{v1, v2}}; END FromEdges; PROCEDURE FromAbsEdges (h1, h2, v1, v2: REAL): T = BEGIN RETURN FromEdges(MIN(h1, h2), MAX(h1, h2), MIN(v1, v2), MAX(v1, v2)) END FromAbsEdges; PROCEDURE FromCorners (READONLY p, q: R2.T): T = BEGIN RETURN FromAbsEdges(p[0], q[0], p[1], q[1]); END FromCorners; PROCEDURE IsEmpty (READONLY a: T): BOOLEAN = BEGIN RETURN a[0].lo > a[0].hi OR a[1].lo > a[1].hi; END IsEmpty; PROCEDURE Meet (READONLY a, b: T): T = BEGIN IF a[0].lo > a[0].hi OR a[1].lo > a[1].hi OR b[0].lo > b[0].hi OR b[1].lo > b[1].hi THEN RETURN Empty ELSE RETURN T{Fuzzy.T{MAX(a[0].lo, b[0].lo), MIN(a[0].hi, b[0].hi)}, Fuzzy.T{MAX(a[1].lo, b[1].lo), MIN(a[1].hi, b[1].hi)}}; END END Meet; PROCEDURE Join (READONLY a, b: T): T = BEGIN IF a[0].lo > a[0].hi OR a[1].lo > a[1].hi THEN RETURN b END; IF b[0].lo > b[0].hi OR b[1].lo > b[1].hi THEN RETURN a END; RETURN T{Fuzzy.T{MIN(a[0].lo, b[0].lo), MAX(a[0].hi, b[0].hi)}, Fuzzy.T{MIN(a[1].lo, b[1].lo), MAX(a[1].hi, b[1].hi)}}; END Join; PROCEDURE NorthWest (READONLY a: T): R2.T = BEGIN RETURN R2.T{a[0].lo, a[1].hi}; END NorthWest; PROCEDURE NorthEast (READONLY a: T): R2.T = BEGIN RETURN R2.T{a[0].hi, a[1].hi}; END NorthEast; PROCEDURE SouthWest (READONLY a: T): R2.T = BEGIN RETURN R2.T{a[0].lo, a[1].lo}; END SouthWest; PROCEDURE SouthEast (READONLY a: T): R2.T = BEGIN RETURN R2.T{a[0].hi, a[1].lo}; END SouthEast; PROCEDURE Middle (READONLY a: T): R2.T = BEGIN IF a[0].lo > a[0].hi OR a[1].lo > a[1].hi THEN RETURN R2.Origin; ELSE RETURN R2.T{0.5 * a[0].lo + 0.5 * a[0].hi, 0.5 * a[1].lo + 0.5 * a[1].hi}; END; END Middle; PROCEDURE Size (READONLY a: T): R2.T = BEGIN IF a[0].lo > a[0].hi OR a[1].lo > a[1].hi THEN RETURN R2.Origin; ELSE RETURN R2.T{a[0].hi - a[0].lo, a[1].hi - a[1].lo}; END; END Size; PROCEDURE HalfSize (READONLY a: T): R2.T = BEGIN IF a[0].lo > a[0].hi OR a[1].lo > a[1].hi THEN RETURN R2.Origin; ELSE RETURN R2.T{0.5 * a[0].hi - 0.5 * a[0].lo, 0.5 * a[1].hi - 0.5 * a[1].lo}; END; END HalfSize; PROCEDURE Inset (READONLY a: T; by: REAL): T = BEGIN RETURN T{Fuzzy.Inset(a[0], by), Fuzzy.Inset(a[1], by)}; END Inset; PROCEDURE Extend (READONLY a: T; p: R2.T): T = BEGIN RETURN T{Fuzzy.Expand(p[0], a[0]), Fuzzy.Expand(p[1], a[1])}; END Extend; PROCEDURE Translate (READONLY a: T; p: R2.T): T = BEGIN RETURN T{Fuzzy.Shift(p[0], a[0]), Fuzzy.Shift(p[1], a[1])}; END Translate; PROCEDURE ToText (READONLY a: T): TEXT = BEGIN IF a[0].lo > a[0].hi OR a[1].lo > a[1].hi THEN RETURN "(empty)"; ELSE RETURN "(" & Fuzzy.ToText(a[0]) & ", " & Fuzzy.ToText(a[1]) & ")"; END; END ToText; BEGIN END R2Box.