/**************************************************************************** ** COPYRIGHT (C): 1997 Cay S. Horstmann. All Rights Reserved. ** PROJECT: Practical OO Development with C++ and Java ** FILE: Rectangle.java ** PURPOSE: shape class ** VERSION 1.0 ** PROGRAMMERS: Cay Horstmann (CSH) ** RELEASE DATE: 3-15-97 (CSH) ** UPDATE HISTORY: ****************************************************************************/ package practicaloo; import java.awt.Graphics; import java.io.PrintStream; public class Rectangle implements Cloneable { public Rectangle(Point x1, Point x2) { _corner1 = x1; _corner2 = x2; } public Object clone() { try { return super.clone(); } catch(CloneNotSupportedException e) { return null; } } public void move(int dx, int dy) { _corner1.move(dx, dy); _corner2.move(dx, dy); } public void scale(Point center, double s) { _corner1.scale(center, s); _corner2.scale(center, s); } public Point get_left_top() { Point p = new Point(Math.min(_corner1.get_x(), _corner2.get_x()), Math.max(_corner1.get_y(), _corner2.get_y())); return p; } public void plot(Graphics g) { g.drawRect(Math.min(_corner1.get_x(), _corner2.get_x()), Math.min(_corner1.get_y(), _corner2.get_y()), //Is this min?maybe i can use top_left().get_x, top_left().get_y() Math.abs(_corner1.get_x() - _corner2.get_x()), Math.abs(_corner1.get_y() - _corner2.get_y())); } public void print(PrintStream p) { p.print(System.out); } public Point left_top() { return new Point(Math.min(_corner1.get_x(), _corner2.get_x()), Math.min(_corner1.get_y(), _corner2.get_y())); } public Point left_bottom() { return new Point(Math.min(_corner1.get_x(), _corner2.get_x()), Math.max(_corner1.get_y(), _corner2.get_y())); } public Point right_top() { return new Point(Math.max(_corner1.get_x(), _corner2.get_x()), Math.min(_corner1.get_y(), _corner2.get_y())); } public Point right_bottom() { return new Point(Math.max(_corner1.get_x(), _corner2.get_x()), Math.max(_corner1.get_y(), _corner2.get_y())); } public Point center() { return new Point((int)((_corner1.get_x() + _corner2.get_x()) / 2.0), (int)((_corner1.get_y()+ _corner2.get_y()) / 2.0)); } public boolean is_inside(Point p) { return Math.min(_corner1.get_x(), _corner2.get_x()) <= p.get_x() && p.get_x() <= Math.max(_corner1.get_x(), _corner2.get_x()) && Math.min(_corner1.get_y(), _corner2.get_y()) <= p.get_y() && p.get_y() <= Math.max(_corner1.get_y(), _corner2.get_y()); } public Point boundary_point(Point p) { Point c = center(); //is this sytax right? double x = p.get_x() - c.get_x(); double y = p.get_y() - c.get_y(); if (Approx.equal(x, 0) && Approx.equal(y, 0)) return c; double xs2 = Math.abs(_corner2.get_x() - _corner1.get_x()) / 2; double ys2 = Math.abs(_corner2.get_y() - _corner1.get_y()) / 2; double xys = x * ys2; double yxs = y * xs2; if (Math.abs(xys) <= Math.abs(yxs)) // meets the top or bottom { double bx = xys / y; if (y > 0) return new Point((int)(c.get_x() + bx), (int)(c.get_y() + ys2)); else return new Point((int)(c.get_x() - bx), (int)(c.get_y() - ys2)); } else // meets the left or right { double by = yxs / x; if (x > 0) return new Point((int)(c.get_x() + xs2), (int)(c.get_y() + by)); else return new Point((int)(c.get_x() - xs2), (int)(c.get_y() - by)); } } private Point _corner1; private Point _corner2; }