24 c_base +=
data->nn_dof[i];
29 for (i = 0; i < sff->
data_comp; i++) s_base +=
data->nn_dof[i];
33 for (i = 0; i < 4; i++) {
40 tmp =
data->node_val_item[(nodeID - 1) * tn_component + c_base + j];
41 tetra->
c_data[i] += tmp * tmp;
47 data->node_val_item[(nodeID - 1) * tn_component + c_base +
51 data->node_val_item[(nodeID - 1) * tn_component + c_base];
57 tetra->
axis[i * 3 + 1] =
mesh->
node[(nodeID - 1) * 3 + 1];
58 tetra->
axis[i * 3 + 2] =
mesh->
node[(nodeID - 1) * 3 + 2];
64 tmp =
data->node_val_item[(nodeID - 1) * tn_component + s_base + j];
65 tetra->
s_data[i] += tmp * tmp;
70 data->node_val_item[(nodeID - 1) * tn_component + s_base +
74 data->node_val_item[(nodeID - 1) * tn_component + s_base];
79 tetra->
axis[i * 3 + 1], tetra->
axis[i * 3 + 2]);
88 static double intersect_line(
int v0,
int v1,
double isovalue,
Tetra *tetra,
96 rate = (isovalue - tetra->
s_data[v0]) /
98 for (j = 0; j < 3; j++)
99 point[j] = rate * (tetra->
axis[v1 * 3 + j] - tetra->
axis[v0 * 3 + j]) +
100 tetra->
axis[v0 * 3 + j];
113 double point[3], color;
117 int flag_existing, index_patch, patch[4];
118 int v1, v2, v[4], count_minus, count_plus;
119 double fp[4][3], n_f[3], n_norm, f_cen_point[3], sign_f, n_c, c_c[3];
121 for (i = 0; i < 4; i++) {
122 if (tetra->
s_data[i] > isovalue) num_gt_0++;
125 if ((num_gt_0 != 0) &&
128 if ((num_gt_0 == 1) ||
139 for (i = 0; i < 4; i++) {
140 if (tetra->
s_data[i] > isovalue) v0_id = i;
142 }
else if (num_gt_0 == 3) {
144 for (i = 0; i < 4; i++) {
145 if (tetra->
s_data[i] <= isovalue) v0_id = i;
150 for (i = 0; i < 4; i++) {
152 color = intersect_line(v0_id, i, isovalue, tetra, point);
182 for (j = 0; j < vertex_hash_table[tmp_int].
ident; j++) {
188 patch[index_patch] = h1->
ident;
189 for (k = 0; k < 3; k++) fp[index_patch][k] = point[k];
194 if (flag_existing == 0) {
195 vertex_hash_table[tmp_int].
ident++;
202 for (j = 0; j < 3; j++) h1->
geom[j] = point[j];
205 tetra_point->
ident++;
210 for (j = 0; j < 3; j++) p1->
geom[j] = point[j];
213 patch[index_patch] = p1->
ident;
214 for (k = 0; k < 3; k++) fp[index_patch][k] = point[k];
222 n_f[0] = (fp[1][1] - fp[0][1]) * (fp[2][2] - fp[0][2]) -
223 (fp[2][1] - fp[0][1]) * (fp[1][2] - fp[0][2]);
224 n_f[1] = -(fp[1][0] - fp[0][0]) * (fp[2][2] - fp[0][2]) +
225 (fp[2][0] - fp[0][0]) * (fp[1][2] - fp[0][2]);
226 n_f[2] = (fp[1][0] - fp[0][0]) * (fp[2][1] - fp[0][1]) -
227 (fp[2][0] - fp[0][0]) * (fp[1][1] - fp[0][1]);
228 for (j = 0; j < 3; j++) fp[3][j] = tetra->
axis[v0_id * 3 + j];
229 n_norm = sqrt(n_f[0] * n_f[0] + n_f[1] * n_f[1] + n_f[2] * n_f[2]);
231 for (j = 0; j < 3; j++) n_f[j] /= n_norm;
234 for (j = 0; j < 3; j++)
235 f_cen_point[j] = (fp[0][j] + fp[1][j] + fp[2][j]) / 3.0;
236 for (j = 0; j < 3; j++) c_c[j] = fp[3][j] - f_cen_point[j];
237 n_c = sqrt(c_c[0] * c_c[0] + c_c[1] * c_c[1] + c_c[2] * c_c[2]);
239 for (j = 0; j < 3; j++) c_c[j] /= n_c;
241 sign_f = n_f[0] * c_c[0] + n_f[1] * c_c[1] + n_f[2] * c_c[2];
242 if (((tetra->
s_data[v0_id] > isovalue) && (sign_f < -
EPSILON)) ||
243 ((tetra->
s_data[v0_id] <= isovalue) && (sign_f >
EPSILON))) {
248 for (j = 0; j < 3; j++) t1->
patch[j] = patch[j];
252 else if (num_gt_0 == 2) {
256 for (i = 0; i < 4; i++) {
257 if (tetra->
s_data[i] <= isovalue) {
261 v[2 + count_plus] = i;
267 for (i = 0; i < 4; i++)
268 for (j = 0; j < 3; j++) fp[i][j] = tetra->
axis[v[i] * 3 + j];
269 n_f[0] = (fp[2][1] - fp[1][1]) * (fp[1][2] - fp[0][2]) -
270 (fp[1][1] - fp[0][1]) * (fp[2][2] - fp[1][2]);
271 n_f[1] = -(fp[2][0] - fp[1][0]) * (fp[1][2] - fp[0][2]) +
272 (fp[1][0] - fp[0][0]) * (fp[2][2] - fp[1][2]);
273 n_f[2] = (fp[2][0] - fp[1][0]) * (fp[1][1] - fp[0][1]) -
274 (fp[1][0] - fp[0][0]) * (fp[2][1] - fp[1][1]);
275 n_norm = sqrt(n_f[0] * n_f[0] + n_f[1] * n_f[1] + n_f[2] * n_f[2]);
277 for (j = 0; j < 3; j++) n_f[j] /= n_norm;
280 for (j = 0; j < 3; j++)
281 f_cen_point[j] = (fp[0][j] + fp[1][j] + fp[2][j]) / 3.0;
282 for (j = 0; j < 3; j++) c_c[j] = fp[3][j] - f_cen_point[j];
283 n_c = sqrt(c_c[0] * c_c[0] + c_c[1] * c_c[1] + c_c[2] * c_c[2]);
285 for (j = 0; j < 3; j++) c_c[j] /= n_c;
287 sign_f = n_f[0] * c_c[0] + n_f[1] * c_c[1] + n_f[2] * c_c[2];
295 for (i = 0; i < 4; i++) {
310 color = intersect_line(v1, v2, isovalue, tetra, point);
341 for (j = 0; j < vertex_hash_table[tmp_int].
ident; j++) {
347 patch[index_patch] = h1->
ident;
348 for (k = 0; k < 3; k++) fp[index_patch][k] = point[k];
353 if (flag_existing == 0) {
354 vertex_hash_table[tmp_int].
ident++;
361 for (j = 0; j < 3; j++) h1->
geom[j] = point[j];
364 tetra_point->
ident++;
369 for (j = 0; j < 3; j++) p1->
geom[j] = point[j];
372 patch[index_patch] = p1->
ident;
373 for (k = 0; k < 3; k++) fp[index_patch][k] = point[k];
382 n_f[0] = (fp[1][1] - fp[0][1]) * (fp[2][2] - fp[0][2]) -
383 (fp[2][1] - fp[0][1]) * (fp[1][2] - fp[0][2]);
384 n_f[1] = -(fp[1][0] - fp[0][0]) * (fp[2][2] - fp[0][2]) +
385 (fp[2][0] - fp[0][0]) * (fp[1][2] - fp[0][2]);
386 n_f[2] = (fp[1][0] - fp[0][0]) * (fp[2][1] - fp[0][1]) -
387 (fp[2][0] - fp[0][0]) * (fp[1][1] - fp[0][1]);
388 for (j = 0; j < 3; j++) fp[3][j] = tetra->
axis[0 * 3 + j];
389 n_norm = sqrt(n_f[0] * n_f[0] + n_f[1] * n_f[1] + n_f[2] * n_f[2]);
391 for (j = 0; j < 3; j++) n_f[j] /= n_norm;
394 for (j = 0; j < 3; j++)
395 f_cen_point[j] = (fp[0][j] + fp[1][j] + fp[2][j]) / 3.0;
396 for (j = 0; j < 3; j++) c_c[j] = fp[3][j] - f_cen_point[j];
397 n_c = sqrt(c_c[0] * c_c[0] + c_c[1] * c_c[1] + c_c[2] * c_c[2]);
399 for (j = 0; j < 3; j++) c_c[j] /= n_c;
401 sign_f = n_f[0] * c_c[0] + n_f[1] * c_c[1] + n_f[2] * c_c[2];
402 if (((tetra->
s_data[0] > isovalue) && (sign_f < -
EPSILON)) ||
415 for (j = 0; j < 3; j++) t1->
patch[j] = patch[j];
422 t1->
patch[0] = patch[0];
423 t1->
patch[1] = patch[2];
424 t1->
patch[2] = patch[3];