// @(#)root/geom:$Id$
// Author: Andrei Gheata   31/01/02

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TGeoCone
#define ROOT_TGeoCone

#ifndef ROOT_TGeoBBox
#include "TGeoBBox.h"
#endif



////////////////////////////////////////////////////////////////////////////
//                                                                        //
// TGeoCone - conical tube  class. It has 5 parameters :                  //
//            dz - half length in z                                       //
//            Rmin1, Rmax1 - inside and outside radii at -dz              //
//            Rmin2, Rmax2 - inside and outside radii at +dz              //
//                                                                        //
////////////////////////////////////////////////////////////////////////////


class TGeoCone : public TGeoBBox
{
protected :
// data members
   Double_t              fDz;    // half length
   Double_t              fRmin1; // inner radius at -dz
   Double_t              fRmax1; // outer radius at -dz
   Double_t              fRmin2; // inner radius at +dz
   Double_t              fRmax2; // outer radius at +dz
// methods
public:
   // constructors
   TGeoCone();
   TGeoCone(Double_t dz, Double_t rmin1, Double_t rmax1,
            Double_t rmin2, Double_t rmax2);
   TGeoCone(const char *name, Double_t dz, Double_t rmin1, Double_t rmax1,
            Double_t rmin2, Double_t rmax2);
   TGeoCone(Double_t *params);
   // destructor
   virtual ~TGeoCone();
   // methods

   virtual Double_t      Capacity() const;
   static  Double_t      Capacity(Double_t dz, Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2);
   virtual void          ComputeBBox();
   virtual void          ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm);
   virtual void          ComputeNormal_v(const Double_t *points, const Double_t *dirs, Double_t *norms, Int_t vecsize);
   static  void          ComputeNormalS(const Double_t *point, const Double_t *dir, Double_t *norm,
                                        Double_t dz, Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2);
   virtual Bool_t        Contains(const Double_t *point) const;
   virtual void          Contains_v(const Double_t *points, Bool_t *inside, Int_t vecsize) const;
   virtual Int_t         DistancetoPrimitive(Int_t px, Int_t py);
   static  void          DistToCone(const Double_t *point, const Double_t *dir, Double_t dz, Double_t r1, Double_t r2, Double_t &b, Double_t &delta);
   static  Double_t      DistFromInsideS(const Double_t *point, const Double_t *dir, Double_t dz,
                                    Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2);
   virtual Double_t      DistFromInside(const Double_t *point, const Double_t *dir, Int_t iact=1,
                                   Double_t step=TGeoShape::Big(), Double_t *safe=0) const;
   virtual void          DistFromInside_v(const Double_t *points, const Double_t *dirs, Double_t *dists, Int_t vecsize, Double_t *step) const;
   static  Double_t      DistFromOutsideS(const Double_t *point, const Double_t *dir, Double_t dz,
                                   Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2);
   virtual Double_t      DistFromOutside(const Double_t *point, const Double_t *dir, Int_t iact=1,
                                   Double_t step=TGeoShape::Big(), Double_t *safe=0) const;
   virtual void          DistFromOutside_v(const Double_t *points, const Double_t *dirs, Double_t *dists, Int_t vecsize, Double_t *step) const;
   virtual TGeoVolume   *Divide(TGeoVolume *voldiv, const char *divname, Int_t iaxis, Int_t ndiv,
                                Double_t start, Double_t step);

   virtual const char   *GetAxisName(Int_t iaxis) const;
   virtual Double_t      GetAxisRange(Int_t iaxis, Double_t &xlo, Double_t &xhi) const;
   virtual void          GetBoundingCylinder(Double_t *param) const;
   virtual Int_t         GetByteCount() const {return 56;}
   virtual const TBuffer3D &GetBuffer3D(Int_t reqSections, Bool_t localFrame) const;
   virtual Double_t      GetDz() const    {return fDz;}
   virtual TGeoShape    *GetMakeRuntimeShape(TGeoShape *mother, TGeoMatrix *mat) const;
   virtual void          GetMeshNumbers(Int_t &nvert, Int_t &nsegs, Int_t &npols) const;
   virtual Int_t         GetNmeshVertices() const;
   virtual Bool_t        GetPointsOnSegments(Int_t npoints, Double_t *array) const;
   virtual Double_t      GetRmin1() const {return fRmin1;}
   virtual Double_t      GetRmax1() const {return fRmax1;}
   virtual Double_t      GetRmin2() const {return fRmin2;}
   virtual Double_t      GetRmax2() const {return fRmax2;}

   virtual void          InspectShape() const;
   virtual Bool_t        IsCylType() const {return kTRUE;}
   virtual TBuffer3D    *MakeBuffer3D() const;
   virtual Double_t      Safety(const Double_t *point, Bool_t in=kTRUE) const;
   virtual void          Safety_v(const Double_t *points, const Bool_t *inside, Double_t *safe, Int_t vecsize) const;
   static  Double_t      SafetyS(const Double_t *point, Bool_t in, Double_t dz, Double_t rmin1, Double_t rmax1,
                                 Double_t rmin2, Double_t rmax2, Int_t skipz=0);
   virtual void          SavePrimitive(std::ostream &out, Option_t *option = "");
   void                  SetConeDimensions(Double_t dz, Double_t rmin1, Double_t rmax1,
                                       Double_t rmin2, Double_t rmax2);
   virtual void          SetDimensions(Double_t *param);
   virtual void          SetPoints(Double_t *points) const;
   virtual void          SetPoints(Float_t *points) const;
   virtual void          SetSegsAndPols(TBuffer3D &buffer) const;
   virtual void          Sizeof3D() const;

   ClassDef(TGeoCone, 1)         // conical tube class

};

