#ifndef ROOT_TView
#define ROOT_TView

//+SEQ,CopyRight,T=NOINCLUDE.

/////////////////////////////////////////////////////////////////////////
//                                                                     //
// TView                                                               //
//                                                                     //
/////////////////////////////////////////////////////////////////////////


#ifndef ROOT_TObject
//*KEEP,TObject.
#include "TObject.h"
//*KEND.
#endif

class TSeqCollection;

class TView : public TObject {


protected:
        Int_t           fSystem;           //Coordinate system
        Float_t         fLatitude;         //View angle latitude
        Float_t         fLongitude;        //View angle longitude
        Float_t         fPsi;              //View angle psi
        Float_t         fTN[12];           //
        Float_t         fTB[12];           //
        Float_t         fRmax[3];          //Upper limits of object
        Float_t         fRmin[3];          //Lower limits of object
        Float_t         fTnorm[12];        //Transformation matrix
        Float_t         fTback[12];        //Back transformation matrix
        Float_t         fX1[3];            //First coordinate of X axis
        Float_t         fX2[3];            //Second coordinate of X axis
        Float_t         fY1[3];            //First coordinate of Y axis
        Float_t         fY2[3];            //Second coordinate of Y axis
        Float_t         fZ1[3];            //First coordinate of Z axis
        Float_t         fZ2[3];            //Second coordinate of Z axis
        TSeqCollection *fOutline;          //Collection of outline's objects
        Bool_t          fDefaultOutline;   //Set to TRUE if outline is default cube
        Bool_t          fAutoRange;        //Set to TRUE if range computed automatically
        void            ResetView(Float_t longitude, Float_t latitude, Float_t psi, Int_t &irep);


public:
                TView();
                TView(Int_t system);
                TView(Float_t *rmin, Float_t *rmax, Int_t system = 1);
virtual         ~TView();
   virtual void AxisVertex(Float_t ang, Float_t *av, Int_t &ix1, Int_t &ix2, Int_t &iy1, Int_t &iy2, Int_t &iz1, Int_t &iz2);
   virtual void DefineViewDirection(Float_t *s, Float_t *c,
                                    Double_t cosphi, Double_t sinphi,
                                    Double_t costhe, Double_t sinthe,
                                    Double_t cospsi, Double_t sinpsi,
                                    Float_t *tnorm,  Float_t *tback);
   virtual void  ExecuteEvent(Int_t event, Int_t px, Int_t py);
   virtual void  ExecuteRotateView(Int_t event, Int_t px, Int_t py);
   virtual void  FindScope(Float_t *scale, Float_t *center, Int_t &irep);
   virtual Int_t GetDistancetoAxis(Int_t axis, Int_t px, Int_t py, Float_t &ratio);
Bool_t           GetAutoRange() {return fAutoRange;}
Float_t          GetLatitude() {return fLatitude;}
Float_t          GetLongitude() {return fLongitude;}
Float_t          GetPsi() {return fPsi;}
   virtual void  GetRange (Float_t *min, Float_t *max);
Float_t         *GetRmax() {return fRmax;}
Float_t         *GetRmin() {return fRmin;}
TSeqCollection  *GetOutline() {return fOutline; }
Float_t         *GetTN() {return fTN;}
Float_t         *GetTnorm() {return fTnorm;}
  Int_t          GetSystem() {return fSystem;}
   virtual void  FindNormal(Float_t x, Float_t  y, Float_t z, Float_t &zn);
   virtual void  FindPhiSectors(Int_t iopt, Int_t &kphi, Float_t *aphi, Int_t &iphi1, Int_t &iphi2);
   virtual void  FindThetaSectors(Int_t iopt, Float_t phi, Int_t &kth, Float_t *ath, Int_t &ith1, Int_t &ith2);
   virtual void  NDCtoWC(Float_t *pn, Float_t *pw);
   virtual void  NormalWCtoNDC(Float_t *pw, Float_t *pn);
   virtual void  PadRange(Float_t rback);
   virtual void  SetAutoRange(Bool_t autorange=kTRUE) {fAutoRange=autorange;}
   virtual void  SetAxisNDC(Float_t *x1, Float_t *x2, Float_t *y1, Float_t *y2, Float_t *z1, Float_t *z2);
   void          SetLatitude(Float_t latitude) {fLatitude = latitude;}
   void          SetLongitude(Float_t longitude) {fLongitude = longitude;}
   void          SetPsi(Float_t psi) {fPsi = psi;}
   virtual void  SetOutlineToCube();
   virtual void  SetRange(Float_t *min, Float_t *max);
   virtual void  SetRange(Float_t x0, Float_t y0, Float_t z0, Float_t x1, Float_t y1, Float_t z1, Int_t flag=0);
   virtual void  SetSystem(Int_t system) {fSystem = system;}
   virtual void  SetView(Float_t longitude, Float_t latitude, Float_t psi, Int_t &irep);
   virtual void  WCtoNDC(Float_t *pw, Float_t *pn);

   ClassDef(TView,1)  //3-D View
};

#endif