Workaround for stupid float errors in boxKDE 3D

This commit is contained in:
2018-08-01 16:01:49 +02:00
parent cbba812558
commit 9388e6e725
4 changed files with 34 additions and 72 deletions

View File

@@ -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<T>& src, ImageView3D<T>& dst, size_t r)
{
T iarr = (T)1.0 / (r + r + 1);
ImageView3D<T> buffer(src);
ImageView3D<T> 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<T>(buffer.getHeight(), buffer.getDepth(), buffer.getWidth(), buffer.val_begin());
buffer2 = ImageView3D<T>(buffer2.getHeight(), buffer2.getDepth(), buffer2.getWidth(), buffer2.val_begin());
buffer.swap(buffer2);
}
buffer.swap(dst);
}
void box1D(const ImageView3D<T>& src, ImageView3D<T>& 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++;
}
}
};

View File

@@ -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<T>& pt) const
{
_Point3<size_t> gridPt;

View File

@@ -68,6 +68,12 @@ public:
return _Point3<size_t>(x, y, z);
}
TValue minimum() const
{
size_t minValueIndex = std::distance(val_begin(), std::min_element(val_begin(), val_end()));
return values[minValueIndex];
}
_Point3<size_t> maximum() const
{
size_t maxValueIndex = std::distance(val_begin(), std::max_element(val_begin(), val_end()));

View File

@@ -95,10 +95,6 @@ namespace SMC {
NM::NavMeshLocation<Tria> 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);
}