////////////////////////////////////////////////////////////////////////////
//                                                                        //
// TGeoConeSeg - a phi segment of a conical tube. Has 7 parameters :      //
//            - the same 5 as a cone;                                     //
//            - first phi limit (in degrees)                              //
//            - second phi limit                                          //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

class TGeoConeSeg : public TGeoCone
{
protected:
   // data members
   Double_t              fPhi1;  // first phi limit
   Double_t              fPhi2;  // second phi limit
   // Transient trigonometric data
   Double_t              fS1;    //!sin(phi1)
   Double_t              fC1;    //!cos(phi1)
   Double_t              fS2;    //!sin(phi2)
   Double_t              fC2;    //!cos(phi2)
   Double_t              fSm;    //!sin(0.5*(phi1+phi2))
   Double_t              fCm;    //!cos(0.5*(phi1+phi2))
   Double_t              fCdfi;  //!cos(0.5*(phi1-phi2))

   void                  InitTrigonometry();

public:
   // constructors
   TGeoConeSeg();
   TGeoConeSeg(Double_t dz, Double_t rmin1, Double_t rmax1,
               Double_t rmin2, Double_t rmax2, Double_t phi1, Double_t phi2);
   TGeoConeSeg(const char *name, Double_t dz, Double_t rmin1, Double_t rmax1,
               Double_t rmin2, Double_t rmax2, Double_t phi1, Double_t phi2);
   TGeoConeSeg(Double_t *params);
   // destructor
   virtual ~TGeoConeSeg();
   // methods
   virtual void          AfterStreamer();
   virtual Double_t      Capacity() const;
   static  Double_t      Capacity(Double_t dz, Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2, Double_t phi1, Double_t phi2);
   virtual void          ComputeBBox();
   virtual void          ComputeNormal(const Double_t *point, const Double_t *dir, Double_t *norm);
   virtual void          ComputeNormal_v(const Double_t *points, const Double_t *dirs, Double_t *norms, Int_t vecsize);
   static  void          ComputeNormalS(const Double_t *point, const Double_t *dir, Double_t *norm,
                                        Double_t dz, Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2,
                                        Double_t c1, Double_t s1, Double_t c2, Double_t s2);
   virtual Bool_t        Contains(const Double_t *point) const;
   virtual void          Contains_v(const Double_t *points, Bool_t *inside, Int_t vecsize) const;

