32 template<
class AboveOp,
class BelowOp>
35 const FixedList<point, 3>& tri,
36 const FixedList<scalar, 3>& level,
37 const AboveOp& aboveOp,
38 const BelowOp& belowOp
43 if (level[0] >= 0 && level[1] >= 0 && level[2] >= 0)
45 return aboveOp(tri) + belowOp();
47 if (level[0] <= 0 && level[1] <= 0 && level[2] <= 0)
49 return aboveOp() + belowOp(tri);
54 FixedList<label, 3> indices({0, 1, 2});
56 for (i = 0; i < 3; ++i)
58 if (level[(i + 1)%3]*level[(i + 2)%3] >= 0)
60 Swap(indices[0], indices[i]);
67 <<
"The number of tri vertices above the level set should always "
74 Swap(indices[1], indices[2]);
78 const FixedList<point, 3>
p =
triReorder(tri, indices);
79 const FixedList<scalar, 3> l =
triReorder(level, indices);
85 for (label i = 0; i < 2; ++i)
87 f[i] = l[0]/(l[0] - l[i+1]);
100 template<
class AboveOp,
class BelowOp>
103 const FixedList<point, 3>& tri,
105 const AboveOp& aboveOp,
106 const BelowOp& belowOp
110 FixedList<scalar, 3> level;
111 for (label i = 0; i < 3; ++i)
113 level[i] = pln.signedDistance(tri[i]);
117 return triCut(tri, level, aboveOp, belowOp);
121 template<
class AboveOp,
class BelowOp>
124 const FixedList<point, 4>& tet,
125 const FixedList<scalar, 4>& level,
126 const AboveOp& aboveOp,
127 const BelowOp& belowOp
132 scalar levelMin = VGREAT, levelMax = - VGREAT;
133 for (label i = 0; i < 4; ++i)
135 levelMin =
min(levelMin, level[i]);
136 levelMax =
max(levelMax, level[i]);
140 return aboveOp(tet) + belowOp();
144 return aboveOp() + belowOp(tet);
151 FixedList<label, 4> indices({0, 1, 2, 3});
152 bool signChange =
false;
156 while (i < j && level[indices[i]] > 0)
160 while (j > i && level[indices[j]] <= 0)
168 Swap(indices[i], indices[j]);
169 signChange = !signChange;
180 for (label i = 0; i < 2; ++i)
182 Swap(indices[i], indices[3-i]);
189 Swap(indices[2], indices[3]);
193 const FixedList<point, 4>
p =
tetReorder(tet, indices);
194 const FixedList<scalar, 4> l =
tetReorder(level, indices);
202 FixedList<scalar, 3>
f;
203 for (label i = 0; i < 3; ++i)
205 f[i] = l[0]/(l[0] - l[i+1]);
219 FixedList<scalar, 4>
f;
220 for (label i = 0; i < 2; ++i)
222 for (label j = 0; j < 2; ++j)
224 f[2*i+j] = l[i]/(l[i] - l[j+2]);
238 <<
"The number of tet vertices above the level set should always be "
241 return aboveOp() + belowOp();
245 template<
class AboveOp,
class BelowOp>
248 const FixedList<point, 4>& tet,
250 const AboveOp& aboveOp,
251 const BelowOp& belowOp
255 FixedList<scalar, 4> level;
256 for (label i = 0; i < 4; ++i)
258 level[i] = pln.signedDistance(tet[i]);
262 return tetCut(tet, level, aboveOp, belowOp);