/*
 * @(#)ZRectangle.java
 *
 * Copyright 2001 by Intelligent Technology Inc. All rights reserved.
 */

package jp.co.iti.fagot.geom;

import java.awt.Shape;

import java.awt.geom.Rectangle2D;
import java.awt.geom.Ellipse2D;

/**
 * geomパッケージは、Java基本データクラス(基本属性double)を利用しやすく
 * クラス使用時の名称短縮のためと、いくつかの独自メソッド追加のために
 * 利用する。
 *
 * Rectangle
 *
 * @author  福島康治
 * @version 1.01 2001/01/07
 */
public class ZRectangle extends Rectangle2D.Double {

	/**
	 * コンストラクタ
	 */
	public ZRectangle() {
	}

	/**
	 * コンストラクタ
	 */
	public ZRectangle(double x,double y,double w,double h) {
	this();
	setRect(x,y,w,h);
	}

	/**
	 * コンストラクタ
	 */
	public ZRectangle( ZPoint pt1, ZPoint pt2 ) {
	this();
	setRect(Math.min(pt1.getX(),pt2.getX()),Math.min(pt1.getY(),pt2.getY()),
		  Math.abs(pt1.getX()-pt2.getX()),Math.abs(pt1.getY()-pt2.getY()) );
	}

	/**
	 * コンストラクタ
	 */
	public ZRectangle( Rectangle2D rect ) {
	this();
	setRect(rect.getX(),rect.getY(),rect.getWidth(),rect.getHeight());
	}

	/**
	 * コンストラクタ
	 */
	public ZRectangle( Shape sh ) {
	this();
	Rectangle2D rect = sh.getBounds2D();
	setRect(rect.getX(),rect.getY(),rect.getWidth(),rect.getHeight());
	}

	/**
	 * デバッグ
	 */
	public String toString() {
	return new String("jp.co.iti.fagot.geom.ZRectangle:" + 
					  "x="      + getX()      + "," +
					  "y="      + getY()      + "," +
					  "width="  + getWidth()  + "," +
					  "height=" + getHeight() ) ;
	}
	//## オーバライド #################################################
	/**
	 * X座標の取得
	 */
	public double getX() {
	return x;
	}

	/**
	 * Y座標の取得
	 */
	public double getY() {
	return y;
	}

	/**
	 * 幅の取得
	 */
	public double getWidth() {
	return width;
	}

	/**
	 * 高さの取得
	 */
	public double getHeight() {
	return height;
	}

	/**
	 * 空か否かの判定
	 */
	public boolean isEmpty() {
	    return (getWidth() <= 0.0) || (getHeight() <= 0.0);
	}

	/**
	 * 矩形の設定
	 */
	public void setRect(double x, double y, double w, double h) {
	this.x = x;
	this.y = y;
	this.width = w;
	this.height = h;
	}

	/**
	 * 矩形の設定
	 */
	public void setRect(Rectangle2D r) {
	setRect(r.getX(),r.getY(),r.getWidth(),r.getHeight());
	}

	/**
	 * 指定した座標の位置を判定します
	 */
	public int outcode(double x, double y) {
	int out = 0;
	if (getWidth() <= 0) {
		out |= OUT_LEFT | OUT_RIGHT;
	} else if (x < getX()) {
		out |= OUT_LEFT;
	} else if (x > getX() + getWidth()) {
		out |= OUT_RIGHT;
	}
	if (getHeight() <= 0) {
		out |= OUT_TOP | OUT_BOTTOM;
	} else if (y < getY()) {
		out |= OUT_TOP;
	} else if (y > getY() + getHeight()) {
		out |= OUT_BOTTOM;
	}
    return out;
	}

	/**
	 * 矩形の取得
	 */
	public Rectangle2D getBounds2D() {
	    return new ZRectangle(this);
	}

	/**
	 * 共通部分の矩形の取得
	 */
	public Rectangle2D createIntersection(Rectangle2D r) {
	Rectangle2D dest = new ZRectangle();
	Rectangle2D.intersect(this, r, dest);
	return dest;
	}

	/**
	 * 和集合の矩形の取得
	 */
	public Rectangle2D createUnion(Rectangle2D r) {
	Rectangle2D dest = new ZRectangle();
	Rectangle2D.union(this, r, dest);
	return dest;
	}

	//## 追加メソッド #################################################
	/**
	 * 移動
	 */
	public void translate(double x, double y) {
	setLocation(getX()+x,getY()+y) ;
	}

	/**
	 * 移動
	 */
	public void translate( ZPoint pt) {
	translate( pt.getX(), pt.getY() );
	}

	/**
	 * 移動
	 */
	public void setLocation(double x, double y ) {
	this.x = x;
	this.y = y;
	}

	/**
	 * 移動
	 */
	public void setLocation( ZPoint pt) {
	setLocation( pt.getX(), pt.getY() );
	}

	/**
	 * 移動
	 */
	public void setCenter(double x, double y ) {
	setLocation( x-getWidth()/2, y-getWidth()/2 );
	}

	/**
	 * 移動
	 */
	public void setCenter( ZPoint pt) {
	setCenter( pt.getX(), pt.getY() );
	}

	/**
	 * サイズの取得
	 */
	public ZDimension getSize() {
	return( new ZDimension( getWidth(), getHeight() ) ) ;
	}

	/**
	 * 矩形のマージ
	 */
	public void union( ZRectangle rect ) {
	Rectangle2D unirect = createUnion(rect);
	setRect( unirect );
	}

	/**
	 * 座標を含むか？
	 */
	public boolean contains( ZPoint pt ) {
	return contains( pt.getX(), pt.getY() );
	}

	/**
	 * 左上位置の取得
	 */
	public ZPoint getTopLeft() {
	return new ZPoint( getX(), getY() );
	}

	/**
	 * 中央位置の取得
	 */
	public ZPoint getCenter() {
	return new ZPoint( getX()+getWidth()/2, getY()+getHeight()/2 );
	}

	/**
	 * 楕円の取得
	 */
	public Ellipse2D getEllipse2D() {
	return new Ellipse2D.Double( getX(),getY(),getWidth(),getHeight() );
	}

	//## FAGOT ########################################################
	/**
	 * X座標の設定
	 */
	public void setX( double x ) {
	this.x = x;
	}

	/**
	 * Y座標の設定
	 */
	public void setY( double y ) {
	this.y = y;
	}

	/**
	 * 幅の設定
	 */
	public void setWidth( double w ) {
	this.width = w;
	}

	/**
	 * 高さの設定
	 */
	public void setHeight( double h ) {
	this.height = h;
	}

	//## アトリビュート ###############################################
	/**
	 * X座標
	 */
	protected double x;

	/**
	 * Y座標
	 */
	protected double y;

    /**
     * 幅
     */
	protected double width;

    /**
     * 高さ
     */
	protected double height;
}
