package CookieCutter.g5;

import java.util.*;
import java.awt.*;
import java.awt.geom.*;

public class Edge extends Line2D.Double implements CookiePart {
	protected boolean _used;
	private int _id;
	private int _owner;

	public Edge( int id, int owner, Point2D.Double prev, Point2D.Double next ) {
		super( prev, next );
		_id = id;
		_owner = owner;
		_used = false;
	}

	public Edge( int id, int owner, double x1, double y1, double x2, double y2 ) {
		super( x1, y1, x2, y2 );
		_id = id;
		_owner = owner;
		_used = false;
	}

	public int ID() {
		return( _id );
	}

	public int Owner() {
		return( _owner );
	}

	public boolean isUsed() {
		return( _used );
	}

	public void use() {
		_used = true;
	}

	public Point2D.Double midPoint() {
		return( new Point2D.Double( ( getX1() + getX2() ) / 2, 
			( getY1() + getY2() ) / 2 ) );
	}

	public double[] slope() {
		double vec[] = new double[2];
		vec[0] = getX2() - getX1();
		vec[1] = getY2() - getY1();
		return( vec );
	}

	public double length() {
		return( VectorUtils.norm( slope() ) );
	}

	public double idealMeasure( Edge edge ) {
		return( edge.length() - length() );
	}

	public Edge complement( Vector edges ) {
		double diffLength = java.lang.Double.MAX_VALUE;
		Edge closestEdge = null;

		for( int i = 0; i < edges.size(); i++ ) {
			Edge edge = ( Edge )edges.elementAt( i );

			if( !edge.isUsed() ) {
				double lenDiff = idealMeasure( edge );
				
				if( Math.abs( lenDiff ) < Math.abs( diffLength ) ) {
					diffLength = lenDiff;
					closestEdge = edge;
				}
				else if( Math.abs( lenDiff ) == Math.abs( diffLength ) ) {
					if( closestEdge != null ) {
						if( edge.length() > closestEdge.length() ) {
							diffLength = lenDiff;
							closestEdge = edge;
						}
					}
				}
			}
		}

		return( closestEdge );
	}

	public boolean correspondingVertices( Edge e ) {
		Line2D.Double line = new Line2D.Double( getP1(), e.getP1() );
		return( !line.intersectsLine( new Line2D.Double( getP2(), e.getP2() ) ) );
	}
}
