919 {
920 if (!data || !nr_points || !nr_point_element || !nr_voxel_x || !nr_voxel_y) {
921 initialized_ = false;
922 return initialized_;
923 }
924
925 data_ = data;
926 semantic_data_ = semantic_data;
927 nr_points_ = nr_points;
928 nr_point_element_ = nr_point_element;
929 nr_voxel_x_ = nr_voxel_x;
930 nr_voxel_y_ = nr_voxel_y;
931 nr_voxel_z_ = 1;
932
933 unsigned int i, j, k, n = 0, nd = 0;
934 unsigned int nr_voxel_xy = (nr_voxel_x_ * nr_voxel_y_);
935 unsigned int nr_voxel = nr_voxel_xy;
936 unsigned int nr_voxel_xm1 = nr_voxel_x - 1;
937 unsigned int nr_voxel_ym1 = nr_voxel_y - 1;
938 T vx, vy, vz, x, y, z;
939 T voxel_width_x, voxel_width_y, voxel_width_z;
940
941 voxels_.clear();
942 voxels_.resize(nr_voxel);
943
944
945
946 if (force_bound) {
947 dim_x_[0] = spatial_bound_x_min;
948 dim_x_[1] = spatial_bound_x_max;
949
950 dim_y_[0] = spatial_bound_y_min;
951 dim_y_[1] = spatial_bound_y_max;
952
953 dim_z_[0] = spatial_bound_z_min;
954 dim_z_[1] = spatial_bound_z_max;
955 } else {
957 data_, nr_points_, 0, nr_point_element_, &dim_x_[0], &dim_x_[1],
958 &dim_y_[0], &dim_y_[1], &dim_z_[0], &dim_z_[1], spatial_bound_x_min,
959 spatial_bound_x_max, spatial_bound_y_min, spatial_bound_y_max,
960 spatial_bound_z_min, spatial_bound_z_max);
961 }
962
963 T dim_x_min = dim_x_[0];
964 T dim_x_max = dim_x_[1];
965
966 T dim_y_min = dim_y_[0];
967 T dim_y_max = dim_y_[1];
968
969 T dim_z_min = dim_z_[0];
970 T dim_z_max = dim_z_[1];
971
972 T span_x = (dim_x_max - dim_x_min);
973 T span_y = (dim_y_max - dim_y_min);
974 T span_z = (dim_z_max - dim_z_min);
975
976 assert(span_x > 0 && span_y > 0 && span_z > 0);
977
978 voxel_dim_[0] = voxel_width_x =
IDiv(span_x,
static_cast<int>(nr_voxel_x_));
979 voxel_dim_[1] = voxel_width_y =
IDiv(span_y,
static_cast<int>(nr_voxel_y_));
980 voxel_dim_[2] = voxel_width_z = span_z;
981
982 T voxel_width_x_rec =
IRec(voxel_dim_[0]);
983 T voxel_width_y_rec =
IRec(voxel_dim_[1]);
984
985 std::vector<T> vxs(nr_voxel_x_);
986 vxs[0] = dim_x_[0];
987
988 for (i = 1; i < nr_voxel_x_; i++) {
989 vxs[i] = vxs[i - 1] + voxel_width_x;
990 }
991
992 vy = dim_y_[0];
993 vz = dim_z_[0];
994
995 for (j = 0; j < nr_voxel_y_; j++) {
996 for (k = 0; k < nr_voxel_x_; k++) {
997 vx = vxs[k];
998 voxels_[n++].init(vx, vy, vz, voxel_width_x, voxel_width_y, voxel_width_z,
999 static_cast<int>(k), static_cast<int>(j), 0);
1000 }
1001 vy += voxel_width_y;
1002 }
1003
1004
1005 for (; n < nr_points_; n++, nd += nr_point_element_) {
1006 x = data_[nd];
1007 y = data_[nd + 1];
1008 z = data_[nd + 2];
1009
1010 if (x < dim_x_min || x > dim_x_max || y < dim_y_min || y > dim_y_max ||
1011 z < dim_z_min || z > dim_z_max) {
1012
1013 continue;
1014 }
1015
1016 k =
IMax((
unsigned int)0,
1018 (unsigned int)((x - dim_x_min) * voxel_width_x_rec)));
1019 j =
IMax((
unsigned int)0,
1021 (unsigned int)((y - dim_y_min) * voxel_width_y_rec)));
1022 i = nr_voxel_x * j + k;
1023
1024 assert(i < nr_voxel);
1025 voxels_[i].indices_.push_back(n);
1026 }
1027 initialized_ = true;
1028 return initialized_;
1029}
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)