9 #include "imstkImplicitGeometry.h" 10 #include "imstkSignedDistanceField.h" 24 virtual Vec3d operator()(
const Vec3d& pos)
const = 0;
26 virtual void setDx(
const Vec3d& dx)
29 this->m_invDx = Vec3d(1.0 / dx[0], 1.0 / dx[1], 1.0 / dx[2]);
32 const Vec3d& getDx()
const {
return m_dx; }
34 void setFunction(std::shared_ptr<ImplicitGeometry> func) { this->m_func = func; }
35 std::shared_ptr<ImplicitGeometry> getFunction()
const {
return m_func; }
38 std::shared_ptr<ImplicitGeometry> m_func;
39 Vec3d m_dx = Vec3d(1.0, 1.0, 1.0);
40 Vec3d m_invDx = Vec3d(1.0, 1.0, 1.0);
53 Vec3d operator()(
const Vec3d& pos)
const override 59 funcRef.
getFunctionValue(Vec3d(pos[0], pos[1], pos[2] + m_dx[2])) - funcRef.
getFunctionValue(Vec3d(pos[0], pos[1], pos[2] - m_dx[2]))).cwiseProduct(m_invDx) * 0.5;
71 Vec3d operator()(
const Vec3d& pos)
const override 75 funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0] + m_dxi[0]), static_cast<int>(pos[1]), static_cast<int>(pos[2]))) -
76 funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0] - m_dxi[0]), static_cast<int>(pos[1]), static_cast<int>(pos[2]))),
77 funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0]), static_cast<int>(pos[1] + m_dxi[1]), static_cast<int>(pos[2]))) -
78 funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0]), static_cast<int>(pos[1] - m_dxi[1]), static_cast<int>(pos[2]))),
79 funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0]), static_cast<int>(pos[1]), static_cast<int>(pos[2] + m_dxi[2]))) -
80 funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0]), static_cast<int>(pos[1]), static_cast<int>(pos[2] - m_dxi[2])))).cwiseProduct(m_invDx) * 0.5;
83 void setDx(
const Vec3i& dx,
const Vec3d& dxs)
86 ImplicitFunctionGradient::setDx(dxs);
90 using ImplicitFunctionGradient::setDx;
102 Vec3d operator()(
const Vec3d& pos)
const override 105 const double centralValue = funcRef.
getFunctionValue(Vec3d(pos[0], pos[1], pos[2]));
106 const double maxValueX = funcRef.
getFunctionValue(Vec3d(pos[0] + m_dx[0], pos[1], pos[2]));
107 const double maxValueY = funcRef.
getFunctionValue(Vec3d(pos[0], pos[1] + m_dx[1], pos[2]));
108 const double maxValueZ = funcRef.
getFunctionValue(Vec3d(pos[0], pos[1], pos[2] + m_dx[2]));
110 maxValueX - centralValue,
111 maxValueY - centralValue,
112 maxValueZ - centralValue).cwiseProduct(m_invDx);
126 Vec3d operator()(
const Vec3d& pos)
const override 129 const double centralValue = funcRef.
getFunctionValue(Vec3d(pos[0], pos[1], pos[2]));
130 const double minValueX = funcRef.
getFunctionValue(Vec3d(pos[0] - m_dx[0], pos[1], pos[2]));
131 const double minValueY = funcRef.
getFunctionValue(Vec3d(pos[0], pos[1] - m_dx[1], pos[2]));
132 const double minValueZ = funcRef.
getFunctionValue(Vec3d(pos[0], pos[1], pos[2] - m_dx[2]));
134 centralValue - minValueX,
135 centralValue - minValueY,
136 centralValue - minValueZ).cwiseProduct(m_invDx);
150 inline Vec3d operator()(
const Vec3d& pos)
const override 153 const double centralValue = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0]), static_cast<int>(pos[1]), static_cast<int>(pos[2])));
154 const double maxValueX = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0] + m_dxi[0]), static_cast<int>(pos[1]), static_cast<int>(pos[2])));
155 const double maxValueY = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0]), static_cast<int>(pos[1] + m_dxi[1]), static_cast<int>(pos[2])));
156 const double maxValueZ = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0]), static_cast<int>(pos[1]), static_cast<int>(pos[2] + m_dxi[2])));
158 maxValueX - centralValue,
159 maxValueY - centralValue,
160 maxValueZ - centralValue).cwiseProduct(m_invDx);
163 void setDx(
const Vec3i& dx,
const Vec3d& dxs)
166 ImplicitFunctionGradient::setDx(dxs.cwiseProduct(m_dxi.cast<
double>()));
170 using ImplicitFunctionGradient::setDx;
184 inline Vec3d operator()(
const Vec3d& pos)
const override 187 const double centralValue = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0]), static_cast<int>(pos[1]), static_cast<int>(pos[2])));
188 const double minValueX = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0] - m_dxi[0]), static_cast<int>(pos[1]), static_cast<int>(pos[2])));
189 const double minValueY = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0]), static_cast<int>(pos[1] - m_dxi[1]), static_cast<int>(pos[2])));
190 const double minValueZ = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0]), static_cast<int>(pos[1]), static_cast<int>(pos[2] - m_dxi[2])));
192 centralValue - minValueX,
193 centralValue - minValueY,
194 centralValue - minValueZ).cwiseProduct(m_invDx);
197 void setDx(
const Vec3i& dx,
const Vec3d& dxs)
200 ImplicitFunctionGradient::setDx(dxs);
204 using ImplicitFunctionGradient::setDx;
216 double operator()(
const Vec3d& pos)
const 220 const double central = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0]), static_cast<int>(pos[1]), static_cast<int>(pos[2])));
221 const double minX = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0] - m_dxi[0]), static_cast<int>(pos[1]), static_cast<int>(pos[2])));
222 const double minY = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0]), static_cast<int>(pos[1] - m_dxi[1]), static_cast<int>(pos[2])));
223 const double minZ = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0]), static_cast<int>(pos[1]), static_cast<int>(pos[2] - m_dxi[2])));
224 const double maxX = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0] + m_dxi[0]), static_cast<int>(pos[1]), static_cast<int>(pos[2])));
225 const double maxY = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0]), static_cast<int>(pos[1] + m_dxi[1]), static_cast<int>(pos[2])));
226 const double maxZ = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0]), static_cast<int>(pos[1]), static_cast<int>(pos[2] + m_dxi[2])));
228 const double minXY = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0] - m_dxi[0]), static_cast<int>(pos[1] - m_dxi[1]), static_cast<int>(pos[2])));
229 const double maxXY = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0] + m_dxi[0]), static_cast<int>(pos[1] + m_dxi[1]), static_cast<int>(pos[2])));
230 const double maxXminY = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0] + m_dxi[0]), static_cast<int>(pos[1] - m_dxi[1]), static_cast<int>(pos[2])));
231 const double minXmaxY = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0] - m_dxi[0]), static_cast<int>(pos[1] + m_dxi[1]), static_cast<int>(pos[2])));
233 const double minXmaxZ = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0] - m_dxi[0]), static_cast<int>(pos[1]), static_cast<int>(pos[2] + m_dxi[2])));
234 const double maxXminZ = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0] + m_dxi[0]), static_cast<int>(pos[1]), static_cast<int>(pos[2] - m_dxi[2])));
235 const double maxXZ = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0] + m_dxi[0]), static_cast<int>(pos[1]), static_cast<int>(pos[2] + m_dxi[2])));
236 const double minXZ = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0] - m_dxi[0]), static_cast<int>(pos[1]), static_cast<int>(pos[2] - m_dxi[2])));
238 const double minYmaxZ = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0]), static_cast<int>(pos[1] - m_dxi[1]), static_cast<int>(pos[2] + m_dxi[2])));
239 const double maxYminZ = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0]), static_cast<int>(pos[1] + m_dxi[1]), static_cast<int>(pos[2] - m_dxi[2])));
240 const double maxYZ = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0]), static_cast<int>(pos[1] + m_dxi[1]), static_cast<int>(pos[2] + m_dxi[2])));
241 const double minYZ = funcRef.
getFunctionValueCoord(Vec3i(static_cast<int>(pos[0]), static_cast<int>(pos[1] - m_dxi[1]), static_cast<int>(pos[2] - m_dxi[2])));
243 const double dx = (maxX - minX) * 0.5;
244 const double dxx = maxX - 2.0 * central + minX;
245 const double dx2 = dx * dx;
247 const double dy = (maxY - minY) * 0.5;
248 const double dyy = maxY - 2.0 * central + minY;
249 const double dy2 = dy * dy;
251 const double dz = (maxZ - minZ) * 0.5;
252 const double dzz = maxZ - 2.0 * central + minZ;
253 const double dz2 = dz * dz;
255 const double dxy = (maxXY + minXY - maxXminY - minXmaxY) * 0.25;
256 const double dxz = (minXmaxZ + maxXminZ - maxXZ - minXZ) * 0.25;
257 const double dyz = (minYmaxZ + maxYminZ - maxYZ - minYZ) * 0.25;
259 return ((dxx * (dy2 + dz2) + dyy * (dx2 + dz2) + dzz * (dx2 + dy2) -
260 2.0 * dx * dy * dxy - 2.0 * dx * dz * dxz - 2.0 * dy * dz * dyz) /
261 (dx2 + dy2 + dz2 + std::numeric_limits<double>::epsilon()));
264 void setDx(
const Vec3i& dx,
const Vec3d& dxs)
268 this->m_invDx = Vec3d(1.0 / dxs[0], 1.0 / dxs[1], 1.0 / dxs[2]);
272 const Vec3d& getDx()
const {
return m_dx; }
274 void setFunction(std::shared_ptr<ImplicitGeometry> func) { this->m_func = func; }
277 std::shared_ptr<ImplicitGeometry> m_func;
278 Vec3d m_dx = Vec3d(1.0, 1.0, 1.0);
279 Vec3d m_invDx = Vec3d(1.0, 1.0, 1.0);
Gradient given by central finite differences.
Curvature given in structured coordinates.
virtual double getFunctionValue(const Vec3d &pos) const =0
Returns function value given position.
double getFunctionValueCoord(const Vec3i &coord) const
Returns signed distance to surface at coordinate inlined for performance.
Gradient given by backward finite differences.
Gradient given by central finite differences.
Structured field of signed distances implemented with ImageData The SDF differs in that when you scal...
Gradient given by backward finite differences.
Gradient given by forward finite differences.
Base struct for gradient functors.
Class that can represent the geometry of multiple implicit geometries as boolean functions One may su...
Gradient given by forward finite differences.