/***************************************************************************
                          kspluto.h  -  Trinity Desktop Planetarium
                             -------------------
    begin                : Mon Sep 24 2001
    copyright            : (C) 2001 by Jason Harris
    email                : kstars@30doradus.org
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

#ifndef KSPLUTO_H
#define KSPLUTO_H

#include "ksasteroid.h"

/**@class KSPluto
	*A subclass of KSAsteroid that represents the planet Pluto.  Now, we 
	*are certainly NOT claiming that Pluto is an asteroid.  However, the 
	*findPosition() routines of KSPlanet do not work properly for Pluto.
	*We had been using a unique polynomial expansion for Pluto, but even
	*this fails spectacularly for dates much more remote than a few 
	*hundred years.  We consider it better to instead treat Pluto's 
	*orbit much more simply, using elliptical orbital elements as we do 
	*for asteroids.  In order to improve the long-term accuracy of Pluto's
	*position, we are also including linear approximations of the evolution
	*of each orbital element with time.
	*
	*The orbital element data (including the time-derivatives) come from 
	*the NASA/JPL website:  http://ssd.jpl.nasa.gov/elem_planets.html
	*
	*@short Provides necessary information about Pluto.
	*@author Jason Harris
	*@version 1.0
	*/

class KStarsData;
class KSPluto : public KSAsteroid  {
public:
/**Constructor.  Calls KSAsteroid constructor with name="Pluto", and fills
	*in orbital element data (which is hard-coded for now).
	*@p kd pointer to the KStarsData object
	*@p fn filename of Pluto's image
	*@p pSize physical diameter of Pluto, in km
	*/
	KSPluto(KStarsData *kd, TQString fn="", double pSize=0);

/**Destructor (empty) */
	virtual ~KSPluto();

protected:
/**A custom findPosition() function for Pluto.  Computes the values of the 
	*orbital elements on the requested date, and calls KSAsteroid::findGeocentricPosition()
	*using those elements.
	*@param num time-dependent values for the desired date
	*@param Earth planet Earth (needed to calculate geocentric coords)
	*@return true if position was successfully calculated.
	*/
	virtual bool findGeocentricPosition( const KSNumbers *num, const KSPlanetBase *Earth=NULL );

private:
	//The base orbital elements for J2000 (these don't change with time)
	double a0, e0;
	dms i0, w0, M0, N0;

	//Rates-of-change for each orbital element
	double a1, e1, i1, w1, M1, N1;
};

#endif
