42 Vec3f min_box(std::numeric_limits<float>::max(), std::numeric_limits<float>::max(), std::numeric_limits<float>::max());
43 Vec3f max_box(-std::numeric_limits<float>::max(), -std::numeric_limits<float>::max(), -std::numeric_limits<float>::max());
45 auto& mPoints = inTriangleSet()->getDataPtr()->getPoints();
46 auto& mTriangles = inTriangleSet()->getDataPtr()->getTriangles();
49 cPoints.assign(mPoints);
52 cTriangles.resize(mTriangles.size());
53 cTriangles.assign(mTriangles);
58 for (
int i = 0; i < cPoints.size(); i++) {
59 Coord point = cPoints[i];
61 min_box = min_box.minimum(point);
62 max_box = max_box.maximum(point);
65 for (
int i = 0; i < cTriangles.size(); i++) {
66 faceList.pushBack(
Vec3ui(cTriangles[i][0], cTriangles[i][1], cTriangles[i][2]));
69 Real dx = this->varSpacing()->getValue();
70 uint padding = this->varPadding()->getValue();
73 min_box -= padding * dx * unit;
74 max_box += padding * dx * unit;
76 ni = std::ceil((max_box[0] - min_box[0]) / dx);
77 nj = std::ceil((max_box[1] - min_box[1]) / dx);
78 nk = std::ceil((max_box[2] - min_box[2]) / dx);
87 printf(
"Uniform grids: %f %f %f, %f %f %f, %f, %d %d %d, %d \n",
origin[0],
origin[1],
origin[2],
maxPoint[0],
maxPoint[1],
maxPoint[2], dx,
ni,
nj,
nk, padding);
111 Vec3f x13(x1 - x3), x23(x2 - x3), x03(x0 - x3);
112 float m13 = x13.normSquared(), m23 = x23.normSquared(), d = x13.dot(x23);
113 float invdet = 1.f / std::max(m13*m23 - d * d, 1e-30f);
114 float a = x13.dot(x03), b = x23.dot(x03);
116 float w23 = invdet * (m23*a - d * b);
117 float w31 = invdet * (m13*b - d * a);
118 float w12 = 1 - w23 - w31;
119 if (w23 >= 0 && w31 >= 0 && w12 >= 0) {
120 return (x0 - (w23*x1 + w31 * x2 + w12 * x3)).norm();
134 const Vec3f &gx,
int i0,
int j0,
int k0,
int i1,
int j1,
int k1)
136 if (closest_tri(i1, j1, k1) >= 0) {
137 unsigned int p, q, r;
138 Vec3ui trijk = tri[closest_tri(i1, j1, k1)];
143 if (d < phi(i0, j0, k0)) {
145 closest_tri(i0, j0, k0) = closest_tri(i1, j1, k1);
152 int di,
int dj,
int dk)
156 i0 = 1; i1 = phi.nx();
159 i0 = phi.nx() - 2; i1 = -1;
163 j0 = 1; j1 = phi.ny();
166 j0 = phi.ny() - 2; j1 = -1;
170 k0 = 1; k1 = phi.nz();
173 k0 = phi.nz() - 2; k1 = -1;
175 for (
int k = k0; k != k1; k += dk)
for (
int j = j0; j != j1; j += dj)
for (
int i = i0; i != i1; i += di) {
176 Vec3f gx(i*dx + origin[0], j*dx + origin[1], k*dx + origin[2]);
177 FSM_CheckNeighbour(tri, x, phi, closest_tri, gx, i, j, k, i - di, j, k);
178 FSM_CheckNeighbour(tri, x, phi, closest_tri, gx, i, j, k, i, j - dj, k);
179 FSM_CheckNeighbour(tri, x, phi, closest_tri, gx, i, j, k, i - di, j - dj, k);
180 FSM_CheckNeighbour(tri, x, phi, closest_tri, gx, i, j, k, i, j, k - dk);
181 FSM_CheckNeighbour(tri, x, phi, closest_tri, gx, i, j, k, i - di, j, k - dk);
182 FSM_CheckNeighbour(tri, x, phi, closest_tri, gx, i, j, k, i, j - dj, k - dk);
183 FSM_CheckNeighbour(tri, x, phi, closest_tri, gx, i, j, k, i - di, j - dj, k - dk);
229 const int exact_band = 1;
230 Real dx = this->varSpacing()->getValue();
236 closest_tri.assign(-1);
238 intersection_count.assign(0);
256 int i0 =
clamp(
int(
TRI_MIN(fip, fiq, fir)) - exact_band, 0,
ni - 1);
257 int i1 =
clamp(
int(
TRI_MAX(fip, fiq, fir)) + exact_band + 1, 0,
ni - 1);
258 int j0 =
clamp(
int(
TRI_MIN(fjp, fjq, fjr)) - exact_band, 0,
nj - 1);
259 int j1 =
clamp(
int(
TRI_MAX(fjp, fjq, fjr)) + exact_band + 1, 0,
nj - 1);
260 int k0 =
clamp(
int(
TRI_MIN(fkp, fkq, fkr)) - exact_band, 0,
nk - 1);
261 int k1 =
clamp(
int(
TRI_MAX(fkp, fkq, fkr)) + exact_band + 1, 0,
nk - 1);
262 for (
int k = k0; k <= k1; ++k)
for (
int j = j0; j <= j1; ++j)
for (
int i = i0; i <= i1; ++i) {
265 if (d <
phi(i, j, k)) {
267 closest_tri(i, j, k) = t;
275 for (
int k = k0; k <= k1; ++k)
for (
int j = j0; j <= j1; ++j) {
277 if (
point_in_triangle_2d(j, k, fjp, fkp, fjq, fkq, fjr, fkr, a, b, c)) {
278 double fi = a * fip + b * fiq + c * fir;
279 int i_interval = int(std::ceil(fi));
280 if (i_interval < 0) ++intersection_count(0, j, k);
281 else if (i_interval <
ni) ++intersection_count(i_interval, j, k);
287 for (
unsigned int pass = 0; pass < 2; ++pass) {
298 for (
int k = 0; k <
nk; ++k)
for (
int j = 0; j <
nj; ++j) {
300 for (
int i = 0; i <
ni; ++i) {
301 total_count += intersection_count(i, j, k);
302 if (total_count % 2 == 1) {
303 phi(i, j, k) = -
phi(i, j, k);
static bool point_in_triangle_2d(double x0, double y0, double x1, double y1, double x2, double y2, double x3, double y3, double &a, double &b, double &c)
static void FSM_CheckNeighbour(const CArray< Vec3ui > &tri, const CArray< Vec3f > &vert, CArray3f &phi, CArray3i &closest_tri, const Vec3f &gx, int i0, int j0, int k0, int i1, int j1, int k1)
static void sweep(const CArray< Vec3ui > &tri, const CArray< Vec3f > &x, CArray3f &phi, CArray3i &closest_tri, const Vec3f &origin, float dx, int di, int dj, int dk)