   virtual Int_t         DistancetoPrimitive(Int_t px, Int_t py);
   static  Double_t      DistToCons(const Double_t *point, const Double_t *dir, Double_t r1, Double_t z1, Double_t r2, Double_t z2, Double_t phi1, Double_t phi2);
   static  Double_t      DistFromInsideS(const Double_t *point, const Double_t *dir, Double_t dz, Double_t rmin1, Double_t rmax1,
                                   Double_t rmin2, Double_t rmax2, Double_t c1, Double_t s1, Double_t c2, Double_t s2, Double_t cm, Double_t sm, Double_t cdfi);
   virtual Double_t      DistFromInside(const Double_t *point, const Double_t *dir, Int_t iact=1,
                                   Double_t step=TGeoShape::Big(), Double_t *safe=0) const;
   virtual void          DistFromInside_v(const Double_t *points, const Double_t *dirs, Double_t *dists, Int_t vecsize, Double_t *step) const;
   static  Double_t      DistFromOutsideS(const Double_t *point, const Double_t *dir, Double_t dz, Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2,
                                   Double_t c1, Double_t s1, Double_t c2, Double_t s2, Double_t cm, Double_t sm, Double_t cdfi);
   virtual Double_t      DistFromOutside(const Double_t *point, const Double_t *dir, Int_t iact=1,
                                   Double_t step=TGeoShape::Big(), Double_t *safe=0) const;
   virtual void          DistFromOutside_v(const Double_t *points, const Double_t *dirs, Double_t *dists, Int_t vecsize, Double_t *step) const;
   virtual TGeoVolume   *Divide(TGeoVolume *voldiv, const char *divname, Int_t iaxis, Int_t ndiv,
                                Double_t start, Double_t step);
   virtual Double_t      GetAxisRange(Int_t iaxis, Double_t &xlo, Double_t &xhi) const;
   virtual void          GetBoundingCylinder(Double_t *param) const;
   virtual const TBuffer3D &GetBuffer3D(Int_t reqSections, Bool_t localFrame) const;
   virtual Int_t         GetByteCount() const {return 64;}
   virtual TGeoShape    *GetMakeRuntimeShape(TGeoShape *mother, TGeoMatrix *mat) const;
   virtual void          GetMeshNumbers(Int_t &nvert, Int_t &nsegs, Int_t &npols) const;
   virtual Int_t         GetNmeshVertices() const;
   virtual Bool_t        GetPointsOnSegments(Int_t npoints, Double_t *array) const;
   Double_t              GetPhi1() const {return fPhi1;}
   Double_t              GetPhi2() const {return fPhi2;}
   virtual void          InspectShape() const;
   virtual TBuffer3D    *MakeBuffer3D() const;
   virtual Double_t      Safety(const Double_t *point, Bool_t in=kTRUE) const;
   virtual void          Safety_v(const Double_t *points, const Bool_t *inside, Double_t *safe, Int_t vecsize) const;
   static  Double_t      SafetyS(const Double_t *point, Bool_t in, Double_t dz, Double_t rmin1, Double_t rmax1,
                                 Double_t rmin2, Double_t rmax2, Double_t phi1, Double_t phi2, Int_t skipz=0);
   virtual void          SavePrimitive(std::ostream &out, Option_t *option = "");
   void                  SetConsDimensions(Double_t dz, Double_t rmin1, Double_t rmax1,
                                       Double_t rmin2, Double_t rmax2, Double_t phi1, Double_t phi2);
   virtual void          SetDimensions(Double_t *param);
   virtual void          SetPoints(Double_t *points) const;
   virtual void          SetPoints(Float_t *points) const;
   virtual void          SetSegsAndPols(TBuffer3D &buffer) const;
   virtual void          Sizeof3D() const;

   ClassDef(TGeoConeSeg, 1)         // conical tube segment class
};

