Rectangle.java
上传用户:haobig99
上传日期:2022-06-15
资源大小:369k
文件大小:10k
源码类别:

J2ME

开发平台:

Java

  1. /*
  2.  * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
  3.  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4.  *
  5.  * This code is free software; you can redistribute it and/or modify it
  6.  * under the terms of the GNU General Public License version 2 only, as
  7.  * published by the Free Software Foundation.  Sun designates this
  8.  * particular file as subject to the "Classpath" exception as provided
  9.  * by Sun in the LICENSE file that accompanied this code.
  10.  *
  11.  * This code is distributed in the hope that it will be useful, but WITHOUT
  12.  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13.  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14.  * version 2 for more details (a copy is included in the LICENSE file that
  15.  * accompanied this code).
  16.  *
  17.  * You should have received a copy of the GNU General Public License version
  18.  * 2 along with this work; if not, write to the Free Software Foundation,
  19.  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20.  *
  21.  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  22.  * CA 95054 USA or visit www.sun.com if you need additional information or
  23.  * have any questions.
  24.  */
  25. package com.sun.lwuit.geom;
  26. /**
  27.  * Represents a Rectangle position (x, y) and {@link Dimension} (width, height),
  28.  * this is useful for measuring coordinates within the application.
  29.  * 
  30.  * @author Chen Fishbein
  31.  */
  32. public class Rectangle {
  33.     private int x;
  34.     private int y;
  35.     private Dimension size;
  36.     /** 
  37.      * Creates a new instance of Rectangle 
  38.      */
  39.     public Rectangle() {
  40.         size = new Dimension();
  41.     }
  42.     /**
  43.      * Creates a new instance of Rectangle at position (x, y) and with 
  44.      * predefine dimension
  45.      * 
  46.      * @param x the x coordinate of the rectangle
  47.      * @param y the y coordinate of the rectangle
  48.      * @param size the {@link Dimension} of the rectangle
  49.      */
  50.     public Rectangle(int x, int y, Dimension size) {
  51.         this.x = x;
  52.         this.y = y;
  53.         this.size = size;
  54.     }
  55.     /**
  56.      * Creates a new instance of Rectangle at position (x, y) and with 
  57.      * predefine width and height
  58.      * 
  59.      * @param x the x coordinate of the rectangle
  60.      * @param y the y coordinate of the rectangle
  61.      * @param w the width of the rectangle
  62.      * @param h the height of the rectangle
  63.      */
  64.     public Rectangle(int x, int y, int w, int h) {
  65.         this.x = x;
  66.         this.y = y;
  67.         this.size = new Dimension(w, h);
  68.     }
  69.     /** 
  70.      * A copy Constructor
  71.      * @param rect the Rectangle to copy
  72.      */
  73.     public Rectangle(Rectangle rect) {
  74.         this(rect.getX(), rect.getY(),
  75.                 rect.getSize().getWidth(), rect.getSize().getHeight());
  76.     }
  77.     /**
  78.      * Return the dimension of the rectangle
  79.      * 
  80.      * @return the size of the rectangle
  81.      */
  82.     public Dimension getSize() {
  83.         return size;
  84.     }
  85.     /**
  86.      * Return the x coordinate of the rectangle
  87.      * 
  88.      * @return the x coordinate of the rectangle
  89.      */
  90.     public int getX() {
  91.         return x;
  92.     }
  93.     /**
  94.      * Return the y coordinate of the rectangle
  95.      * 
  96.      * @return the y coordinate of the rectangle
  97.      */
  98.     public int getY() {
  99.         return y;
  100.     }
  101.     /**
  102.      * @inheritDoc
  103.      */
  104.     public String toString() {
  105.         return "x = " + x + " y = " + y + " size = " + size;
  106.     }
  107.     /**
  108.      * Sets the x position of the rectangle
  109.      * 
  110.      * @param x the x coordinate of the rectangle
  111.      */
  112.     public void setX(int x) {
  113.         this.x = x;
  114.     }
  115.     /**
  116.      * Sets the y position of the rectangle
  117.      * 
  118.      * @param y the y coordinate of the rectangle
  119.      */
  120.     public void setY(int y) {
  121.         this.y = y;
  122.     }
  123.     /**
  124.      * Checks whether or not this Rectangle entirely contains the specified 
  125.      * Rectangle.
  126.      * 
  127.      * @param rect the specified Rectangle 
  128.      * @return true if the Rectangle is contained entirely inside this 
  129.      * Rectangle; false otherwise
  130.      */
  131.     public boolean contains(Rectangle rect) {
  132.         return contains(rect.x, rect.y, rect.size.getWidth(), rect.size.getHeight());
  133.     }
  134.     /**
  135.      * Checks whether this Rectangle entirely contains the Rectangle 
  136.      * at the specified location (rX, rY) with the specified 
  137.      * dimensions (rWidth, rHeight).
  138.      * 
  139.      * @param rX the specified x coordinate
  140.      * @param rY the specified y coordinate
  141.      * @param rWidth the width of the Rectangle
  142.      * @param rHeight the height of the Rectangle
  143.      * @return true if the Rectangle specified by (rX, rY, rWidth, rHeight) 
  144.      * is entirely enclosed inside this Rectangle; false otherwise.
  145.      */
  146.     public boolean contains(int rX, int rY, int rWidth, int rHeight) {
  147.         return x <= rX && y <= rY && x + size.getWidth() >= rX + rWidth &&
  148.                 y + size.getHeight() >= rY + rHeight;
  149.     }
  150.     /**
  151.      * Checks whether or not this Rectangle contains the point at the specified 
  152.      * location (rX, rY).
  153.      * 
  154.      * @param rX the specified x coordinate
  155.      * @param rY the specified y coordinate
  156.      * @return true if the point (rX, rY) is inside this Rectangle; 
  157.      * false otherwise.
  158.      */
  159.     public boolean contains(int rX, int rY) {
  160.         return x <= rX && y <= rY && x + size.getWidth() >= rX &&
  161.                 y + size.getHeight() >= rY;
  162.     }
  163.     /**
  164.      * Returns a rectangle that intersects the given rectangle with this rectangle
  165.      *
  166.      * @param rX rectangle to intersect with this rectangle
  167.      * @param rY rectangle to intersect with this rectangle
  168.      * @param rW rectangle to intersect with this rectangle
  169.      * @param rH rectangle to intersect with this rectangle
  170.      * @return the intersection
  171.      */
  172.     public Rectangle intersection(int rX, int rY, int rW, int rH) {
  173.         int tx1 = this.x;
  174.         int ty1 = this.y;
  175.         int rx1 = rX;
  176.         int ry1 = rY;
  177.         long tx2 = tx1; tx2 += this.size.getWidth();
  178.         long ty2 = ty1; ty2 += this.size.getHeight();
  179.         long rx2 = rx1; rx2 += rW;
  180.         long ry2 = ry1; ry2 += rH;
  181.         if (tx1 < rx1) {
  182.             tx1 = rx1;
  183.         }
  184.         if (ty1 < ry1) {
  185.             ty1 = ry1;
  186.         }
  187.         if (tx2 > rx2) {
  188.             tx2 = rx2;
  189.         }
  190.         if (ty2 > ry2) {
  191.             ty2 = ry2;
  192.         }
  193.         tx2 -= tx1;
  194.         ty2 -= ty1;
  195.         // tx2,ty2 will never overflow (they will never be
  196.         // larger than the smallest of the two source w,h)
  197.         // they might underflow, though...
  198.         if (tx2 < Integer.MIN_VALUE) {
  199.             tx2 = Integer.MIN_VALUE;
  200.         }
  201.         if (ty2 < Integer.MIN_VALUE) {
  202.             ty2 = Integer.MIN_VALUE;
  203.         }
  204.         return new Rectangle(tx1, ty1, (int) tx2, (int) ty2);
  205.     }
  206.     /**
  207.      * Returns a rectangle that intersects the given rectangle with this rectangle
  208.      * 
  209.      * @param r rectangle to intersect with this rectangle
  210.      * @return the intersection
  211.      */
  212.     public Rectangle intersection(Rectangle r) {
  213.         return intersection(r.x, r.y, r.size.getWidth(), r.size.getHeight());
  214.     }
  215.     /**
  216.      * Determines whether or not this Rectangle and the specified Rectangle 
  217.      * location (x, y) with the specified dimensions (width, height),
  218.      * intersect. Two rectangles intersect if their intersection is nonempty.
  219.      * 
  220.      * @param x the specified x coordinate
  221.      * @param y the specified y coordinate
  222.      * @param width the width of the Rectangle
  223.      * @param height the height of the Rectangle
  224.      * @return true if the specified Rectangle and this Rectangle intersect; 
  225.      * false otherwise.
  226.      */
  227.     public boolean intersects(int x, int y, int width, int height) {
  228.         int tw = size.getWidth();
  229.         int th = size.getHeight();
  230.         return intersects(this.x, this.y, tw, th, x, y, width, height);
  231.     }
  232.     /**
  233.      * Determines whether or not this Rectangle and the specified Rectangle 
  234.      * location (x, y) with the specified dimensions (width, height),
  235.      * intersect. Two rectangles intersect if their intersection is nonempty.
  236.      * 
  237.      * @param rect the Rectangle to check intersection with
  238.      * @return true if the specified Rectangle and this Rectangle intersect; 
  239.      * false otherwise.
  240.      */
  241.     public boolean intersects(Rectangle rect) {
  242.         return intersects(rect.getX(), rect.getY(),
  243.                 rect.getSize().getWidth(), rect.getSize().getHeight());
  244.     }
  245.     /**
  246.      * Helper method allowing us to determine if two coordinate sets intersect. This saves
  247.      * us the need of creating a rectangle object for a quick calculation
  248.      * 
  249.      * @param tx x of first rectangle
  250.      * @param ty y of first rectangle
  251.      * @param tw width of first rectangle
  252.      * @param th height of first rectangle
  253.      * @param x x of second rectangle
  254.      * @param y y of second rectangle
  255.      * @param width width of second rectangle
  256.      * @param height height of second rectangle
  257.      * @return true if the rectangles intersect
  258.      */
  259.     public static boolean intersects(int tx, int ty, int tw, int th, int x, int y, int width, int height) {
  260.         int rw = width;
  261.         int rh = height;
  262.         if (rw <= 0 || rh <= 0 || tw <= 0 || th <= 0) {
  263.             return false;
  264.         }
  265.         int rx = x;
  266.         int ry = y;
  267.         rw += rx;
  268.         rh += ry;
  269.         tw += tx;
  270.         th += ty;
  271.         return ((rw < rx || rw > tx) &&
  272.                 (rh < ry || rh > ty) &&
  273.                 (tw < tx || tw > rx) &&
  274.                 (th < ty || th > ry));
  275.     }
  276. }