7 #include "imstkSignedDistanceField.h" 8 #include "imstkDataArray.h" 9 #include "imstkImageData.h" 10 #include "imstkLogger.h" 20 trilinearSample(
const Vec3d& structuredPt, T* imgPtr,
const Vec3i& dim,
const int numComps,
const int comp)
23 const Vec3i s1 = structuredPt.cast<
int>().cwiseMax(0).cwiseMin(dim - Vec3i(1, 1, 1));
26 const Vec3i s2 = (structuredPt.cast<
int>() + Vec3i(1, 1, 1)).cwiseMax(0).cwiseMin(dim - Vec3i(1, 1, 1));
37 const double val000 =
static_cast<double>(imgPtr[index000]);
38 const double val100 =
static_cast<double>(imgPtr[index100]);
39 const double val110 =
static_cast<double>(imgPtr[index110]);
40 const double val010 =
static_cast<double>(imgPtr[index010]);
42 const double val001 =
static_cast<double>(imgPtr[index001]);
43 const double val101 =
static_cast<double>(imgPtr[index101]);
44 const double val111 =
static_cast<double>(imgPtr[index111]);
45 const double val011 =
static_cast<double>(imgPtr[index011]);
49 const Vec3d t = structuredPt - s2.cast<
double>();
52 const double ax = val000 + (val100 - val000) * t[0];
53 const double bx = val010 + (val110 - val010) * t[0];
55 const double dx = val001 + (val101 - val001) * t[0];
56 const double ex = val011 + (val111 - val011) * t[0];
59 const double cy = ax + (bx - ax) * t[1];
60 const double fy = dx + (ex - dx) * t[1];
63 const double gz = cy + (fy - cy) * t[2];
65 return static_cast<T
>(gz);
69 m_imageDataSdf(imageData), m_scale(1.0)
71 m_invSpacing = m_imageDataSdf->getInvSpacing();
72 m_bounds = m_imageDataSdf->getBounds();
73 m_shift = m_imageDataSdf->getOrigin() - m_imageDataSdf->getSpacing() * 0.5;
75 m_scalars = std::dynamic_pointer_cast<
DataArray<double>>(m_imageDataSdf->getScalars());
77 CHECK(m_scalars !=
nullptr)
78 <<
"SignedDistanceField requires doubles in the input image";
87 if (pos[0] < m_bounds[1] && pos[0] > m_bounds[0]
88 && pos[1] < m_bounds[3] && pos[1] > m_bounds[2]
89 && pos[2] < m_bounds[5] && pos[2] > m_bounds[4])
91 const Vec3d structuredPt = (pos - m_shift).cwiseProduct(m_invSpacing);
92 return trilinearSample(structuredPt, m_scalars->getPointer(), m_imageDataSdf->getDimensions(), 1, 0) * m_scale;
97 return IMSTK_DOUBLE_MAX;
104 return m_imageDataSdf->computeBoundingBox(min, max, paddingPercent);
SignedDistanceField(std::shared_ptr< ImageData > imageData)
Constructor.
size_t getScalarIndex(int x, int y, int z=0)
Returns index of data in scalar array given structured image coordinate, does no bounds checking...
void computeBoundingBox(Vec3d &min, Vec3d &max, const double paddingPercent) override
Compute the bounding box for the geometry.
double getFunctionValue(const Vec3d &pos) const
Returns signed distance to surface at pos, returns clamped/nearest if out of bounds.