00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef GEOM_COMPOSITE3_HH
00020 #define GEOM_COMPOSITE3_HH
00021
00022 #include <iostream>
00023 #include <vector>
00024 #include <boost/filesystem/path.hpp>
00025
00026 #include "vec3.hh"
00027 #include "mat3.hh"
00028 #include "quat.hh"
00029
00030 #include "module_config.hh"
00031
00032
00033
00034
00035
00036 namespace geom {
00037
00039 class DLLEXPORT_OST_GEOM Line3 {
00040 public:
00041 Line3();
00042 Line3(const Vec3& from, const Vec3& to);
00043
00044 Vec3 At(Real r) const;
00045 Vec3 GetOrigin() const;
00046 Vec3 GetDirection() const;
00047 private:
00048 Vec3 ori_,dir_;
00049 };
00050
00051 DLLEXPORT_OST_GEOM std::ostream& operator<<(std::ostream& s, const Line3& l);
00052
00053 class DLLEXPORT_OST_GEOM Plane {
00054 public:
00055 Plane():n_(Vec3(0,0,1)),p_(0){};
00057 Plane(const Vec3& p1, const Vec3& p2, const Vec3& p3);
00059 Plane(const Vec3& p, const Vec3& n);
00061 Plane(const Line3& l, const Vec3& p);
00063 Plane(Real a, Real b, Real c, Real d);
00065 Plane(Real x, Real y, Real z);
00066
00067 Vec3 GetOrigin() const { return -p_*n_; }
00068 Vec3 GetNormal() const;
00069 void SetNormal(const Vec3& n);
00070 Real GetP() const;
00071 void SetP(Real p) { p_=p; }
00072 Vec3 At(Real x, Real y) const;
00073
00074 enum PLANE_TYPE {
00075 YZ=0x1, ZY=0x1, XZ=0x2, ZX=0x2, XY=0x4, YX=0x4
00076 };
00077
00078 private:
00079
00080 Vec3 n_;
00081 Real p_;
00082 };
00083
00084 class DLLEXPORT_OST_GEOM Sphere {
00085 public:
00086 Sphere();
00087 Sphere(const Vec3& origin, Real r);
00088 Vec3 GetOrigin() const;
00089 Real GetRadius() const;
00090 void SetOrigin(const Vec3& v);
00091 void SetRadius(Real r);
00092
00093 private:
00094 Vec3 origin_;
00095 Real radius_;
00096 };
00097
00102 class DLLEXPORT_OST_GEOM CuboidAxis {
00103 public:
00104 CuboidAxis(): axis_(), half_extent_(0.0)
00105 { }
00106 CuboidAxis(const Vec3& axis, Real half_extent);
00107 const Vec3& GetVector() const { return axis_; }
00108 Real GetHalfExtent() const { return half_extent_; }
00109 Real GetExtent() const { return 2.0*half_extent_; }
00110 private:
00111 Vec3 axis_;
00112 Real half_extent_;
00113 };
00114
00116 class DLLEXPORT_OST_GEOM Cuboid {
00117 public:
00118 Cuboid();
00119 Cuboid(const Vec3& center, const CuboidAxis& a,
00120 const CuboidAxis& b, const CuboidAxis& c);
00121
00122 Vec3 GetHalfExtents() const
00123 {
00124 return Vec3(axes_[0].GetHalfExtent(), axes_[1].GetHalfExtent(),
00125 axes_[2].GetHalfExtent());
00126 }
00127
00128 Vec3 GetCenter() const
00129 {
00130 return center_;
00131 }
00132 const Vec3& GetVecA() const { return axes_[0].GetVector(); }
00133 const Vec3& GetVecB() const { return axes_[1].GetVector(); }
00134 const Vec3& GetVecC() const { return axes_[2].GetVector(); }
00135
00136 const CuboidAxis& GetAxisA() const { return axes_[0]; }
00137 const CuboidAxis& GetAxisB() const { return axes_[1]; }
00138 const CuboidAxis& GetAxisC() const { return axes_[2]; }
00139 private:
00140 Vec3 center_;
00141 CuboidAxis axes_[3];
00142 };
00143
00144 class DLLEXPORT_OST_GEOM Rotation3
00145 {
00146 public:
00147 Rotation3();
00148 Rotation3(Real phi, Real theta, Real psi,
00149 const Vec3& origin=Vec3(0.0,0.0,0.0));
00150 Rotation3(const Vec3& axis, Real angle,
00151 const Vec3& origin=Vec3(0.0,0.0,0.0));
00152 Rotation3(const Line3& line, Real angle);
00153 Rotation3(const Mat3& rot, const Vec3& origin=Vec3(0.0,0.0,0.0));
00154 Rotation3(const Quat& q, const Vec3& origin=Vec3(0.0,0.0,0.0));
00155 Vec3 GetOrigin() const;
00156 Real GetPhi() const;
00157 Real GetTheta() const;
00158 Real GetPsi() const;
00159 Quat GetQuat() const;
00160 Vec3 GetRotationAxis() const;
00161 Real GetRotationAngle() const;
00162 Mat3 GetRotationMatrix() const;
00163 void SetOrigin(const Vec3& o);
00164 void SetPhi(Real phi);
00165 void SetTheta(Real theta);
00166 void SetPsi(Real psi);
00167 void SetQuat(const Quat& q);
00168 void SetRotationAxis(const Vec3& v);
00169 void SetRotationAngle(Real angle);
00170 void SetRotationMatrix(const Mat3& rot);
00171 Vec3 Apply(const Vec3&) const;
00172 bool operator==(const Rotation3& rhs) const;
00173
00174 private:
00175 Quat generate_from_eulers(Real psi, Real theta, Real phi);
00176 Quat generate_from_axis_angle(const Vec3& axis, Real angle);
00177 Vec3 find_invariant_vector(Mat3 rot);
00178 Vec3 find_orthogonal_vector(const Vec3& xyz);
00179 Vec3 find_vector_for_BOD(const Vec3& xyz, const Vec3& uvw);
00180 Quat generate_from_matrix(const Mat3& rot);
00181 Real reduce_angle(Real ang) const;
00182 Quat q_;
00183 Vec3 origin_;
00184 };
00185
00186 typedef std::vector<Rotation3> Rotation3List;
00187
00188 DLLEXPORT_OST_GEOM Rotation3List ImportEulerAngles (const boost::filesystem::path& loc);
00189 DLLEXPORT_OST_GEOM void ExportEulerAngles (const Rotation3List& rot_list,
00190 const boost::filesystem::path& loc);
00191
00192 }
00193
00194 #endif