92#include <pcl/cuda/point_cloud.h>
93#include <pcl/cuda/cutil_math.h>
145 float d = b * b - 4.0f *
c;
157 float c(a); a=b; b=
c;
168 float c0 =
m.data[0].x*
m.data[1].y*
m.data[2].z
169 + 2.0f *
m.data[0].y*
m.data[0].z*
m.data[1].z
170 -
m.data[0].x*
m.data[1].z*
m.data[1].z
171 -
m.data[1].y*
m.data[0].z*
m.data[0].z
172 -
m.data[2].z*
m.data[0].y*
m.data[0].y;
173 float c1 =
m.data[0].x*
m.data[1].y -
174 m.data[0].y*
m.data[0].y +
175 m.data[0].x*
m.data[2].z -
176 m.data[0].z*
m.data[0].z +
177 m.data[1].y*
m.data[2].z -
178 m.data[1].z*
m.data[1].z;
179 float c2 =
m.data[0].x +
m.data[1].y +
m.data[2].z;
186 const float s_inv3 = 1.0f/3.0f;
250 evecs.data[0] = make_float3 (1.0f, 0.0f, 0.0f);
251 evecs.data[1] = make_float3 (0.0f, 1.0f, 0.0f);
252 evecs.data[2] = make_float3 (0.0f, 0.0f, 1.0f);
487 template <
class IteratorT>
491 centroid.x = centroid.y = centroid.z = 0;
494 centroid /= (
float) (end - begin);
498 template <
class IteratorT>
501 cov.
data[0] = make_float3 (0.0f, 0.0f, 0.0f);
502 cov.
data[1] = make_float3 (0.0f, 0.0f, 0.0f);
503 cov.
data[2] = make_float3 (0.0f, 0.0f, 0.0f);
522 template <
typename CloudPtr>
580 res.x = clamp (res.x, 0,
width_-1);
581 res.y = clamp (res.y, 0,
width_-1);
582 res.z = clamp (res.z, 0,
height_-1);
583 res.w = clamp (res.w, 0,
height_-1);
654 cov.
data[0] = make_float3(0,0,0);
655 cov.
data[1] = make_float3(0,0,0);
656 cov.
data[2] = make_float3(0,0,0);
657 float3 centroid = make_float3(0,0,0);
736 float3 centroid = make_float3(0,0,0);
Iterator class for point clouds with or without given indices.
Kernel to compute a radius neighborhood given a organized point cloud (aka range image cloud)
__host__ __device__ int radiusSearch(const float3 &query_pt, int k_indices[], int max_nnn)
__host__ __device__ float3 computeCentroid(const float3 &query_pt, CovarianceMatrix &cov, float sqrt_desired_nr_neighbors)
OrganizedRadiusSearch(const CloudPtr &input, float focalLength, float sqr_radius)
__host__ __device__ int computeCovarianceOnline(const float3 &query_pt, CovarianceMatrix &cov, float sqrt_desired_nr_neighbors)
__host__ __device__ int4 getProjectedRadiusSearchBox(const float3 &point_arg)
const PointXYZRGB * points_
__host__ __device__ float3 unitOrthogonal(const float3 &src)
void computeCovariance(IteratorT begin, IteratorT end, CovarianceMatrix &cov, float3 centroid)
Computes a covariance matrix for a given range of points.
__host__ __device__ void eigen33(const CovarianceMatrix &mat, CovarianceMatrix &evecs, float3 &evals)
__host__ __device__ void computeRoots(const CovarianceMatrix &m, float3 &roots)
__host__ __device__ void swap(float &a, float &b)
__host__ __device__ bool isMuchSmallerThan(float x, float y)
__host__ __device__ void computeRoots2(const float &b, const float &c, float3 &roots)
void compute3DCentroid(IteratorT begin, IteratorT end, float3 ¢roid)
Computes a centroid for a given range of points.
Adds two matrices element-wise.
__inline__ __host__ __device__ CovarianceMatrix operator()(CovarianceMatrix lhs, CovarianceMatrix rhs)
Simple kernel to add two points.
__inline__ __host__ __device__ float3 operator()(float3 lhs, float3 rhs)
Kernel to compute a `‘covariance matrix’' for a single point.
__inline__ __host__ __device__ CovarianceMatrix operator()(const PointXYZRGB &point)
__inline__ __host__ __device__ ComputeCovarianceForPoint(const float3 ¢roid)
misnamed class holding a 3x3 matrix
Default point xyz-rgb structure.
Simple kernel to convert a PointXYZRGB to float3.
__inline__ __host__ __device__ float3 operator()(const PointXYZRGB &pt)