Workaround for stupid float errors in boxKDE 3D
This commit is contained in:
@@ -173,87 +173,44 @@ private:
|
|||||||
// Überhangbereich links vom Bild
|
// Überhangbereich links vom Bild
|
||||||
for (size_t i = 0; i <= r; i++)
|
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;
|
dst(i) = val*iarr;
|
||||||
|
ri++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bildbereich
|
// Bildbereich
|
||||||
for (size_t i = r + 1; i < len - r; i++)
|
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;
|
dst(i) = val*iarr;
|
||||||
|
ri++;
|
||||||
|
li++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Überhangbereich rechts vom Bild
|
// Überhangbereich rechts vom Bild
|
||||||
for (size_t i = len - r; i < len; i++)
|
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;
|
dst(i) = val*iarr;
|
||||||
}
|
li++;
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -105,6 +105,9 @@ public:
|
|||||||
return data(bin_x, bin_y, bin_z);
|
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
|
T maximum(_Point3<T>& pt) const
|
||||||
{
|
{
|
||||||
_Point3<size_t> gridPt;
|
_Point3<size_t> gridPt;
|
||||||
|
|||||||
@@ -68,6 +68,12 @@ public:
|
|||||||
return _Point3<size_t>(x, y, z);
|
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
|
_Point3<size_t> maximum() const
|
||||||
{
|
{
|
||||||
size_t maxValueIndex = std::distance(val_begin(), std::max_element(val_begin(), val_end()));
|
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();
|
NM::NavMeshLocation<Tria> tmpPos = mesh->getRandom().draw();
|
||||||
float weight = grid->fetch(tmpPos.pos.x, tmpPos.pos.y, tmpPos.pos.z);
|
float weight = grid->fetch(tmpPos.pos.x, tmpPos.pos.y, tmpPos.pos.z);
|
||||||
|
|
||||||
if(weight < 0 ){
|
|
||||||
int halloBulli = 666;
|
|
||||||
}
|
|
||||||
|
|
||||||
dl.add(tmpPos.pos, weight);
|
dl.add(tmpPos.pos, weight);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user