## box2.pkg
#
# The standard x-kit box (rectangle) representation is defined in
#
#
src/lib/std/2d/geometry2d.api#
# in terms of position + size in the form of int row/col/high/wide fields.
#
# Here we define a sometimes-useful alternate representation in
# terms of two corners specified as int x1/y1/x2/y2 fields.
#
# Note that the lower right point is not actually part of the rectangle.
# Explicitly,
# BOX { x, y, wid, ht } corresponds to
# box2::BOX { x1=x, y1=y, x2=x+wid, y2=y+ht }. For certain computations (e.g.,
# constructing regions), this representation is more useful.
# Compiled by:
#
src/lib/x-kit/draw/xkit-draw.sublibstipulate
package g2d = geometry2d; # geometry2d is from
src/lib/std/2d/geometry2d.pkgherein
package box2 {
Box = BOX { x1: Int, y1: Int, x2: Int, y2: Int };
zero_box = BOX { x1 => 0, y1 => 0, x2 => 0, y2 => 0 };
fun miny (BOX { y1, ... } )
=
y1;
# inBox:
# returns TRUE if point is in box
fun in_box (BOX { x1, y1, x2, y2 }, { col=>x, row=>y } )
=
x2 > x and
x >= x1 and
y2 > y and
y >= y1;
# inside:
# returns TRUE if first box is contained in second
fun inside (BOX { x1, y1, x2, y2 }, BOX { x1=>x1', y1=>y1', x2=>x2', y2=>y2' } )
=
x1' <= x1 and
y1' <= y1 and
x2' >= x2 and
y2' >= y2;
# overlap:
# returns TRUE if boxes overlap
fun overlap (BOX { x1, y1, x2, y2 }, BOX { x1=>x1', y1=>y1', x2=>x2', y2=>y2' } )
=
x2 > x1' and
x1 < x2' and
y2 > y1' and
y1 < y2';
# boundBox:
# returns bounding box of two boxes
fun bound_box (BOX { x1, y1, x2, y2 }, BOX { x1=>x1', y1=>y1', x2=>x2', y2=>y2' } )
=
BOX
{ x1 => int::min (x1, x1'),
x2 => int::max (x2, x2'),
y1 => int::min (y1, y1'),
y2 => int::max (y2, y2')
};
# offsetBox:
# translate box by given vector
fun offset_box ({ col=>x, row=>y } ) (BOX { x1, y1, x2, y2 } )
=
BOX { x1 => x1+x, x2 => x2+x, y1 => y1+y, y2 => y2+y };
# xOffsetBox:
# horizontally translate box
#
fun x_offset_box x (BOX { x1, y1, x2, y2 } )
=
BOX { x1 => x1+x, x2 => x2+x, y1, y2 };
# yOffsetBox:
# vertically translate box
#
fun y_offset_box y (BOX { x1, y1, x2, y2 } )
=
BOX { x1, x2, y1 => y1+y, y2 => y2+y };
};
end;
## COPYRIGHT (c) 1994 by AT&T Bell Laboratories
## Subsequent changes by Jeff Prothero Copyright (c) 2010-2015,
## released per terms of SMLNJ-COPYRIGHT.