Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] View of /eXene/releases/release-110.74/graph-util/box.sml
ViewVC logotype

View of /eXene/releases/release-110.74/graph-util/box.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3683 - (download) (annotate)
Sun Jan 22 05:04:52 2012 UTC (7 years, 8 months ago) by dbm
File size: 2031 byte(s)
Tagging 110.74 release of eXene
(* box.sml
 *
 * COPYRIGHT (c) 1994 by AT&T Bell Laboratories
 *
 * Code for simple box data structure.
 *
 * A box is essentially a rectangle stored as the upper left point
 * and lower right bounding point. Note that the lower right point
 * is not actually part of the rectangle. Explicitly,
 * RECT{x,y,wid,ht} corresponds to the box 
 * BOX{x1=x,y1=y,x2=x+wid,y2=y+ht}. For certain computations (e.g.,
 * constructing regions), this representation is more useful.
 *
 *)

structure Box =
  struct

    datatype box = BOX of {x1 : int, y1 : int, x2 : int, y2 : int}

    val zeroBox = BOX{x1 = 0, y1 = 0, x2 = 0, y2 = 0}

    fun miny(BOX{y1,...}) = y1

      (* inBox:
       * returns true if point is in box
       *)
    fun inBox(BOX{x1,y1,x2,y2},Geometry.PT{x,y}) =
          x2 > x andalso x >= x1 andalso y2 > y andalso 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 andalso y1' <= y1 andalso x2' >= x2 andalso 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' andalso x1 < x2' andalso y2 > y1' andalso y1 < y2'

      (* boundBox:
       * returns bounding box of two boxes
       *)
    fun boundBox(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 offsetBox (Geometry.PT{x,y}) (BOX{x1,y1,x2,y2}) =
          BOX{x1 = x1+x, x2 = x2+x, y1 = y1+y, y2 = y2+y}

      (* xOffsetBox:
       * horizontally translate box
       *)
    fun xOffsetBox x (BOX{x1,y1,x2,y2}) = BOX{x1 = x1+x, x2 = x2+x, y1 = y1, y2 = y2}

      (* yOffsetBox:
       * vertically translate box
       *)
    fun yOffsetBox y (BOX{x1,y1,x2,y2}) = BOX{x1 = x1, x2 = x2, y1 = y1+y, y2 = y2+y}

  end

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0