diff --git a/math/boxkde/BoxGaus3D.h b/math/boxkde/BoxGaus3D.h index 34f0fac..e915a37 100644 --- a/math/boxkde/BoxGaus3D.h +++ b/math/boxkde/BoxGaus3D.h @@ -173,87 +173,44 @@ private: // Überhangbereich links vom Bild for (size_t i = 0; i <= r; i++) { - val += src(ri++) - fv; + val = val + src(ri) - fv; + + // Fix potential float error + if (val < 0) { + val = 0; + } + dst(i) = val*iarr; + ri++; } // Bildbereich for (size_t i = r + 1; i < len - r; i++) { - val += src(ri++) - src(li++); + val = val + src(ri) - src(li); + + // Fix potential float error + if (val < 0) { + val = 0; + } + dst(i) = val*iarr; + ri++; + li++; } // Überhangbereich rechts vom Bild for (size_t i = len - r; i < len; i++) { - val += lv - src(li++); + val += lv - src(li); + + // Fix potential float error + if (val < 0) { + val = 0; + } + dst(i) = val*iarr; - } - } - - void box(const ImageView3D& src, ImageView3D& dst, size_t r) - { - T iarr = (T)1.0 / (r + r + 1); - - ImageView3D buffer(src); - ImageView3D buffer2(dst.getHeight(), dst.getDepth(), dst.getWidth(), dst.val_begin()); - - for (size_t i = 0; i < 3; i++) - { - for (size_t idx2 = 0; idx2 < buffer.getHeight(); idx2++) - { - for (size_t idx3 = 0; idx3 < buffer.getDepth(); idx3++) - { - box1D(buffer, buffer2, buffer.getWidth(), idx2, idx3, r, iarr); - } - } - - // reinteprete buffer sizes after rotation and swap data pointers - buffer = ImageView3D(buffer.getHeight(), buffer.getDepth(), buffer.getWidth(), buffer.val_begin()); - buffer2 = ImageView3D(buffer2.getHeight(), buffer2.getDepth(), buffer2.getWidth(), buffer2.val_begin()); - buffer.swap(buffer2); - } - - buffer.swap(dst); - } - - void box1D(const ImageView3D& src, ImageView3D& dst, size_t len, size_t idx2, size_t idx3, size_t r, T iarr) - { - for (size_t i = 0; i < len; i++) - { - // dst(idx2, idx3, i) = src(i, idx2, idx3); - - size_t li = 0; // left index - size_t ri = r; // right index - - T fv = src(0, idx2, idx3); - T lv = src(len - 1, idx2, idx3); - T val = (r + 1)*fv; - - for (size_t i = 0; i < r; i++) - val += src(i, idx2, idx3); - - // Überhangbereich links vom Bild - for (size_t i = 0; i <= r; i++) - { - val += src(ri++, idx2, idx3) - fv; - dst(idx2, idx3, i) = val*iarr; - } - - // Bildbereich - for (size_t i = r + 1; i < len - r; i++) - { - val += src(ri++, idx2, idx3) - src(li++, idx2, idx3); - dst(idx2, idx3, i) = val*iarr; - } - - // Überhangbereich rechts vom Bild - for (size_t i = len - r; i < len; i++) - { - val += lv - src(li++, idx2, idx3); - dst(idx2, idx3, i) = val*iarr; - } + li++; } } }; diff --git a/math/boxkde/Grid3D.h b/math/boxkde/Grid3D.h index 8093c4b..824aef4 100644 --- a/math/boxkde/Grid3D.h +++ b/math/boxkde/Grid3D.h @@ -105,6 +105,9 @@ public: return data(bin_x, bin_y, bin_z); } + T sum() const { return data.sum(); } + T minimum() const { return data.minimum(); } + T maximum(_Point3& pt) const { _Point3 gridPt; diff --git a/math/boxkde/Image3D.h b/math/boxkde/Image3D.h index 4180f80..1754fa3 100644 --- a/math/boxkde/Image3D.h +++ b/math/boxkde/Image3D.h @@ -68,6 +68,12 @@ public: return _Point3(x, y, z); } + TValue minimum() const + { + size_t minValueIndex = std::distance(val_begin(), std::min_element(val_begin(), val_end())); + return values[minValueIndex]; + } + _Point3 maximum() const { size_t maxValueIndex = std::distance(val_begin(), std::max_element(val_begin(), val_end())); diff --git a/smc/filtering/resampling/ParticleFilterResamplingKDE.h b/smc/filtering/resampling/ParticleFilterResamplingKDE.h index cd6c09a..349d61f 100644 --- a/smc/filtering/resampling/ParticleFilterResamplingKDE.h +++ b/smc/filtering/resampling/ParticleFilterResamplingKDE.h @@ -95,10 +95,6 @@ namespace SMC { NM::NavMeshLocation tmpPos = mesh->getRandom().draw(); float weight = grid->fetch(tmpPos.pos.x, tmpPos.pos.y, tmpPos.pos.z); - if(weight < 0 ){ - int halloBulli = 666; - } - dl.add(tmpPos.pos, weight); }