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

package jp.co.iti.fagot.geom;

import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;

import jp.co.iti.fagot.fob.FobManager;
import jp.co.iti.fagot.fob.IFobElement;
import jp.co.iti.fagot.fob.FDouble;

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

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

	/**
	 * コンストラクタ
	 */
	public ZLine(double x1,double y1,double x2,double y2) {
	this();
	setLine(x1,y1,x2,y2);
	}

	/**
	 * コンストラクタ
	 */
	public ZLine(ZPoint pt1,ZPoint pt2) {
	this();
	setLine(pt1.getX(),pt1.getY(),pt2.getX(),pt2.getY());
	}

	/**
	 * コンストラクタ
	 */
	public ZLine( ZLine line ) {
	this();
	setLine(line.getX1(),line.getY1(),line.getX2(),line.getY2());
	}

	//## オーバライド #################################################
	/**
	 * 始点X座標の取得
	 */
	public double getX1() {
    return x1;
	}

	/**
	 * 始点Y座標の取得
	 */
	public double getY1() {
    return y1;
	}

	/**
	 * 始点の取得
	 */
	public Point2D getP1() {
	    return new ZPoint(getX1(), getY1());
	}

	/**
	 * 始点の取得
	 */
	public ZPoint getP1Z() {
	    return new ZPoint(getX1(), getY1());
	}

	/**
	 * 終点X座標の取得
	 */
	public double getX2() {
    return x2;
	}

	/**
	 * 終点Y座標の取得
	 */
	public double getY2() {
    return y2;
	}

	/**
	 * 終点の取得
	 */
	public Point2D getP2() {
	    return new ZPoint(getX2(), getY2());
	}

	/**
	 * 終点の取得
	 */
	public ZPoint getP2Z() {
	    return new ZPoint(getX2(), getY2());
	}

	/**
	 * 線座標の設定
	 */
	public void setLine(double X1, double Y1, double X2, double Y2) {
	setX1(X1);
	setY1(Y1);
	setX2(X2);
	setY2(Y2);
	}

	/**
	 * 矩形の取得
	 */
	public Rectangle2D getBounds2D() {
    double x, y, w, h;
	if (getX1() < getX2()) {
		x = getX1();
		w = getX2() - getX1();
	} else {
		x = getX2();
		w = getX1() - getX2();
	}
	if (getY1() < getY2()) {
		y = getY1();
		h = getY2() - getY1();
	} else {
		y = getY2();
		h = getY1() - getY2();
	}
	    return new ZRectangle(x, y, w, h);
	}

	//## 追加 #########################################################
	/**
	 * 移動
	 */
	public void translate(double x, double y) {
	translate(new ZPoint(x,y));
	}

	/**
	 * 移動
	 */
	public void translate( ZPoint pt) {
	ZPoint p1 = getP1Z();
	p1.translate(pt);
	setP1(p1);

	ZPoint p2 = getP2Z();
	p2.translate(pt);
	setP2(p2);
	}

	/**
	 * 長さの取得
	 */
	public double length() {
	return ( ZGraphicUtil.getDistance(getP1Z(),getP2Z()) );
	}

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

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

	/**
	 * 始点の設定
	 */
	public void setP1( ZPoint pt ) {
	setX1(pt.getX());
	setY1(pt.getY());
	}

	/**
	 * 終点のX座標の設定
	 */
	public void setX2( double x ) {
	this.x2 = x;
	}

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

	/**
	 * 終点の設定
	 */
	public void setP2( ZPoint pt ) {
	setX2(pt.getX());
	setY2(pt.getY());
	}

	//## 判定 #########################################################
	/**
	 * パスに近いか？
	 * @param pt      判定点
	 * @param dMargin 余裕
	 */
	public boolean isNear(ZPoint pt, double dMargin) {
	return ZGraphicUtil.isNearLine(getP1Z(),getP2Z(),pt,dMargin);
	}

	//## アトリビュート ###############################################
	/**
	 * X1座標
	 */
	protected double x1;

	/**
	 * Y1座標
	 */
	protected double y1;

	/**
	 * X2座標
	 */
	protected double x2;

	/**
	 * Y2座標
	 */
	protected double y2;
}
