32 #include <mt/exception.h>
96 bool operator==(
const Circle3& c)
const;
97 bool operator!=(
const Circle3& c)
const;
111 const Point3& getCenterRef()
const;
113 Scalar getRadius()
const;
114 Scalar& getRadiusRef();
115 const Scalar& getRadiusRef()
const;
117 Unit3 getNormal()
const;
118 Unit3& getNormalRef();
119 const Unit3& getNormalRef()
const;
121 Plane3 getSupportPlane()
const;
123 void setCenter(
const Point3& center);
130 void setNormal(
const Unit3& normal);
136 const Scalar& radius,
137 const Unit3& normal);
166 std::ostream& operator<<(std::ostream& os,
177 Scalar distance(
const Point3& p,
181 Scalar distance(
const Circle3& s,
191 m_center(0.0, 0.0, 0.0),
193 m_normal(0.0, 0.0, 1.0) {}
197 const Scalar& radius,
198 const Unit3& normal) :
201 m_radius(abs(radius)),
208 const Point3 center(sphere.getCenter());
209 const Scalar radius(sphere.getRadius());
215 const Scalar dist(length(proj_center - center));
218 util::Assert(dist <= radius,
Exception(
"Cannot construct circle, \
219 input plane and sphere do not intersect"));
222 const Scalar circle_radius(sqrt(sq(radius) - sq(dist)));
232 inline bool Circle3::operator==(
const Circle3& c)
const
234 return (m_center == c.m_center) &&
235 (m_radius == c.m_radius) &&
236 (m_normal == c.m_normal || m_normal == -c.m_normal);
240 inline bool Circle3::operator!=(
const Circle3& c)
const
242 return !(*
this == c);
251 const Plane3 sup = getSupportPlane();
256 const value_t ep = std::numeric_limits<value_t>::epsilon();
257 if (getValue(m_center.
distance(proj_p)) < ep)
264 if (m_radius == Scalar(0.0))
272 const Unit3 dist_center(proj_p - m_center);
273 return m_center + m_radius * dist_center;
281 const Plane3 sup = getSupportPlane();
284 if (proj_p != m_center)
289 const Scalar proj_p_dist(sup.
distance(p));
290 return sqrt(sq(m_radius) + sq(proj_p_dist));
297 inline Point3 Circle3::getCenter()
const
303 inline Point3& Circle3::getCenterRef()
309 inline const Point3& Circle3::getCenterRef()
const
315 inline Scalar Circle3::getRadius()
const
321 inline Scalar& Circle3::getRadiusRef()
327 inline const Scalar& Circle3::getRadiusRef()
const
333 inline Unit3 Circle3::getNormal()
const
339 inline Unit3& Circle3::getNormalRef()
345 inline const Unit3& Circle3::getNormalRef()
const
351 inline Plane3 Circle3::getSupportPlane()
const
353 return Plane3(m_normal, m_center);
357 inline void Circle3::setCenter(
const Point3& center)
365 m_radius = abs(radius);
369 inline void Circle3::setNormal(
const Unit3& normal)
376 const Scalar& radius,
380 m_radius = abs(radius);
389 return m_radius == Scalar(0.0);
397 inline std::ostream& operator<<(std::ostream& os,
400 return os <<
"center: " << c.getCenter() <<
' '
401 <<
"radius: " << c.getRadius() <<
' '
402 <<
"normal: " << c.getNormal();
408 inline Point3 project(
const Point3& p,
415 inline Scalar distance(
const Point3& p,
418 return c.distance(p);
422 inline Scalar distance(
const Circle3& c,
425 return c.distance(p);
430 #endif // MT_CIRCLE3_H