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) {
78 CoordType delta = _ScaleEpsilon(m_elem, p.m_elem, dim, epsilon);
80 for(
int i = 0; i < dim; ++i) {
81 if(std::fabs(m_elem[i] - p.m_elem[i]) > delta) {
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;
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;
118 for(
int i = 0; i < dim; ++i) {
119 p.m_elem[i] -= rhs.m_elem[i];
122 p.m_valid = p.m_valid && rhs.m_valid;
135 for(
int i = 0; i < dim; ++i) {
136 m_elem[i] = rhs.m_elem[i];
139 m_valid = rhs.m_valid;
149 for(
int i = 0; i < dim; ++i) {
150 CoordType diff = p1.m_elem[i] - p2.m_elem[i];
154 return (std::fabs(ans) >= _ScaleEpsilon(p1.m_elem, p2.m_elem, dim)) ? ans : 0;
157 template<
int dim,
template<
class,
class>
class container,
158 template<
class,
class>
class container2>
160 const container2<
CoordType, std::allocator<CoordType> >& weights)
164 typename container<Point<dim>, std::allocator<Point<dim> > >::const_iterator c_i = c.begin(), c_end = c.end();
165 typename container2<CoordType, std::allocator<CoordType> >::const_iterator w_i = weights.begin(),
166 w_end = weights.end();
170 if (c_i == c_end || w_i == w_end) {
174 bool valid = c_i->isValid();
176 CoordType tot_weight = *w_i, max_weight = std::fabs(*w_i);
177 for(
int j = 0; j < dim; ++j) {
178 out[j] = (*c_i)[j] * *w_i;
181 while(++c_i != c_end && ++w_i != w_end) {
188 for(
int j = 0; j < dim; ++j)
189 out[j] += (*c_i)[j] * *w_i;
193 if (max_weight <= 0 || std::fabs(tot_weight) <= max_weight * numeric_constants<CoordType>::epsilon()) {
197 for(
int j = 0; j < dim; ++j) {
198 out[j] /= tot_weight;
206 template<
int dim,
template<
class,
class>
class container>
211 typename container<Point<dim>, std::allocator<Point<dim> > >::const_iterator i = c.begin(), end = c.end();
218 float num_points = 1;
220 bool valid = i->isValid();
226 for(
int j = 0; j < dim; ++j)
230 for(
int j = 0; j < dim; ++j) {
231 out[j] /= num_points;
245 for(
int i = 0; i < dim; ++i) {
246 out.m_elem[i] = p1.m_elem[i] * conj_dist + p2.m_elem[i] * dist;
249 out.m_valid = p1.m_valid && p2.m_valid;
268 #endif // WFMATH_POINT_FUNCS_H Generic library namespace.
Definition: atlasconv.h:45
void setValid(bool valid=true)
make isValid() return true if you've initialized the point by hand
Definition: point.h:129
Point< dim > Midpoint(const Point< dim > &p1, const Point< dim > &p2, CoordType dist=0.5)
Definition: point_funcs.h:240
const Shape & getShape() const
Gets the zeroed shape.
Definition: zero.h:53
A dim dimensional vector.
Definition: const.h:55
Point()
Construct an uninitialized point.
Definition: point.h:100
float CoordType
Basic floating point type.
Definition: const.h:140
Utility class for providing zero primitives. This class will only work with simple structures such as...
Definition: point.h:87
A dim dimensional point.
Definition: const.h:50
Point< dim > Barycenter(const container< Point< dim >, std::allocator< Point< dim > > > &c)
Find the center of a set of points, all weighted equally.
Definition: point_funcs.h:207