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) {
79 if (!p.m_valid || !m_valid) {
83 CoordType delta = _ScaleEpsilon(m_elem, p.m_elem, dim, epsilon);
84 for(
int i = 0; i < dim; ++i) {
85 if(std::fabs(m_elem[i] - p.m_elem[i]) > delta) {
98 for(
int i = 0; i < dim; ++i) {
99 out.m_elem[i] = c1.m_elem[i] - c2.m_elem[i];
102 out.m_valid = c1.m_valid && c2.m_valid;
110 for(
int i = 0; i < dim; ++i) {
111 p.m_elem[i] += rhs.m_elem[i];
114 p.m_valid = p.m_valid && rhs.m_valid;
122 for(
int i = 0; i < dim; ++i) {
123 p.m_elem[i] -= rhs.m_elem[i];
126 p.m_valid = p.m_valid && rhs.m_valid;
139 for(
int i = 0; i < dim; ++i) {
140 m_elem[i] = rhs.m_elem[i];
143 m_valid = rhs.m_valid;
153 for(
int i = 0; i < dim; ++i) {
154 CoordType diff = p1.m_elem[i] - p2.m_elem[i];
158 return (std::fabs(ans) >= _ScaleEpsilon(p1.m_elem, p2.m_elem, dim)) ? ans : 0;
161 template<
int dim,
template<
class,
class>
class container,
162 template<
class,
class>
class container2>
164 const container2<
CoordType, std::allocator<CoordType> >& weights)
168 typename container<Point<dim>, std::allocator<Point<dim> > >::const_iterator c_i = c.begin(), c_end = c.end();
169 typename container2<CoordType, std::allocator<CoordType> >::const_iterator w_i = weights.begin(),
170 w_end = weights.end();
174 if (c_i == c_end || w_i == w_end) {
178 bool valid = c_i->isValid();
180 CoordType tot_weight = *w_i, max_weight = std::fabs(*w_i);
181 for(
int j = 0; j < dim; ++j) {
182 out[j] = (*c_i)[j] * *w_i;
185 while(++c_i != c_end && ++w_i != w_end) {
192 for(
int j = 0; j < dim; ++j)
193 out[j] += (*c_i)[j] * *w_i;
201 for(
int j = 0; j < dim; ++j) {
202 out[j] /= tot_weight;
210 template<
int dim,
template<
class,
class>
class container>
215 typename container<Point<dim>, std::allocator<Point<dim> > >::const_iterator i = c.begin(), end = c.end();
224 bool valid = i->isValid();
230 for(
int j = 0; j < dim; ++j)
234 for(
int j = 0; j < dim; ++j) {
235 out[j] /= num_points;
249 for(
int i = 0; i < dim; ++i) {
250 out.m_elem[i] = p1.m_elem[i] * conj_dist + p2.m_elem[i] * dist;
253 out.m_valid = p1.m_valid && p2.m_valid;
261 template<> Point<3>& Point<3>::polar(CoordType r, CoordType theta,
263 template<>
void Point<3>::asPolar(CoordType& r, CoordType& theta,
265 template<> Point<3>& Point<3>::spherical(CoordType r, CoordType theta,
267 template<>
void Point<3>::asSpherical(CoordType& r, CoordType& theta,
268 CoordType& phi)
const;
272 #endif // WFMATH_POINT_FUNCS_H