24 #ifndef MT_CYLINDER3_H
25 #define MT_CYLINDER3_H
32 #include <mt/exception.h>
86 bool operator==(
const Cylinder3& c)
const;
87 bool operator!=(
const Cylinder3& c)
const;
103 Line3 getAxis()
const;
105 const Line3& getAxisRef()
const;
107 Scalar getRadius()
const;
108 Scalar& getRadiusRef();
109 const Scalar& getRadiusRef()
const;
111 void setAxis(
const Line3& axis);
147 std::ostream& operator<<(std::ostream& os,
158 Scalar distance(
const Point3& p,
162 Scalar distance(
const Sphere3& s,
178 m_radius(abs(radius)) {}
183 inline bool Cylinder3::operator==(
const Cylinder3& c)
const
185 return (m_axis == c.m_axis) && (m_radius == c.m_radius);
189 inline bool Cylinder3::operator!=(
const Cylinder3& c)
const
191 return !(*
this == c);
204 const value_t ep = std::numeric_limits<value_t>::epsilon();
205 if (getValue(m_axis.
distance(proj_axis)) < ep)
214 if (m_radius == Scalar(0.0))
222 const Unit3 dist_axis(p - proj_axis);
223 return proj_axis + m_radius * dist_axis;
234 const Scalar dist_axis(length(p - proj_axis));
235 return dist_axis - m_radius;
241 inline Line3 Cylinder3::getAxis()
const
247 inline Line3& Cylinder3::getAxisRef()
253 inline const Line3& Cylinder3::getAxisRef()
const
259 inline Scalar Cylinder3::getRadius()
const
265 inline Scalar& Cylinder3::getRadiusRef()
271 inline const Scalar& Cylinder3::getRadiusRef()
const
277 inline void Cylinder3::setAxis(
const Line3& axis)
285 m_radius = abs(radius);
292 m_radius = abs(radius);
300 return m_radius == Scalar(0.0);
308 inline std::ostream& operator<<(std::ostream& os,
311 return os <<
"axis: " << c.getAxis() <<
' '
312 <<
"radius: " << c.getRadius();
318 inline Point3 project(
const Point3& p,
325 inline Scalar distance(
const Point3& p,
328 return c.distance(p);
332 inline Scalar distance(
const Cylinder3& c,
335 return c.distance(p);
340 #endif // MT_CYLINDER3_H