32 #include <mt/exception.h>
81 bool operator==(
const Sphere3& s)
const;
82 bool operator!=(
const Sphere3& s)
const;
100 const Point3& getCenterRef()
const;
102 Scalar getRadius()
const;
103 Scalar& getRadiusRef();
104 const Scalar& getRadiusRef()
const;
106 void setCenter(
const Point3& center);
142 std::ostream& operator<<(std::ostream& os,
153 Scalar distance(
const Point3& p,
157 Scalar distance(
const Sphere3& s,
167 m_center(0.0, 0.0, 0.0),
173 m_radius(abs(radius)) {}
178 inline bool Sphere3::operator==(
const Sphere3& s)
const
180 return (m_center == s.m_center) && (m_radius == s.m_radius);
184 inline bool Sphere3::operator!=(
const Sphere3& s)
const
186 return !(*
this == s);
198 const value_t ep = std::numeric_limits<value_t>::epsilon();
199 if (getValue(m_center.
distance(p)) < ep)
202 const Vector3 pert = Scalar(1000.0) * ep *
Unit3(1.0, 0.0, 0.0);
206 if (m_radius == Scalar(0.0))
214 const Unit3 dist_center(p_temp - m_center);
215 return m_center + m_radius * dist_center;
222 const Scalar dist_center(length(p - m_center));
223 return dist_center - m_radius;
229 inline Point3 Sphere3::getCenter()
const
235 inline Point3& Sphere3::getCenterRef()
241 inline const Point3& Sphere3::getCenterRef()
const
247 inline Scalar Sphere3::getRadius()
const
253 inline Scalar& Sphere3::getRadiusRef()
259 inline const Scalar& Sphere3::getRadiusRef()
const
265 inline void Sphere3::setCenter(
const Point3& center)
273 m_radius = abs(radius);
280 m_radius = abs(radius);
288 return m_radius == Scalar(0.0);
296 inline std::ostream& operator<<(std::ostream& os,
299 return os <<
"center: " << s.getCenter() <<
' '
300 <<
"radius: " << s.getRadius();
306 inline Point3 project(
const Point3& p,
313 inline Scalar distance(
const Point3& p,
316 return s.distance(p);
320 inline Scalar distance(
const Sphere3& s,
323 return s.distance(p);
328 #endif // MT_SPHERE3_H