38 #ifndef PCL_COMMON_IMPL_H_
39 #define PCL_COMMON_IMPL_H_
48 double rad = v1.dot (v2) /
sqrt (v1.squaredNorm () * v2.squaredNorm ());
49 if (rad < -1.0) rad = -1.0;
50 if (rad > 1.0) rad = 1.0;
58 double sum = 0, sq_sum = 0;
60 for (
size_t i = 0; i < values.size (); ++i)
63 sq_sum += values[i] * values[i];
65 mean = sum /
static_cast<double>(values.size ());
66 double variance = (sq_sum - sum * sum /
static_cast<double>(values.size ())) / (
static_cast<double>(values.size ()) - 1);
67 stddev =
sqrt (variance);
71 template <
typename Po
intT>
inline void
73 Eigen::Vector4f &min_pt, Eigen::Vector4f &max_pt,
74 std::vector<int> &indices)
76 indices.resize (cloud.
points.size ());
82 for (
size_t i = 0; i < cloud.
points.size (); ++i)
85 if (cloud.
points[i].x < min_pt[0] || cloud.
points[i].y < min_pt[1] || cloud.
points[i].z < min_pt[2])
87 if (cloud.
points[i].x > max_pt[0] || cloud.
points[i].y > max_pt[1] || cloud.
points[i].z > max_pt[2])
95 for (
size_t i = 0; i < cloud.
points.size (); ++i)
103 if (cloud.
points[i].x < min_pt[0] || cloud.
points[i].y < min_pt[1] || cloud.
points[i].z < min_pt[2])
105 if (cloud.
points[i].x > max_pt[0] || cloud.
points[i].y > max_pt[1] || cloud.
points[i].z > max_pt[2])
114 template<
typename Po
intT>
inline void
117 float max_dist = -FLT_MAX;
124 for (
size_t i = 0; i < cloud.
points.size (); ++i)
127 dist = (pivot_pt - pt).norm ();
138 for (
size_t i = 0; i < cloud.
points.size (); ++i)
144 dist = (pivot_pt - pt).norm ();
153 max_pt = cloud.
points[max_idx].getVector4fMap ();
157 template<
typename Po
intT>
inline void
159 const Eigen::Vector4f &pivot_pt, Eigen::Vector4f &max_pt)
161 float max_dist = -FLT_MAX;
168 for (
size_t i = 0; i < indices.size (); ++i)
171 dist = (pivot_pt - pt).norm ();
174 max_idx =
static_cast<int> (i);
182 for (
size_t i = 0; i < indices.size (); ++i)
191 dist = (pivot_pt - pt).norm ();
194 max_idx =
static_cast<int> (i);
200 max_pt = cloud.
points[indices[max_idx]].getVector4fMap ();
204 template <
typename Po
intT>
inline void
207 Eigen::Array4f min_p, max_p;
208 min_p.setConstant (FLT_MAX);
209 max_p.setConstant (-FLT_MAX);
214 for (
size_t i = 0; i < cloud.
points.size (); ++i)
217 min_p = min_p.min (pt);
218 max_p = max_p.max (pt);
224 for (
size_t i = 0; i < cloud.
points.size (); ++i)
232 min_p = min_p.min (pt);
233 max_p = max_p.max (pt);
236 min_pt.x = min_p[0]; min_pt.y = min_p[1]; min_pt.z = min_p[2];
237 max_pt.x = max_p[0]; max_pt.y = max_p[1]; max_pt.z = max_p[2];
241 template <
typename Po
intT>
inline void
244 Eigen::Array4f min_p, max_p;
245 min_p.setConstant (FLT_MAX);
246 max_p.setConstant (-FLT_MAX);
251 for (
size_t i = 0; i < cloud.
points.size (); ++i)
254 min_p = min_p.min (pt);
255 max_p = max_p.max (pt);
261 for (
size_t i = 0; i < cloud.
points.size (); ++i)
269 min_p = min_p.min (pt);
270 max_p = max_p.max (pt);
279 template <
typename Po
intT>
inline void
281 Eigen::Vector4f &min_pt, Eigen::Vector4f &max_pt)
283 Eigen::Array4f min_p, max_p;
284 min_p.setConstant (FLT_MAX);
285 max_p.setConstant (-FLT_MAX);
290 for (
size_t i = 0; i < indices.
indices.size (); ++i)
293 min_p = min_p.min (pt);
294 max_p = max_p.max (pt);
300 for (
size_t i = 0; i < indices.
indices.size (); ++i)
308 min_p = min_p.min (pt);
309 max_p = max_p.max (pt);
317 template <
typename Po
intT>
inline void
319 Eigen::Vector4f &min_pt, Eigen::Vector4f &max_pt)
321 min_pt.setConstant (FLT_MAX);
322 max_pt.setConstant (-FLT_MAX);
327 for (
size_t i = 0; i < indices.size (); ++i)
330 min_pt = min_pt.array ().min (pt);
331 max_pt = max_pt.array ().max (pt);
337 for (
size_t i = 0; i < indices.size (); ++i)
345 min_pt = min_pt.array ().min (pt);
346 max_pt = max_pt.array ().max (pt);
352 template <
typename Po
intT>
inline double
355 Eigen::Vector4f p1 (pa.x, pa.y, pa.z, 0);
356 Eigen::Vector4f p2 (pb.x, pb.y, pb.z, 0);
357 Eigen::Vector4f p3 (pc.x, pc.y, pc.z, 0);
359 double p2p1 = (p2 - p1).norm (), p3p2 = (p3 - p2).norm (), p1p3 = (p1 - p3).norm ();
362 double semiperimeter = (p2p1 + p3p2 + p1p3) / 2.0;
363 double area =
sqrt (semiperimeter * (semiperimeter - p2p1) * (semiperimeter - p3p2) * (semiperimeter - p1p3));
365 return ((p2p1 * p3p2 * p1p3) / (4.0 * area));
369 template <
typename Po
intT>
inline void
375 for (
int i = 0; i < len; ++i)
377 min_p = (histogram[i] > min_p) ? min_p : histogram[i];
378 max_p = (histogram[i] < max_p) ? max_p : histogram[i];
382 #endif //#ifndef PCL_COMMON_IMPL_H_