Workaround for stupid float errors in boxKDE 3D
This commit is contained in:
@@ -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++;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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()));
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user