8 #ifndef IMPALGEBRA_SPHERE_D_H
9 #define IMPALGEBRA_SPHERE_D_H
12 #include "constants.h"
19 IMPALGEBRA_BEGIN_NAMESPACE
28 #if IMP_HAS_CHECKS >= IMP_USAGE
29 radius_ = std::numeric_limits<double>::quiet_NaN();
33 : center_(center), radius_(radius) {
36 double get_radius()
const {
38 "Attempt to use uninitialized sphere.");
41 const VectorD<D> &get_center()
const {
return center_; }
44 double d = (get_center() - o.get_center()).get_magnitude();
45 return (d + o.get_radius() < get_radius());
50 return ((p - center_).get_squared_magnitude() <= get_squared(radius_));
53 { out <<
"(" << spaces_io(center_) <<
": " << get_radius() <<
")"; });
56 VectorD<D> &_access_center() {
return center_; }
57 void _set_radius(
double d) { radius_ = d; }
58 void _set_center(
const VectorD<D> ¢er){ center_ = center; }
59 double &operator[](
unsigned int i) {
67 double operator[](
unsigned int i)
const {
77 unsigned int get_dimension()
const {
return center_.get_dimension(); }
85 {
return PI * 4.0 * get_squared(g.get_radius()); },
86 {
return PI * (4.0 / 3.0) * std::pow(g.get_radius(), 3.0); },
87 return BoundingBoxD<D>(g.get_center()) +
90 template <
unsigned int D>
92 return SphereD<D>(get_zero_vector_d<D>(), 1.0);
95 inline SphereD<-1> get_unit_sphere_kd(
unsigned int d) {
105 double d = (a.get_center() - b.get_center()).get_magnitude();
106 return d - a.get_radius() - b.get_radius();
116 double d = (a.get_center() - b.get_center()).get_squared_magnitude();
117 return d - square(a.get_radius()) - square(b.get_radius());
125 double sr = a.get_radius() + b.get_radius();
126 for (
unsigned int i = 0; i < a.get_dimension(); ++i) {
127 double delta = std::abs(a.get_center()[i] - b.get_center()[i]);
128 if (delta >= sr)
return false;
133 #if !defined(SWIG) && !defined(IMP_DOXYGEN)
137 struct SphereSpacesIO {
138 const SphereD<D> &v_;
139 SphereSpacesIO(
const SphereD<D> &v) : v_(v) {}
142 inline std::ostream &operator<<(std::ostream &out, const SphereSpacesIO<D> &s) {
143 for (
unsigned int i = 0; i < s.v_.get_center().get_dimension(); ++i) {
144 out << s.v_.get_center()[i] <<
" ";
146 out << s.v_.get_radius();
157 inline internal::SphereSpacesIO<D> spaces_io(
const SphereD<D> &v) {
158 return internal::SphereSpacesIO<D>(v);
164 template <
class Geometry>
167 template <
class Geometry>
170 template <
class Geometry>
173 template <
class Geometry>
178 VectorD<D> get_vector_geometry(
const SphereD<D> &s) {
179 return s.get_center();
182 IMPALGEBRA_END_NAMESPACE
bool get_contains(const SphereD< D > &o) const
Return true if this sphere contains the other one.
#define IMP_SHOWABLE_INLINE(Name, how_to_show)
Declare the methods needed by an object that can be printed.
VectorD< D > get_zero_vector_kd(int Di)
Return a dynamically sized vector of zeros.
static const double PI
the constant pi
double get_volume(const Cone3D &g)
double get_squared_distance(const VectorD< D > &v1, const VectorD< D > &v2)
Compute the squared distance between two vectors.
#define IMP_INTERNAL_CHECK(expr, message)
An assertion to check for internal errors in IMP. An IMP::ErrorException will be thrown.
Base class for geometric types.
Functions to deal with very common math operations.
A Cartesian vector in D-dimensions.
bool get_interiors_intersect(const SphereD< D > &a, const SphereD< D > &b)
Return true if the two balls bounded by the two spheres intersect.
BoundingBoxD< 3 > get_bounding_box(const Cone3D &g)
#define IMP_VOLUME_GEOMETRY_METHODS_D(Name, name, area, volume, bounding_box)
Implement the needed namespace methods for a geometry type.
A bounding box in D dimensions.
double get_surface_area(const Cone3D &g)
double get_area(const Plane3D &g)
bool isnan(const T &a)
Return true if a number is NaN.
double get_distance(const SphereD< D > &a, const SphereD< D > &b)
Return the distance between the two spheres if they are disjoint.
#define IMP_USAGE_CHECK(expr, message)
A runtime test for incorrect usage of a class or method.
bool get_contains(const VectorD< D > &p) const
Return true if the point is in or on the surface of the sphere.
Represent a sphere in D-dimensions.
Various important macros for implementing geometry.
double get_power_distance(const SphereD< D > &a, const SphereD< D > &b)
Return the power distance between the two spheres.