Cylinder.h

Go to the documentation of this file.
00001 /* $Id:$ */
00002 
00003 #ifndef CYLINDER_H
00004 #define CYLINDER_H
00005 
00006 #include <esg/geometry/Geometry.h>
00007 
00008 namespace esg {
00009 
00015 class Cylinder : public Geometry {
00016 protected:
00017         double  _radius;     
00018         double  _radiusSqr;  
00019         Vector3 _cap1Point;  
00020         Vector3 _cap1Normal; 
00021         Vector3 _cap2Point;  
00022         Vector3 _cap2Normal; 
00023         Vector3 _axis;       
00024         
00025 protected:
00026         virtual Mesh* _mesh (int /*density*/) const { return NULL; } // TO DO !
00027         virtual void  _duplicate_attributes (const Geometry& /* src */);
00028     
00029         // Geometric transformations
00030         virtual void  _rotateX   (float /* angle */);
00031         virtual void  _rotateY   (float /* angle */);
00032         virtual void  _rotateZ   (float /* angle */);
00033         virtual void  _rotate    (float /* angle */,const Vector3& /* axis */);
00034         virtual void  _rotate    (const Matrix3&);
00035         virtual void  _translate (float /* x */, float /* y */, float /* z */);
00036         virtual void  _transform (const Matrix4&);
00037         virtual void  _scale     (float);
00038 
00039     
00040 public:
00046         Cylinder();
00047 
00059         Cylinder(const Vector3& point1,
00060                  const Vector3& normal1,
00061                  const Vector3& point2,
00062                  const Vector3& normal2,
00063                  double         radius);
00064 
00068         virtual ~Cylinder() {}
00069 
00070         virtual void rayIntersection (PointEnv*      pPE,
00071                                       int            mask,
00072                                       const Vector3& origin,
00073                                       const Vector3& direction,
00074                                       float          maxD = MAXFLOAT);
00075 
00076         virtual bool mapToUV (const Vector3& v, Vector2& uv); // to do 
00077         
00078         virtual void randomSample (int mask, PointEnv& pe, double* pdf); // to do
00079 
00080         virtual bool randomDirection (const Vector3& pov,
00081                                       Vector3&       dir,
00082                                       double*        pdf)
00083               {
00084                   return false; // TO DO!
00085               }
00086 
00087         virtual Interval extent (const Vector3& direction) const;
00088 
00089         virtual Vector3 centroid (void) const;
00090 
00091         virtual double radius (const Vector3& centroid) const; 
00092         
00093         virtual double radius (void) const;
00094 
00095         virtual Geometry* clone (const Matrix4* pTrMat) const;
00096 
00097         virtual bool separation (Geometry& geom, Vector3*  pDir);
00098 
00099         virtual double distance (const Geometry& geom, Vector3* pDir);
00100 
00101         virtual void dump (const char* intent, const char* tab);
00102 
00103     
00107         double getRadius() const { return _radius; }
00108         
00112         void setRadius(double radius) {
00113             _radius = radius;
00114             _radiusSqr = radius * radius;
00115         }
00116 
00121         void setFirstCap(const Vector3& center, const Vector3& normal) {
00122             _cap1Point.set(center);
00123             _cap1Normal.set(normal);
00124             _axis.set(_cap2Point);
00125             _axis.sub(_cap1Point);
00126             _axis.normalize();
00127         }
00128 
00133         void setSecondCap(const Vector3& center, const Vector3& normal) {
00134             _cap2Point.set(center);
00135             _cap2Normal.set(normal);
00136             _axis.set(_cap2Point);
00137             _axis.sub(_cap1Point);
00138             _axis.normalize();
00139         }
00140 };
00141     
00142 }; // namespace
00143 
00144 #endif // CYLINDER_H

Generated on Wed Jun 28 12:24:28 2006 for esg by  doxygen 1.4.6