@@ -23,8 +23,8 @@ void VoxelGrid::initialize(float resolution, const Eigen::Vector4f& min, const E
23
23
occlusions_.resize (sizex_ * sizey_ * sizez_);
24
24
occludedBy_.resize (sizex_ * sizey_ * sizez_);
25
25
26
- std::cout << " [Voxelgrid::initialize] " << resolution_ << " ; num. voxels = [" << sizex_ << " , " << sizey_ << " , " << sizez_
27
- << " ], maxExtent = " << max << " , minExtent" << min << std::endl;
26
+ std::cout << " [Voxelgrid::initialize] " << resolution_ << " ; num. voxels = [" << sizex_ << " , " << sizey_ << " , "
27
+ << sizez_ << " ], maxExtent = " << max. transpose () << " , minExtent" << min. transpose () << std::endl;
28
28
}
29
29
30
30
void VoxelGrid::clear () {
@@ -54,7 +54,7 @@ void VoxelGrid::insert(const Eigen::Vector4f& p, uint32_t label) {
54
54
int32_t gidx = index (i, j, k);
55
55
if (gidx < 0 || gidx >= int32_t (voxels_.size ())) return ;
56
56
57
- occupied_.push_back (gidx);
57
+ if (voxels_[gidx]. count == 0 ) occupied_.push_back (gidx);
58
58
59
59
// float n = voxels_[gidx].count;
60
60
voxels_[gidx].labels [label] += 1 ; // (1. / (n + 1)) * (n * voxels_[gidx].point + p);
@@ -98,7 +98,7 @@ void VoxelGrid::updateOcclusions() {
98
98
for (uint32_t j = 0 ; j < sizey_; ++j) {
99
99
for (uint32_t k = 0 ; k < sizez_; ++k) {
100
100
int32_t idx = index (i, j, k);
101
- occludedBy_[idx] = occludedBy (i, j, k);
101
+ if (occludedBy_[idx] == - 2 ) occludedBy_[idx] = occludedBy (i, j, k);
102
102
occlusions_[idx] = occludedBy_[idx];
103
103
if (occlusions_[idx] != idx) occluded_.push_back (idx);
104
104
}
@@ -112,21 +112,21 @@ void VoxelGrid::updateOcclusions() {
112
112
void VoxelGrid::updateInvalid (const Eigen::Vector3f& position) {
113
113
if (!occlusionsValid_) updateOcclusions ();
114
114
115
- // std::fill(occludedBy_.begin(), occludedBy_.end(), -2);
115
+ std::fill (occludedBy_.begin (), occludedBy_.end (), -2 );
116
116
for (uint32_t x = 0 ; x < sizex_; ++x) {
117
117
for (uint32_t y = 0 ; y < sizey_; ++y) {
118
118
for (uint32_t z = 0 ; z < sizez_; ++z) {
119
119
int32_t idx = index (x, y, z);
120
120
// idea: if voxel is not occluded, the value should be -1.
121
- occludedBy_[idx] = occludedBy (x, y, z, position);
121
+ if (occludedBy_[idx] == - 2 ) occludedBy_[idx] = occludedBy (x, y, z, position);
122
122
invalid_[idx] = std::min<int32_t >(invalid_[idx], occludedBy_[idx]);
123
123
}
124
124
}
125
125
}
126
126
}
127
127
128
128
int32_t VoxelGrid::occludedBy (int32_t i, int32_t j, int32_t k, const Eigen::Vector3f& endpoint,
129
- std::vector<Eigen::Vector3i>* visited) const {
129
+ std::vector<Eigen::Vector3i>* visited) {
130
130
float NextCrossingT[3 ], DeltaT[3 ]; /* * t for next intersection with voxel boundary of axis, t increment for axis
131
131
**/
132
132
int32_t Step[3 ], Out[3 ], Pos[3 ]; /* * voxel increment for axis, index of of outside voxels, current position **/
@@ -181,11 +181,13 @@ int32_t VoxelGrid::occludedBy(int32_t i, int32_t j, int32_t k, const Eigen::Vect
181
181
int32_t idx = index (Pos[0 ], Pos[1 ], Pos[2 ]);
182
182
bool occupied = voxels_[idx].count > 0 ;
183
183
if (visited != nullptr ) visited->push_back (Eigen::Vector3i (Pos[0 ], Pos[1 ], Pos[2 ]));
184
- if (occludedBy_[idx] > -2 ) {
185
- return occludedBy_[idx];
184
+
185
+ if (occupied) {
186
+ // for (auto i : traversed) occludedBy_[i] = idx;
187
+ return idx;
186
188
}
187
189
188
- if (occupied) return idx;
190
+ traversed. push_back ( idx) ;
189
191
190
192
int32_t bits = ((NextCrossingT[0 ] < NextCrossingT[1 ]) << 2 ) + ((NextCrossingT[0 ] < NextCrossingT[2 ]) << 1 ) +
191
193
((NextCrossingT[1 ] < NextCrossingT[2 ]));
@@ -201,5 +203,7 @@ int32_t VoxelGrid::occludedBy(int32_t i, int32_t j, int32_t k, const Eigen::Vect
201
203
++iteration;
202
204
}
203
205
206
+ // for (auto i : traversed) occludedBy_[i] = -1;
207
+
204
208
return -1 ;
205
209
}
0 commit comments