00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
#ifndef WFMATH_BALL_H
00027
#define WFMATH_BALL_H
00028
00029
#include <wfmath/const.h>
00030
#include <wfmath/vector.h>
00031
#include <wfmath/point.h>
00032
#include <wfmath/axisbox.h>
00033
#include <wfmath/rotbox.h>
00034
#include <wfmath/intersect_decls.h>
00035
00036
#include <cstdlib>
00037
00038
namespace WFMath {
00039
00040
template<const
int dim>
class Ball;
00041
00042
#ifndef WFMATH_NO_TEMPLATES_AS_TEMPLATE_PARAMETERS
00043
00044
template<const
int dim,
template<
class>
class container>
00045 Ball<dim>
BoundingSphere(
const container<Point<dim> >& c);
00047
template<const
int dim,
template<
class>
class container>
00048 Ball<dim>
BoundingSphereSloppy(
const container<Point<dim> >& c);
00049
#endif
00050
00051
template<const
int dim>
00052 std::ostream& operator<<(std::ostream& os, const Ball<dim>& m);
00053
template<const
int dim>
00054 std::istream& operator>>(std::istream& is, Ball<dim>& m);
00055
00057
00067
template<const
int dim>
00068 class Ball
00069 {
00070
public:
00072 Ball() {}
00074 Ball(
const Point<dim>& center, CoordType radius)
00075 : m_center(center), m_radius(radius) {assert(radius >= 0);}
00077 Ball(
const Ball& b) : m_center(b.m_center), m_radius(b.m_radius) {}
00078
00079 ~
Ball() {}
00080
00081
friend std::ostream& operator<< <dim>(std::ostream& os,
const Ball& b);
00082
friend std::istream& operator>> <dim>(std::istream& is, Ball& b);
00083
00084 Ball& operator=(
const Ball& b)
00085 {m_radius = b.m_radius; m_center = b.m_center;
return *
this;}
00086
00087
bool isEqualTo(
const Ball& b,
double epsilon = WFMATH_EPSILON)
const;
00088
00089
bool operator==(
const Ball& b)
const {
return isEqualTo(b);}
00090
bool operator!=(
const Ball& b)
const {
return !isEqualTo(b);}
00091
00092
bool isValid()
const {
return m_center.isValid();}
00093
00094
00095
00096
int numCorners()
const {
return 0;}
00097
00098
00099
00100
00101 Point<dim> getCorner(
int i)
const {abort();
return m_center;}
00102 Point<dim> getCenter()
const {
return m_center;}
00103
00105 const Point<dim>&
center()
const {
return m_center;}
00107 Point<dim>&
center() {
return m_center;}
00109 CoordType radius()
const {
return m_radius;}
00111 CoordType&
radius() {
return m_radius;}
00112
00113
00114
00115
Ball& shift(
const Vector<dim>& v) {m_center += v;
return *
this;}
00116 Ball& moveCornerTo(
const Point<dim>& p,
int corner) {abort();
return *
this;}
00117
Ball& moveCenterTo(
const Point<dim>& p) {m_center = p;
return *
this;}
00118
00119
Ball& rotateCorner(
const RotMatrix<dim>& m,
int corner) {abort();
return *
this;}
00120
Ball& rotateCenter(
const RotMatrix<dim>& m) {
return *
this;}
00121
Ball& rotatePoint(
const RotMatrix<dim>& m,
const Point<dim>& p)
00122 {m_center.rotate(m, p);
return *
this;}
00123
00124
00125 Ball<3>& rotateCorner(
const Quaternion&,
int corner) {abort();
return *
this;}
00126 Ball<3>& rotateCenter(
const Quaternion&) {
return *
this;}
00127 Ball<3>& rotatePoint(
const Quaternion& q,
const Point<3>& p)
00128 {m_center.rotate(q, p);
return *
this;}
00129
00130
00131
00132 AxisBox<dim> boundingBox() const;
00133 Ball boundingSphere()
const {
return *
this;}
00134
Ball boundingSphereSloppy()
const {
return *
this;}
00135
00136
Ball toParentCoords(
const Point<dim>& origin,
00137
const RotMatrix<dim>& rotation = RotMatrix<dim>().identity())
const
00138
{
return Ball(m_center.toParentCoords(origin, rotation), m_radius);}
00139
Ball toParentCoords(
const AxisBox<dim>& coords)
const
00140
{
return Ball(m_center.toParentCoords(coords), m_radius);}
00141
Ball toParentCoords(
const RotBox<dim>& coords)
const
00142
{
return Ball(m_center.toParentCoords(coords), m_radius);}
00143
00144
00145
00146
00147
00148
Ball toLocalCoords(
const Point<dim>& origin,
00149
const RotMatrix<dim>& rotation = RotMatrix<dim>().identity())
const
00150
{
return Ball(m_center.toLocalCoords(origin, rotation), m_radius);}
00151
Ball toLocalCoords(
const AxisBox<dim>& coords)
const
00152
{
return Ball(m_center.toLocalCoords(coords), m_radius);}
00153
Ball toLocalCoords(
const RotBox<dim>& coords)
const
00154
{
return Ball(m_center.toLocalCoords(coords), m_radius);}
00155
00156
00157 Ball<3> toParentCoords(
const Point<3>& origin,
const Quaternion& rotation)
const
00158
{
return Ball<3>(m_center.toParentCoords(origin, rotation), m_radius);}
00159 Ball<3> toLocalCoords(
const Point<3>& origin,
const Quaternion& rotation)
const
00160
{
return Ball<3>(m_center.toLocalCoords(origin, rotation), m_radius);}
00161
00162
friend bool Intersect<dim>(
const Ball& b,
const Point<dim>& p,
bool proper);
00163
friend bool Contains<dim>(
const Point<dim>& p,
const Ball& b,
bool proper);
00164
00165
friend bool Intersect<dim>(
const Ball& b,
const AxisBox<dim>& a,
bool proper);
00166
friend bool Contains<dim>(
const Ball& b,
const AxisBox<dim>& a,
bool proper);
00167
friend bool Contains<dim>(
const AxisBox<dim>& a,
const Ball& b,
bool proper);
00168
00169
friend bool Intersect<dim>(
const Ball& b1,
const Ball& b2,
bool proper);
00170
friend bool Contains<dim>(
const Ball& outer,
const Ball& inner,
bool proper);
00171
00172
friend bool Intersect<dim>(
const Segment<dim>& s,
const Ball& b,
bool proper);
00173
friend bool Contains<dim>(
const Segment<dim>& s,
const Ball& b,
bool proper);
00174
00175
friend bool Intersect<dim>(
const RotBox<dim>& r,
const Ball& b,
bool proper);
00176
friend bool Contains<dim>(
const RotBox<dim>& r,
const Ball& b,
bool proper);
00177
friend bool Contains<dim>(
const Ball& b,
const RotBox<dim>& r,
bool proper);
00178
00179
friend bool Intersect<dim>(
const Polygon<dim>& p,
const Ball& b,
bool proper);
00180
friend bool Contains<dim>(
const Polygon<dim>& p,
const Ball& b,
bool proper);
00181
friend bool Contains<dim>(
const Ball& b,
const Polygon<dim>& p,
bool proper);
00182
00183
private:
00184
00185 Point<dim> m_center;
00186
CoordType m_radius;
00187 };
00188
00189 }
00190
00191
#include <wfmath/ball_funcs.h>
00192
00193
#endif // WFMATH_BALL_H