#endif
 TGeoCone.h:1
 TGeoCone.h:2
 TGeoCone.h:3
 TGeoCone.h:4
 TGeoCone.h:5
 TGeoCone.h:6
 TGeoCone.h:7
 TGeoCone.h:8
 TGeoCone.h:9
 TGeoCone.h:10
 TGeoCone.h:11
 TGeoCone.h:12
 TGeoCone.h:13
 TGeoCone.h:14
 TGeoCone.h:15
 TGeoCone.h:16
 TGeoCone.h:17
 TGeoCone.h:18
 TGeoCone.h:19
 TGeoCone.h:20
 TGeoCone.h:21
 TGeoCone.h:22
 TGeoCone.h:23
 TGeoCone.h:24
 TGeoCone.h:25
 TGeoCone.h:26
 TGeoCone.h:27
 TGeoCone.h:28
 TGeoCone.h:29
 TGeoCone.h:30
 TGeoCone.h:31
 TGeoCone.h:32
 TGeoCone.h:33
 TGeoCone.h:34
 TGeoCone.h:35
 TGeoCone.h:36
 TGeoCone.h:37
 TGeoCone.h:38
 TGeoCone.h:39
 TGeoCone.h:40
 TGeoCone.h:41
 TGeoCone.h:42
 TGeoCone.h:43
 TGeoCone.h:44
 TGeoCone.h:45
 TGeoCone.h:46
 TGeoCone.h:47
 TGeoCone.h:48
 TGeoCone.h:49
 TGeoCone.h:50
 TGeoCone.h:51
 TGeoCone.h:52
 TGeoCone.h:53
 TGeoCone.h:54
 TGeoCone.h:55
 TGeoCone.h:56
 TGeoCone.h:57
 TGeoCone.h:58
 TGeoCone.h:59
 TGeoCone.h:60
 TGeoCone.h:61
 TGeoCone.h:62
 TGeoCone.h:63
 TGeoCone.h:64
 TGeoCone.h:65
 TGeoCone.h:66
 TGeoCone.h:67
 TGeoCone.h:68
 TGeoCone.h:69
 TGeoCone.h:70
 TGeoCone.h:71
 TGeoCone.h:72
 TGeoCone.h:73
 TGeoCone.h:74
 TGeoCone.h:75
 TGeoCone.h:76
 TGeoCone.h:77
 TGeoCone.h:78
 TGeoCone.h:79
 TGeoCone.h:80
 TGeoCone.h:81
 TGeoCone.h:82
 TGeoCone.h:83
 TGeoCone.h:84
 TGeoCone.h:85
 TGeoCone.h:86
 TGeoCone.h:87
 TGeoCone.h:88
 TGeoCone.h:89
 TGeoCone.h:90
 TGeoCone.h:91
 TGeoCone.h:92
 TGeoCone.h:93
 TGeoCone.h:94
 TGeoCone.h:95
 TGeoCone.h:96
 TGeoCone.h:97
 TGeoCone.h:98
 TGeoCone.h:99
 TGeoCone.h:100
 TGeoCone.h:101
 TGeoCone.h:102
 TGeoCone.h:103
 TGeoCone.h:104
 TGeoCone.h:105
 TGeoCone.h:106
 TGeoCone.h:107
 TGeoCone.h:108
 TGeoCone.h:109
 TGeoCone.h:110
 TGeoCone.h:111
 TGeoCone.h:112
 TGeoCone.h:113
 TGeoCone.h:114
 TGeoCone.h:115
 TGeoCone.h:116
 TGeoCone.h:117
 TGeoCone.h:118
 TGeoCone.h:119
 TGeoCone.h:120
 TGeoCone.h:121
 TGeoCone.h:122
 TGeoCone.h:123
 TGeoCone.h:124
 TGeoCone.h:125
 TGeoCone.h:126
 TGeoCone.h:127
 TGeoCone.h:128
 TGeoCone.h:129
 TGeoCone.h:130
 TGeoCone.h:131
 TGeoCone.h:132
 TGeoCone.h:133
 TGeoCone.h:134
 TGeoCone.h:135
 TGeoCone.h:136
 TGeoCone.h:137
 TGeoCone.h:138
 TGeoCone.h:139
 TGeoCone.h:140
 TGeoCone.h:141
 TGeoCone.h:142
 TGeoCone.h:143
 TGeoCone.h:144
 TGeoCone.h:145
 TGeoCone.h:146
 TGeoCone.h:147
 TGeoCone.h:148
 TGeoCone.h:149
 TGeoCone.h:150
 TGeoCone.h:151
 TGeoCone.h:152
 TGeoCone.h:153
 TGeoCone.h:154
 TGeoCone.h:155
 TGeoCone.h:156
 TGeoCone.h:157
 TGeoCone.h:158
 TGeoCone.h:159
 TGeoCone.h:160
 TGeoCone.h:161
 TGeoCone.h:162
 TGeoCone.h:163
 TGeoCone.h:164
 TGeoCone.h:165
 TGeoCone.h:166
 TGeoCone.h:167
 TGeoCone.h:168
 TGeoCone.h:169
 TGeoCone.h:170
 TGeoCone.h:171
 TGeoCone.h:172
 TGeoCone.h:173
 TGeoCone.h:174
 TGeoCone.h:175
 TGeoCone.h:176
 TGeoCone.h:177
 TGeoCone.h:178
 TGeoCone.h:179
 TGeoCone.h:180
 TGeoCone.h:181
 TGeoCone.h:182
 TGeoCone.h:183
 TGeoCone.h:184
 TGeoCone.h:185
 TGeoCone.h:186
 TGeoCone.h:187
 TGeoCone.h:188
 TGeoCone.h:189
 TGeoCone.h:190
 TGeoCone.h:191
 TGeoCone.h:192
 TGeoCone.h:193
 TGeoCone.h:194
 TGeoCone.h:195
 TGeoCone.h:196
 TGeoCone.h:197
 TGeoCone.h:198
 TGeoCone.h:199
 TGeoCone.h:200
 TGeoCone.h:201
 TGeoCone.h:202
 TGeoCone.h:203