   ### 15.4.1348  src/lib/x-kit/draw/box2.pkg

`## 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.sublib

`stipulate`
`    package g2d =  geometry2d;                  # geometry2d    is from   `src/lib/std/2d/geometry2d.pkg
`herein`
`    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.`   