41 Vec3f min_box(std::numeric_limits<float>::max(), std::numeric_limits<float>::max(), std::numeric_limits<float>::max());
42 Vec3f max_box(-std::numeric_limits<float>::max(), -std::numeric_limits<float>::max(), -std::numeric_limits<float>::max());
44 auto& mPoints = inTriangleSet()->getDataPtr()->getPoints();
45 auto& mTriangles = inTriangleSet()->getDataPtr()->getTriangles();
48 cPoints.assign(mPoints);
51 cTriangles.resize(mTriangles.size());
52 cTriangles.assign(mTriangles);
57 for (
int i = 0; i < cPoints.size(); i++) {
58 Coord point = cPoints[i];
60 min_box = min_box.minimum(point);
61 max_box = max_box.maximum(point);
64 for (
int i = 0; i < cTriangles.size(); i++) {
65 faceList.pushBack(
Vec3ui(cTriangles[i][0], cTriangles[i][1], cTriangles[i][2]));
68 Real dx = this->varSpacing()->getValue();
69 uint padding = this->varPadding()->getValue();
72 min_box -= padding * dx * unit;
73 max_box += padding * dx * unit;
75 ni = std::floor((max_box[0] - min_box[0]) / dx);
76 nj = std::floor((max_box[1] - min_box[1]) / dx);
77 nk = std::floor((max_box[2] - min_box[2]) / dx);
86 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);
110 Vec3f x13(x1 - x3), x23(x2 - x3), x03(x0 - x3);
111 float m13 = x13.normSquared(), m23 = x23.normSquared(), d = x13.dot(x23);
112 float invdet = 1.f / std::max(m13*m23 - d * d, 1e-30f);
113 float a = x13.dot(x03), b = x23.dot(x03);
115 float w23 = invdet * (m23*a - d * b);
116 float w31 = invdet * (m13*b - d * a);
117 float w12 = 1 - w23 - w31;
118 if (w23 >= 0 && w31 >= 0 && w12 >= 0) {
119 return (x0 - (w23*x1 + w31 * x2 + w12 * x3)).norm();
133 const Vec3f &gx,
int i0,
int j0,
int k0,
int i1,
int j1,
int k1)
135 if (closest_tri(i1, j1, k1) >= 0) {
136 unsigned int p, q, r;
137 Vec3ui trijk = tri[closest_tri(i1, j1, k1)];
142 if (d < phi(i0, j0, k0)) {
144 closest_tri(i0, j0, k0) = closest_tri(i1, j1, k1);
151 int di,
int dj,
int dk)
155 i0 = 1; i1 = phi.nx();
158 i0 = phi.nx() - 2; i1 = -1;
162 j0 = 1; j1 = phi.ny();
165 j0 = phi.ny() - 2; j1 = -1;
169 k0 = 1; k1 = phi.nz();
172 k0 = phi.nz() - 2; k1 = -1;
174 for (
int k = k0; k != k1; k += dk)
for (
int j = j0; j != j1; j += dj)
for (
int i = i0; i != i1; i += di) {
175 Vec3f gx(i*dx + origin[0], j*dx + origin[1], k*dx + origin[2]);
176 FSM_CheckNeighbour(tri, x, phi, closest_tri, gx, i, j, k, i - di, j, k);
177 FSM_CheckNeighbour(tri, x, phi, closest_tri, gx, i, j, k, i, j - dj, k);
178 FSM_CheckNeighbour(tri, x, phi, closest_tri, gx, i, j, k, i - di, j - dj, k);
179 FSM_CheckNeighbour(tri, x, phi, closest_tri, gx, i, j, k, i, j, k - dk);
180 FSM_CheckNeighbour(tri, x, phi, closest_tri, gx, i, j, k, i - di, j, k - dk);
181 FSM_CheckNeighbour(tri, x, phi, closest_tri, gx, i, j, k, i, j - dj, k - dk);
182 FSM_CheckNeighbour(tri, x, phi, closest_tri, gx, i, j, k, i - di, j - dj, k - dk);
228 const int exact_band = 1;
229 Real dx = this->varSpacing()->getValue();
235 closest_tri.assign(-1);
237 intersection_count.assign(0);
255 int i0 =
clamp(
int(
TRI_MIN(fip, fiq, fir)) - exact_band, 0,
ni - 1);
256 int i1 =
clamp(
int(
TRI_MAX(fip, fiq, fir)) + exact_band + 1, 0,
ni - 1);
257 int j0 =
clamp(
int(
TRI_MIN(fjp, fjq, fjr)) - exact_band, 0,
nj - 1);
258 int j1 =
clamp(
int(
TRI_MAX(fjp, fjq, fjr)) + exact_band + 1, 0,
nj - 1);
259 int k0 =
clamp(
int(
TRI_MIN(fkp, fkq, fkr)) - exact_band, 0,
nk - 1);
260 int k1 =
clamp(
int(
TRI_MAX(fkp, fkq, fkr)) + exact_band + 1, 0,
nk - 1);
261 for (
int k = k0; k <= k1; ++k)
for (
int j = j0; j <= j1; ++j)
for (
int i = i0; i <= i1; ++i) {
264 if (d <
phi(i, j, k)) {
266 closest_tri(i, j, k) = t;
274 for (
int k = k0; k <= k1; ++k)
for (
int j = j0; j <= j1; ++j) {
276 if (
point_in_triangle_2d(j, k, fjp, fkp, fjq, fkq, fjr, fkr, a, b, c)) {
277 double fi = a * fip + b * fiq + c * fir;
278 int i_interval = int(std::ceil(fi));
279 if (i_interval < 0) ++intersection_count(0, j, k);
280 else if (i_interval <
ni) ++intersection_count(i_interval, j, k);
286 for (
unsigned int pass = 0; pass < 2; ++pass) {
297 for (
int k = 0; k <
nk; ++k)
for (
int j = 0; j <
nj; ++j) {
299 for (
int i = 0; i <
ni; ++i) {
300 total_count += intersection_count(i, j, k);
301 if (total_count % 2 == 1) {
302 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)