// Variations of Cylinder3D
template <class scalarT> class Cylinder3D;
typedef Cylinder3D<int>    iCylinder3D;
typedef Cylinder3D<float>  fCylinder3D;
typedef Cylinder3D<double> dCylinder3D;
typedef Cylinder3D<unsigned char> bCylinder4D;

///////////////////////////////////////////////////////////////////////////////
// Cylinder3D
// - Cylindrical coordinate in 3D space
///////////////////////////////////////////////////////////////////////////////
template <class scalarT>
class Cylinder3D
{
private:
   typedef Cylinder3D<scalarT> self;      // Shortcut type to simplify declarations
public:
   scalarT r,theta,z;                     // Radius, Rotation angle in radians, Z-distance

   // Constructors
   inline Cylinder3D() ; // Notice there is no "default" value of zero
   inline Cylinder3D(scalarT _r, scalarT _t, scalarT _z)          
   inline Cylinder3D(const self &v)                               
   // This is a shortcut for assignment that "looks" like a constructor
   inline void operator ()(scalarT _r, scalarT _t, scalarT _z)    

   // Set the values in degrees
   inline void setDegrees(scalarT _r, scalarT _t, scalarT _z)     

   // Function to return Vector3D
   inline Vector3D<scalar> getfVector3D() const 
   // Extractor to return Vector3D
   inline operator Vector3D<scalarT> () const 
};