
package jp.riken.brain.ni.samuraigraph.base;


/**
 * 軸クラス
 */

public class SGAxis
{

	/**
	 * リニアスケール
	 */
	public static final int LINEAR_TYPE = 0;


	/**
	 * ログスケール
	 */
	public static final int LOG_TYPE = 1;


	/**
	 * スケールの種類
	 */
	private int mScaleType = LINEAR_TYPE;


	/**
	 * スケール最小値
	 */
	private double mMinValue;


	/**
	 * スケール最大値
	 */
	private double mMaxValue;




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



	/**
	 * レンジの設定
	 * @param minValue 最小値
	 * @param maxValue 最大値
	 * @return true:成功、false:失敗
	 */
	public boolean setRange(
		final double minValue, final double maxValue )
	{
		if( minValue > maxValue )
		{
			new IllegalArgumentException("minValue > maxValue");
		}

		mMinValue = minValue;
		mMaxValue = maxValue;
		return true;
	}


	/**
	 * 
	 */
	public boolean setRange( final SGTuple2d range )
	{
		return this.setRange( range.x, range.y );
	}


	/**
	 * スケールタイプの設定
	 * @param scaleType スケールのタイプ
	 */
	public void setScaleType( final int scaleType )
	{
		if( scaleType!= LINEAR_TYPE && scaleType!=LOG_TYPE )
		{
			new IllegalArgumentException("scale type is incorrect");
		}

		if( scaleType == LOG_TYPE )
		{
			if( mMinValue < 0.0 )
			{
				new IllegalArgumentException("mMinValue < 0.0 : cannot set log-type scale");
			}
		}

		mScaleType = scaleType;
	}


	/**
	 * 
	 */
	public double getMinValue()
	{
		return this.mMinValue;
	}
	
	
	/**
	 * 
	 */
	public double getMaxValue()
	{
		return this.mMaxValue;
	}


	/**
	 * レンジの取得
	 */
	public SGTuple2d getRange()
	{
		final SGTuple2d range = new SGTuple2d( mMinValue, mMaxValue );
		return range;
	}


	/**
	 * スケールタイプの取得
	 */
	public int getScaleType()
	{
		return mScaleType;
	}


	/**
	 * 
	 */
	public boolean insideRange( final double value )
	{
		if( value < this.mMinValue || value > this.mMaxValue )
		{
			return false;
		}
	
		return true;		
	}



	/**
	 * 
	 * @param axis
	 * @param value
	 * @return
	 */
	public boolean isValidValue( final double value )
	{
		final int type = this.getScaleType();

		if( type == SGAxis.LOG_TYPE )
		{
			if( value <= 0.0 )
			{
				return false;
			}
		}

		return true;
	}



}

