27 #ifndef WFMATH_POINT_FUNCS_H
28 #define WFMATH_POINT_FUNCS_H
30 #include <wfmath/point.h>
32 #include <wfmath/vector.h>
33 #include <wfmath/zero.h>
42 for(
int i = 0; i < dim; ++i) {
43 m_elem[i] = p.m_elem[i];
50 for(
int i = 0; i < dim; ++i) {
51 m_elem[i] = v.elements()[i];
66 for(
int i = 0; i < dim; ++i) {
80 for(
int i = 0; i < dim; ++i) {
81 if(fabs(m_elem[i] - p.m_elem[i]) > delta) {
90 inline Vector<dim> operator-(
const Point<dim>& c1,
const Point<dim>& c2)
94 for(
int i = 0; i < dim; ++i) {
95 out.m_elem[i] = c1.m_elem[i] - c2.m_elem[i];
98 out.m_valid = c1.m_valid && c2.m_valid;
104 inline Point<dim>& operator+=(Point<dim>& p,
const Vector<dim> &rhs)
106 for(
int i = 0; i < dim; ++i) {
107 p.m_elem[i] += rhs.m_elem[i];
110 p.m_valid = p.m_valid && rhs.m_valid;
116 inline Point<dim> operator+(
const Point<dim>& c,
const Vector<dim>& v)
126 inline Point<dim> operator+(
const Vector<dim>& v,
const Point<dim>& c)
136 inline Point<dim>& operator-=(Point<dim>& p,
const Vector<dim> &rhs)
138 for(
int i = 0; i < dim; ++i) {
139 p.m_elem[i] -= rhs.m_elem[i];
142 p.m_valid = p.m_valid && rhs.m_valid;
148 inline Point<dim> operator-(
const Point<dim>& c,
const Vector<dim>& v)
158 inline Point<dim>& Point<dim>::operator=(
const Point<dim>& rhs)
165 for(
int i = 0; i < dim; ++i) {
166 m_elem[i] = rhs.m_elem[i];
169 m_valid = rhs.m_valid;
175 inline CoordType SquaredDistance(
const Point<dim>& p1,
const Point<dim>& p2)
179 for(
int i = 0; i < dim; ++i) {
180 CoordType diff = p1.m_elem[i] - p2.m_elem[i];
184 return (fabs(ans) >= _ScaleEpsilon(p1.m_elem, p2.m_elem, dim)) ? ans : 0;
187 template<
int dim,
template<
class,
class>
class container,
188 template<
class,
class>
class container2>
190 const container2<
CoordType, std::allocator<CoordType> >& weights)
194 typename container<Point<dim>, std::allocator<Point<dim> > >::const_iterator c_i = c.begin(), c_end = c.end();
195 typename container2<CoordType, std::allocator<CoordType> >::const_iterator w_i = weights.begin(),
196 w_end = weights.end();
200 if (c_i == c_end || w_i == w_end) {
204 bool valid = c_i->isValid();
206 CoordType tot_weight = *w_i, max_weight = std::fabs(*w_i);
207 for(
int j = 0; j < dim; ++j) {
208 out[j] = (*c_i)[j] * *w_i;
211 while(++c_i != c_end && ++w_i != w_end) {
218 for(
int j = 0; j < dim; ++j)
219 out[j] += (*c_i)[j] * *w_i;
223 if (max_weight <= 0 || fabs(tot_weight) <= max_weight * WFMATH_EPSILON) {
227 for(
int j = 0; j < dim; ++j) {
228 out[j] /= tot_weight;
236 template<
int dim,
template<
class,
class>
class container>
241 typename container<Point<dim>, std::allocator<Point<dim> > >::const_iterator i = c.begin(), end = c.end();
248 float num_points = 1;
250 bool valid = i->isValid();
256 for(
int j = 0; j < dim; ++j)
260 for(
int j = 0; j < dim; ++j) {
261 out[j] /= num_points;
275 for(
int i = 0; i < dim; ++i) {
276 out.m_elem[i] = p1.m_elem[i] * conj_dist + p2.m_elem[i] * dist;
279 out.m_valid = p1.m_valid && p2.m_valid;
290 template<> Point<3>::Point(CoordType x, CoordType y, CoordType z) : m_valid(true)
297 template<> Point<2>& Point<2>::polar(CoordType r, CoordType theta);
298 template<>
void Point<2>::asPolar(CoordType& r, CoordType& theta)
const;
300 template<> Point<3>& Point<3>::polar(CoordType r, CoordType theta,
302 template<>
void Point<3>::asPolar(CoordType& r, CoordType& theta,
304 template<> Point<3>& Point<3>::spherical(CoordType r, CoordType theta,
306 template<>
void Point<3>::asSpherical(CoordType& r, CoordType& theta,
307 CoordType& phi)
const;
311 #endif // WFMATH_POINT_FUNCS_H