00001
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 ) const { return NULL; }
00027 virtual void _duplicate_attributes (const Geometry& );
00028
00029
00030 virtual void _rotateX (float );
00031 virtual void _rotateY (float );
00032 virtual void _rotateZ (float );
00033 virtual void _rotate (float ,const Vector3& );
00034 virtual void _rotate (const Matrix3&);
00035 virtual void _translate (float , float , float );
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);
00077
00078 virtual void randomSample (int mask, PointEnv& pe, double* pdf);
00079
00080 virtual bool randomDirection (const Vector3& pov,
00081 Vector3& dir,
00082 double* pdf)
00083 {
00084 return false;
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 };
00143
00144 #endif // CYLINDER_H