97 T v_1 = info_ptr_1->value(i_1, j_1);
98 T v_2 = info_ptr_2->value(i_2, j_2);
100 X f = (fabs(v_2 - v_1) > epsilon) ? (X)(iso_value - v_1) / (v_2 - v_1) : (X) 0.5;
104 if (f < grid_epsilon) {
105 int vj = info_ptr_1->snap_index(i_1, j_1);
107 info_ptr_1->index(i_1, j_1, e) = vj;
110 info_ptr_1->snap_index(i_1, j_1) = vi;
113 else if (1 - f < grid_epsilon) {
114 int vj = info_ptr_2->snap_index(i_2, j_2);
116 info_ptr_1->index(i_1, j_1, e) = vj;
119 info_ptr_2->snap_index(i_2, j_2) = vi;
122 q(e) -= (1 - f)*d(e);
124 info_ptr_1->index(i_1, j_1, e) = vi;
132 unsigned int resx,
unsigned int resy,
unsigned int resz,
133 const Eval& eval,
const Valid& valid,
bool show_progress =
false)
138 d(0) /= (resx - 1); d(1) /= (resy - 1); d(2) /= (resz - 1);
139 iso_value = _iso_value;
143 if (show_progress) prog.
init(
"extraction", resz, 10);
146 slice_info<T> slice_info_1(resx, resy), slice_info_2(resx, resy);
147 slice_info<T> *slice_info_ptrs[2] = { &slice_info_1, &slice_info_2 };
150 unsigned int nr_vertices[3] = { 0, 0, 0 };
151 unsigned int i, j, k, n;
152 for (k = 0; k < resz; ++k, p(2) += d(2)) {
157 for (j = 0, p(1) = box.
get_min_pnt()(1); j < resy; ++j, p(1) += d(1))
158 for (i = 0, p(0) = box.
get_min_pnt()(0); i < resx; ++i, p(0) += d(0)) {
159 T v = eval(i, j, k, p);
162 if (i > 0 && info_ptr->flag(i - 1, j) != info_ptr->flag(i, j) && valid(info_ptr->value(i - 1, j)))
164 if (j > 0 && info_ptr->flag(i, j - 1) != info_ptr->flag(i, j) && valid(info_ptr->value(i, j - 1)))
176 for (j = 0, p(1) = box.
get_min_pnt()(1); j < resy; ++j, p(1) += d(1))
177 for (i = 0, p(0) = box.
get_min_pnt()(0); i < resx; ++i, p(0) += d(0))
178 if (prev_info_ptr->flag(i, j) != info_ptr->flag(i, j) && valid(prev_info_ptr->value(i, j)) && valid(info_ptr->value(i, j)))
182 for (j = 0; j < resy - 1; ++j) {
183 for (i = 0; i < resx - 1; ++i) {
185 int idx = prev_info_ptr->get_bit_code(i, j) +
186 16 * info_ptr->get_bit_code(i, j);
188 if (idx == 0 || idx == 255)
192 prev_info_ptr->index(i, j, 0),
193 prev_info_ptr->index(i + 1, j, 1),
194 prev_info_ptr->index(i, j + 1, 0),
195 prev_info_ptr->index(i, j, 1),
196 info_ptr->index(i, j, 0),
197 info_ptr->index(i + 1, j, 1),
198 info_ptr->index(i, j + 1, 0),
199 info_ptr->index(i, j, 1),
200 prev_info_ptr->index(i, j, 2),
201 prev_info_ptr->index(i + 1, j, 2),
202 prev_info_ptr->index(i, j + 1, 2),
203 prev_info_ptr->index(i + 1, j + 1, 2)
206 int n = get_nr_cube_triangles(idx);
207 for (
int t = 0; t < n; ++t) {
209 put_cube_triangle(idx, t, vi, vj, vk);
213 if (vi == -1 || vj == -1 || vk == -1)
215 if ((vi != vj) && (vi != vk) && (vj != vk))
222 nr_vertices[k % 3] = n;
223 n = nr_vertices[(k + 2) % 3];