907 {
908 if (!data || !nr_points || !nr_point_element || !nr_voxel_x || !nr_voxel_y) {
909 initialized_ = false;
910 return initialized_;
911 }
912
913 data_ = data;
914 nr_points_ = nr_points;
915 nr_point_element_ = nr_point_element;
916 nr_voxel_x_ = nr_voxel_x;
917 nr_voxel_y_ = nr_voxel_y;
918 nr_voxel_z_ = 1;
919
920 unsigned int i, j, k, n = 0, nd = 0;
921 unsigned int nr_voxel_xy = (nr_voxel_x_ * nr_voxel_y_);
922 unsigned int nr_voxel = nr_voxel_xy;
923 unsigned int nr_voxel_xm1 = nr_voxel_x - 1;
924 unsigned int nr_voxel_ym1 = nr_voxel_y - 1;
925 T vx, vy, vz, x, y, z;
926 T voxel_width_x, voxel_width_y, voxel_width_z;
927
928 voxels_.clear();
929 voxels_.resize(nr_voxel);
930
931
932
933 if (force_bound) {
934 dim_x_[0] = spatial_bound_x_min;
935 dim_x_[1] = spatial_bound_x_max;
936
937 dim_y_[0] = spatial_bound_y_min;
938 dim_y_[1] = spatial_bound_y_max;
939
940 dim_z_[0] = spatial_bound_z_min;
941 dim_z_[1] = spatial_bound_z_max;
942 } else {
944 data_, nr_points_, 0, nr_point_element_, &dim_x_[0], &dim_x_[1],
945 &dim_y_[0], &dim_y_[1], &dim_z_[0], &dim_z_[1], spatial_bound_x_min,
946 spatial_bound_x_max, spatial_bound_y_min, spatial_bound_y_max,
947 spatial_bound_z_min, spatial_bound_z_max);
948 }
949
950 T dim_x_min = dim_x_[0];
951 T dim_x_max = dim_x_[1];
952
953 T dim_y_min = dim_y_[0];
954 T dim_y_max = dim_y_[1];
955
956 T dim_z_min = dim_z_[0];
957 T dim_z_max = dim_z_[1];
958
959 T span_x = (dim_x_max - dim_x_min);
960 T span_y = (dim_y_max - dim_y_min);
961 T span_z = (dim_z_max - dim_z_min);
962
963 assert(span_x > 0 && span_y > 0 && span_z > 0);
964
965 voxel_dim_[0] = voxel_width_x =
IDiv(span_x,
static_cast<int>(nr_voxel_x_));
966 voxel_dim_[1] = voxel_width_y =
IDiv(span_y,
static_cast<int>(nr_voxel_y_));
967 voxel_dim_[2] = voxel_width_z = span_z;
968
969 T voxel_width_x_rec =
IRec(voxel_dim_[0]);
970 T voxel_width_y_rec =
IRec(voxel_dim_[1]);
971
972 std::vector<T> vxs(nr_voxel_x_);
973 vxs[0] = dim_x_[0];
974
975 for (i = 1; i < nr_voxel_x_; i++) {
976 vxs[i] = vxs[i - 1] + voxel_width_x;
977 }
978
979 vy = dim_y_[0];
980 vz = dim_z_[0];
981
982 for (j = 0; j < nr_voxel_y_; j++) {
983 for (k = 0; k < nr_voxel_x_; k++) {
984 vx = vxs[k];
985 voxels_[n++].init(vx, vy, vz, voxel_width_x, voxel_width_y, voxel_width_z,
986 static_cast<int>(k), static_cast<int>(j), 0);
987 }
988 vy += voxel_width_y;
989 }
990
991
992 for (; n < nr_points_; n++, nd += nr_point_element_) {
993 x = data_[nd];
994 y = data_[nd + 1];
995 z = data_[nd + 2];
996
997 if (x < dim_x_min || x > dim_x_max || y < dim_y_min || y > dim_y_max ||
998 z < dim_z_min || z > dim_z_max) {
999
1000 continue;
1001 }
1002
1003 k =
IMax((
unsigned int)0,
1005 (unsigned int)((x - dim_x_min) * voxel_width_x_rec)));
1006 j =
IMax((
unsigned int)0,
1008 (unsigned int)((y - dim_y_min) * voxel_width_y_rec)));
1009 i = nr_voxel_x * j + k;
1010
1011 assert(i < nr_voxel);
1012 voxels_[i].indices_.push_back(n);
1013 }
1014 initialized_ = true;
1015 return initialized_;
1016}
void IGetPointcloudsDimWBound(const T *threeds, int n, int start_offset, int element_size, T *dim_min_x, T *dim_max_x, T *dim_min_y, T *dim_max_y, T *dim_min_z, T *dim_max_z, T bound_min_x, T bound_max_x, T bound_min_y, T bound_max_y, T bound_min_z, T bound_max_z)