/**
 * Copyright (C) 2010 IBM Corporation
 */
package org.eclipse.stem.loggers.imagewriter.logger.projections;

import java.awt.geom.Point2D;

import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;



/**
 * Implementation of Equirectangular map projection.  
 * In terms of the existing coordinate system implied
 * in the Globe system, this projection does nothing as
 * this is the implied base coordinate system
 * 
 * @see http://mathworld.wolfram.com/EquirectangularProjection.html
 *
 */
public class Equirectangular implements IMapProjection
{
	/**
	 * 
	 */
	public Equirectangular()
	{
		super();
	}

	/* (non-Javadoc)
	 * @see com.ibm.almaden.omniglobe.projection.IMapProjection#project(java.awt.geom.Point2D)
	 */
	public double[] project(double lat, double lon) 
	{
		return new double[] {lat,lon};
	}

	/* (non-Javadoc)
	 * @see com.ibm.almaden.omniglobe.projection.IMapProjection#project(java.awt.geom.Point2D, java.awt.geom.Point2D, boolean)
	 */
	public double[] project(double lat, double lon, double lat0, double lon0, boolean distort) 
	{
		return project(lat,lon);
	}

	/* (non-Javadoc)
	 * @see com.ibm.almaden.omniglobe.projection.IMapProjection#inverseProject(java.awt.geom.Point2D)
	 */
	public double[] inverseProject(double lat, double lon)
	{
		return new double[] {lat,lon};
	}
	
	/* (non-Javadoc)
	 * @see com.ibm.almaden.omniglobe.projection.IMapProjection#inverseProject(java.awt.geom.Point2D, java.awt.geom.Point2D, boolean)
	 */
	public double[] inverseProject(double lat, double lon, double lat0, double lon0, boolean distort)
	{
		return inverseProject(lat, lon);
	}
	
	/* (non-Javadoc)
	 * @see com.ibm.almaden.omniglobe.projection.IMapProjection#setOrigin(java.awt.geom.Point2D)
	 */
	public void setOrigin(double lat, double lon)
	{
		//projection is not origin-dependent
		//does nothing
	}
	
	/* (non-Javadoc)
	 * @see com.ibm.almaden.omniglobe.projection.IMapProjection#getBounds()
	 */
	public Rectangle getBounds() 
	{
		return new Rectangle(-180,90,360,180);
	}

}
