/***************************************************************************
                          kspluto.h  -  K 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 KSPluto : public KSAsteroid  {
public:
    /**Constructor.  Calls KSAsteroid constructor with name="Pluto", and fills
    	*in orbital element data (which is hard-coded for now).
    	*@param kd pointer to the KStarsData object
    	*@param fn filename of Pluto's image
    	*@param pSize physical diameter of Pluto, in km
    	*/
    explicit KSPluto(const QString &fn=QString(), double pSize=0);

    virtual KSPluto* clone() const;
    
    /**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:
    virtual void findMagnitude(const KSNumbers*);

    //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
