/*******************************************************************************
 * Copyright (c) 2003, 2008 IBM Corporation and Others
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Junji MAEDA - initial API and implementation
 *******************************************************************************/
package org.eclipse.actf.visualization.engines.lowvision.image;

public class LineSegment {
	public static final short POINT = 0;
	public static final short HORIZONTAL_LINE = 1;
	public static final short VERTICAL_LINE = 2;
	public static final short DIAGONAL_LINE = 3;

	int x0; //upper/left
	int y0; //upper/left
	int x1;
	int y1;

	public LineSegment( int _x0, int _y0, int _x1, int _y1 ){
		if( _x0 < _x1 ){
			x0 = _x0;
			y0 = _y0;
			x1 = _x1;
			y1 = _y1;
		}
		else if( _x0 > _x1 ){
			x0 = _x1;
			y0 = _y1;
			x1 = _x0;
			y1 = _y0;
		}
		else if( _y0 <= _y1 ){
			x0 = _x0;
			y0 = _y0;
			x1 = _x1;
			y1 = _y1;
		}
		else{
			x0 = _x1;
			y0 = _y1;
			x1 = _x0;
			y1 = _y0;
		}
	}
	public LineSegment( Coord _co0, Coord _co1 ){
		this( _co0.x, _co0.y, _co1.x, _co1.y );
	}

	public Coord getLeftPoint(){
		return( new Coord( x0, y0 ));
	}
	public Coord getRightPoint(){
		return( new Coord( x1, y1 ));
	}
	
	public Coord getUpperPoint(){
		if( y0 <= y1 ){
			return( new Coord( x0, y0 ) );
		}
		else{
			return( new Coord( x1, y1 ));
		}
	}
	public Coord getLowerPoint(){
		if( y0 > y1 ){
			return( new Coord( x0, y0 ) );
		}
		else{
			return( new Coord( x1, y1 ));
		}
	}
	
	public short getType(){
		if( x0==x1 ){
			if( y0==y1 ){
				return( POINT );
			}
			else{
				return( VERTICAL_LINE );
			}
		}
		else{ // x0!=x1
			if( y0==y1 ){
				return( HORIZONTAL_LINE );
			}
			else{
				return( DIAGONAL_LINE );
			}
		}
	}
	public boolean isPoint(){
		return( (getType()==POINT) );
	}
	public boolean isVertical(){
		return( (getType()==VERTICAL_LINE) );
	}
	public boolean isHorizontal(){
		return( (getType()==HORIZONTAL_LINE) );
	}
	public boolean isDiagonal(){
		return( (getType()==DIAGONAL_LINE) );
	}
	
	// return number of pixels
	public double getLength(){
		int xDiff = x1-x0+1;
		int yDiff = y1-y0+1;
		if( x0 == x1 ){
			return( (double)(Math.abs(yDiff)) );
		}
		else if( y0 == y1 ){
			return( (double)(Math.abs(xDiff)) );
		}
		else{
			return( Math.sqrt((double)(xDiff*xDiff + yDiff*yDiff)) );
		}
	}
}
