12 #if defined(old_version) || defined(old_intersection)
21 static int find_out_point(
double orig_xyz[3],
double r_dxyz[3],
int ijk[3],
22 double in_point[3],
double ray_direction[3],
23 int face_sect[3],
double out_point[3]);
24 static void find_next_cell(
int ijkn[3],
int current_ijk[3],
int face_sect[3],
25 double vv[3],
int next_ijk[3]);
27 static int find_first_inter_point(
double point_o[3],
double view_p[3],
28 double ray_direction[3],
double orig_xyz[3],
29 double dxyz[3],
int r_level[3],
31 int i, j, mincomp, intersection;
32 double minmax[6], t[6], mint;
34 for (i = 0; i < 3; i++) {
35 minmax[i * 2] = orig_xyz[i];
36 minmax[i * 2 + 1] = orig_xyz[i] + dxyz[i];
38 for (i = 0; i < 3; i++) {
39 if (fabs(ray_direction[i]) <
EPSILON) {
41 t[i * 2 + 1] = 1.0E+17;
43 t[i * 2] = (minmax[i * 2] - view_p[i]) / ray_direction[i];
44 t[i * 2 + 1] = (minmax[i * 2 + 1] - view_p[i]) / ray_direction[i];
48 for (i = 0; i < 3; i++) {
49 t[i * 2] = (minmax[i * 2] - view_p[i]) / (ray_direction[i] +
EPSILON);
51 (minmax[i * 2 + 1] - view_p[i]) / (ray_direction[i] +
EPSILON);
57 for (i = 0; i < 6; i++) {
58 if ((mint > t[i]) && (t[i] >
EPSILON)) {
59 for (j = 0; j < 3; j++) first_p[j] = view_p[j] + t[i] * ray_direction[j];
60 if ((first_p[0] >= minmax[0] -
EPSILON) &&
61 (first_p[0] <= minmax[1] +
EPSILON) &&
62 (first_p[1] >= minmax[2] -
EPSILON) &&
63 (first_p[1] <= minmax[3] +
EPSILON) &&
64 (first_p[2] >= minmax[4] -
EPSILON) &&
65 (first_p[2] <= minmax[5] +
EPSILON)) {
71 if ((mincomp >= 0) && (mincomp <= 5)) {
73 for (i = 0; i < 3; i++) first_p[i] = view_p[i] + mint * ray_direction[i];
90 int find_first_inter_point(
double point_o[3],
double view_p[3],
VR_data *vd,
92 int i, j, m, node[4], spm[6], minsp;
93 double vv[8 * 3], nn, a[6], b[6], c[6], d[6], abc, in_vv[3], in_point[3],
95 double t, st[6], mint, out_point[3], point[3];
99 for (i = 0; i < 3; i++) in_vv[i] = point_o[i] - view_p[i];
100 nn = sqrt(
SQR(in_vv[0]) +
SQR(in_vv[1]) +
SQR(in_vv[2]));
102 for (i = 0; i < 3; i++) in_vv[i] /= nn;
104 for (i = 0; i < 3; i++) in_point[i] = view_p[i];
105 vv[0 * 3] = vv[4 * 3] = vv[7 * 3] = vv[3 * 3] = vd->
xyz0[0];
106 vv[1 * 3] = vv[5 * 3] = vv[6 * 3] = vv[2 * 3] =
108 vv[0 * 3 + 2] = vv[1 * 3 + 2] = vv[2 * 3 + 2] = vv[3 * 3 + 2] = vd->
xyz0[2];
109 vv[4 * 3 + 2] = vv[5 * 3 + 2] = vv[6 * 3 + 2] = vv[7 * 3 + 2] =
111 vv[0 * 3 + 1] = vv[1 * 3 + 1] = vv[5 * 3 + 1] = vv[4 * 3 + 1] = vd->
xyz0[1];
112 vv[3 * 3 + 1] = vv[2 * 3 + 1] = vv[6 * 3 + 1] = vv[7 * 3 + 1] =
115 for (m = 0; m < 6; m++) {
117 for (i = 0; i < 4; i++)
118 for (j = 0; j < 3; j++) fp[i][j] = vv[node[i] * 3 + j];
119 a[m] = (fp[1][1] - fp[0][1]) * (fp[3][2] - fp[0][2]) -
120 (fp[3][1] - fp[0][1]) * (fp[1][2] - fp[0][2]);
121 b[m] = -(fp[1][0] - fp[0][0]) * (fp[3][2] - fp[0][2]) +
122 (fp[3][0] - fp[0][0]) * (fp[1][2] - fp[0][2]);
123 c[m] = (fp[1][0] - fp[0][0]) * (fp[3][1] - fp[0][1]) -
124 (fp[3][0] - fp[0][0]) * (fp[1][1] - fp[0][1]);
125 abc = sqrt(a[m] * a[m] + b[m] * b[m] + c[m] * c[m]);
131 d[m] = -(fp[0][0] * a[m] + fp[0][1] * b[m] + fp[0][2] * c[m]);
135 for (m = 0; m < 6; m++) {
136 if (fabs(a[m] * in_vv[0] + b[m] * in_vv[1] + c[m] * in_vv[2]) >
EPSILON) {
137 t = (-d[m] - a[m] * in_point[0] - b[m] * in_point[1] -
138 c[m] * in_point[2]) /
139 (a[m] * in_vv[0] + b[m] * in_vv[1] + c[m] * in_vv[2]);
142 for (j = 0; j < 3; j++) point[j] = in_point[j] + t * in_vv[j];
190 for (m = 1; m <= lc; m++) {
196 for (j = 0; j < 3; j++) out_point[j] = in_point[j] + mint * in_vv[j];
199 for (i = 0; i < 3; i++) first_p[i] = out_point[i];
209 void search2_leave(
Tree_pointer *in_voxel,
double out_point[3],
211 int i, index[3], child_no;
216 for (i = 0; i < 3; i++) {
219 if (ray_direction[i] < 0) {
220 if (out_point[i] <= mid_value)
224 }
else if (ray_direction[i] >= 0) {
225 if (out_point[i] < mid_value)
231 child_no = index[2] * 4 + index[1] * 2 + index[0];
232 p1 = &(p1->
child[child_no]);
238 void search_leave(
Tree_pointer *root_tree,
int ini_index,
double first_p[3],
241 int index[3], child_no;
245 p1 = &(root_tree[ini_index]);
247 for (i = 0; i < 3; i++) {
250 if (ray_direction[i] < 0) {
251 if (first_p[i] <= mid_value)
255 }
else if (ray_direction[i] >= 0) {
256 if (first_p[i] < mid_value)
262 child_no = index[2] * 4 + index[1] * 2 + index[0];
263 p1 = &(p1->
child[child_no]);
272 double orig_xyz[3],
double dxyz[3],
double r_dxyz[3],
273 double ray_direction[3],
double first_p[3],
int ijk[3]) {
275 int ini_face, intersection, con1, next_ijk[3], face_sect[3];
278 ini_face = find_first_inter_point(point_o, view_point_d, ray_direction,
279 orig_xyz, dxyz, r_level, first_p);
280 if (ini_face == -1) {
284 for (i = 0; i < 3; i++)
285 ijk[i] = (
int)((first_p[i] - orig_xyz[i] -
EPSILON) / r_dxyz[i]);
286 if ((ijk[0] < 0) || (ijk[0] > r_level[0] - 1) || (ijk[1] < 0) ||
287 (ijk[1] > r_level[1] - 1) || (ijk[2] < 0) || (ijk[2] > r_level[2] - 1))
289 "ERROR: HEC-MW-VIS-E2006:There is something wrong on finding the "
291 for (i = 0; i < 3; i++) out_point[i] = 0.0;
292 con1 = find_out_point(orig_xyz, r_dxyz, ijk, first_p, ray_direction,
293 face_sect, out_point);
296 find_next_cell(r_level, ijk, face_sect, ray_direction, next_ijk);
297 if ((next_ijk[0] < 0) || (next_ijk[0] > r_level[0] - 1) ||
298 (next_ijk[1] < 0) || (next_ijk[1] > r_level[1] - 1) ||
299 (next_ijk[2] < 0) || (next_ijk[2] > r_level[2] - 1))
302 for (i = 0; i < 3; i++) ijk[i] = next_ijk[i];
311 double ray_direction[3],
double first_p[3])
314 int i, ijk[3], ini_index, ijkn[3];
315 int ini_face, intersection, con1, face_sect[3], next_ijk[3];
316 double view_p[3], out_point[3];
319 for (i = 0; i < 3; i++) ijkn[i] = vd->
nxyz[i];
321 for (i = 0; i < 3; i++) view_p[i] = vr->
view_point_d[i];
322 ini_face = find_first_inter_point(point_o, view_p, vd, first_p);
323 if (ini_face == -1) {
332 for (i = 1; i < 3; i++)
333 ijk[i] = (
int)((first_p[i] - vd->
xyz0[i]) / vd->
dxyz[i]);
334 }
else if (ini_face == 1) {
335 ijk[0] = vd->
nxyz[0] - 1;
336 for (i = 1; i < 3; i++)
337 ijk[i] = (
int)((first_p[i] - vd->
xyz0[i]) / vd->
dxyz[i]);
338 }
else if (ini_face == 2) {
340 ijk[0] = (int)((first_p[0] - vd->
xyz0[0]) / vd->
dxyz[0]);
341 ijk[2] = (int)((first_p[2] - vd->
xyz0[2]) / vd->
dxyz[2]);
342 }
else if (ini_face == 3) {
343 ijk[1] = vd->
nxyz[1] - 1;
344 ijk[0] = (int)((first_p[0] - vd->
xyz0[0]) / vd->
dxyz[0]);
345 ijk[2] = (int)((first_p[2] - vd->
xyz0[2]) / vd->
dxyz[2]);
346 }
else if (ini_face == 4) {
348 ijk[0] = (int)((first_p[0] - vd->
xyz0[0]) / vd->
dxyz[0]);
349 ijk[1] = (int)((first_p[1] - vd->
xyz0[1]) / vd->
dxyz[1]);
350 }
else if (ini_face == 5) {
351 ijk[2] = vd->
nxyz[2] - 1;
352 ijk[0] = (int)((first_p[0] - vd->
xyz0[0]) / vd->
dxyz[0]);
353 ijk[1] = (int)((first_p[1] - vd->
xyz0[1]) / vd->
dxyz[1]);
356 for (i = 0; i < 3; i++) out_point[i] = 0.0;
357 con1 = find_out_point(vd, first_p, ray_direction, face_sect, out_point);
360 find_next_cell(ijkn, ijk, face_sect, ray_direction, next_ijk);
361 for (i = 0; i < 3; i++) ijk[i] = next_ijk[i];
363 ijk[2] * vd->
nxyz[1] * vd->
nxyz[0] + ijk[1] * vd->
nxyz[0] + ijk[0];
365 search_leave(root_tree, ini_index, first_p, &vvv, ray_direction);
369 return (intersection);
372 void build_adjacent_index(
int connect[8][6],
int local_face[8][6]) {
373 connect[0][0] = connect[0][2] = connect[0][4] = -1;
374 local_face[0][0] = 0;
375 local_face[0][2] = 2;
376 local_face[0][4] = 4;
378 local_face[0][1] = 0;
380 local_face[0][3] = 2;
382 local_face[0][5] = 4;
383 connect[1][1] = connect[1][2] = connect[1][4] = -1;
384 local_face[1][1] = 1;
385 local_face[1][2] = 2;
386 local_face[1][4] = 4;
388 local_face[1][0] = 1;
390 local_face[1][3] = 2;
392 local_face[1][5] = 4;
393 connect[2][0] = connect[2][3] = connect[2][4] = -1;
394 local_face[2][0] = 0;
395 local_face[2][3] = 3;
396 local_face[2][4] = 4;
398 local_face[2][1] = 0;
400 local_face[2][2] = 3;
402 local_face[2][5] = 4;
403 connect[3][1] = connect[3][3] = connect[3][4] = -1;
404 local_face[3][1] = 1;
405 local_face[3][3] = 3;
406 local_face[3][4] = 4;
408 local_face[3][0] = 1;
410 local_face[3][2] = 3;
412 local_face[3][5] = 4;
413 connect[4][0] = connect[4][2] = connect[4][5] = -1;
414 local_face[4][0] = 0;
415 local_face[4][2] = 2;
416 local_face[4][5] = 5;
418 local_face[4][1] = 0;
420 local_face[4][3] = 2;
422 local_face[4][4] = 5;
423 connect[5][1] = connect[5][2] = connect[5][5] = -1;
424 local_face[5][1] = 1;
425 local_face[5][2] = 2;
426 local_face[5][5] = 5;
428 local_face[5][0] = 1;
430 local_face[5][3] = 2;
432 local_face[5][4] = 5;
433 connect[6][0] = connect[6][3] = connect[6][5] = -1;
434 local_face[6][0] = 0;
435 local_face[6][3] = 3;
436 local_face[6][5] = 5;
438 local_face[6][1] = 0;
440 local_face[6][2] = 3;
442 local_face[6][4] = 5;
443 connect[7][1] = connect[7][3] = connect[7][5] = -1;
444 local_face[7][1] = 1;
445 local_face[7][3] = 3;
446 local_face[7][5] = 5;
448 local_face[7][0] = 1;
450 local_face[7][2] = 3;
452 local_face[7][4] = 5;
457 #ifdef old_intersection
458 static void find_coordinates_of_cell(
int r_level[3],
double orig_xyz[3],
459 double r_dxyz[3],
int ijk[3],
461 vv[0 * 3] = vv[4 * 3] = vv[7 * 3] = vv[3 * 3] =
462 orig_xyz[0] + ijk[0] * r_dxyz[0];
463 vv[1 * 3] = vv[5 * 3] = vv[6 * 3] = vv[2 * 3] =
464 orig_xyz[0] + (ijk[0] + 1) * r_dxyz[0];
465 vv[0 * 3 + 2] = vv[1 * 3 + 2] = vv[2 * 3 + 2] = vv[3 * 3 + 2] =
466 orig_xyz[2] + ijk[2] * r_dxyz[2];
467 vv[4 * 3 + 2] = vv[5 * 3 + 2] = vv[6 * 3 + 2] = vv[7 * 3 + 2] =
468 orig_xyz[2] + (ijk[2] + 1) * r_dxyz[2];
469 vv[0 * 3 + 1] = vv[1 * 3 + 1] = vv[5 * 3 + 1] = vv[4 * 3 + 1] =
470 orig_xyz[1] + ijk[1] * r_dxyz[1];
471 vv[3 * 3 + 1] = vv[2 * 3 + 1] = vv[6 * 3 + 1] = vv[7 * 3 + 1] =
472 orig_xyz[1] + (ijk[1] + 1) * r_dxyz[1];
476 int find_out_point(
VR_data *vd,
int ijk[3],
double in_point[3],
477 double ray_direction[3],
int face_sect[3],
481 double fp[4][3], t, a[6], b[6], c[6], d[6], abc, st[6], mint, vv[24];
482 int i, j, m, lc, spm[6], con1, minsp, node[4], face1_sect[3], lm;
484 find_coordinates_of_cell(vd, ijk, vv);
487 for (m = 0; m < 6; m++) {
489 for (i = 0; i < 4; i++)
490 for (j = 0; j < 3; j++) {
491 fp[i][j] = vv[node[i] * 3 + j];
495 a[m] = (fp[1][1] - fp[0][1]) * (fp[3][2] - fp[0][2]) -
496 (fp[3][1] - fp[0][1]) * (fp[1][2] - fp[0][2]);
497 b[m] = -(fp[1][0] - fp[0][0]) * (fp[3][2] - fp[0][2]) +
498 (fp[3][0] - fp[0][0]) * (fp[1][2] - fp[0][2]);
499 c[m] = (fp[1][0] - fp[0][0]) * (fp[3][1] - fp[0][1]) -
500 (fp[3][0] - fp[0][0]) * (fp[1][1] - fp[0][1]);
501 abc = sqrt(a[m] * a[m] + b[m] * b[m] + c[m] * c[m]);
505 d[m] = -(fp[0][0] * a[m] + fp[0][1] * b[m] + fp[0][2] * c[m]);
508 for (m = 0; m < 3; m++) face_sect[m] = -1;
509 for (m = 0; m < 6; m++) {
510 if (fabs(a[m] * in_point[0] + b[m] * in_point[1] + c[m] * in_point[2] +
516 for (m = 0; m < 6; m++) {
517 if ((m != face_sect[0]) && (m != face_sect[1]) && (m != face_sect[2])) {
518 if (fabs(a[m] * ray_direction[0] + b[m] * ray_direction[1] +
519 c[m] * ray_direction[2]) > 0.000001) {
520 t = (-d[m] - a[m] * in_point[0] - b[m] * in_point[1] -
521 c[m] * in_point[2]) /
522 (a[m] * ray_direction[0] + b[m] * ray_direction[1] +
523 c[m] * ray_direction[2]);
538 for (m = 1; m <= lc; m++) {
546 for (j = 0; j < 3; j++)
547 out_point[j] = in_point[j] + mint * ray_direction[j];
558 for (m = 0; m < 3; m++) face1_sect[m] = -1;
559 for (m = 0; m < 6; m++) {
560 if (fabs(a[m] * out_point[0] + b[m] * out_point[1] + c[m] * out_point[2] +
567 for (m = 0; m < 3; m++) face_sect[m] = face1_sect[m];
578 static int find_out_point(
double orig_xyz[3],
double r_dxyz[3],
int ijk[3],
579 double in_point[3],
double ray_direction[3],
580 int face_sect[3],
double out_point[3]) {
581 int i, j, mincomp, intersection;
582 double minmax[6], t[3], mint;
584 for (i = 0; i < 3; i++) face_sect[i] = -1;
585 for (i = 0; i < 6; i++) {
588 minmax[i] = orig_xyz[i1] + (ijk[i1] + j1) * r_dxyz[i1];
591 for (i = 0; i < 3; i++) {
592 if (fabs(ray_direction[i]) <
EPSILON)
595 if (ray_direction[i] > 0)
596 t[i] = (minmax[i * 2 + 1] - in_point[i]) / ray_direction[i];
597 else if (ray_direction[i] < 0)
598 t[i] = (in_point[i] - minmax[i * 2]) / (-ray_direction[i]);
602 for (i = 0; i < 3; i++) {
603 if (ray_direction[i] > 0)
604 t[i] = (minmax[i * 2 + 1] - in_point[i]) / (ray_direction[i] +
EPSILON);
605 else if (ray_direction[i] < 0)
606 t[i] = (in_point[i] - minmax[i * 2]) / (-ray_direction[i] +
EPSILON);
611 for (i = 0; i < 3; i++) {
612 if ((mint > t[i]) && (t[i] >
EPSILON)) {
613 for (j = 0; j < 3; j++)
614 out_point[j] = in_point[j] + t[i] * ray_direction[j];
615 if ((out_point[0] >= minmax[0] -
EPSILON) &&
616 (out_point[0] <= minmax[1] +
EPSILON) &&
617 (out_point[1] >= minmax[2] -
EPSILON) &&
618 (out_point[1] <= minmax[3] +
EPSILON) &&
619 (out_point[2] >= minmax[4] -
EPSILON) &&
620 (out_point[2] <= minmax[5] +
EPSILON)) {
626 if ((mincomp >= 0) && (mincomp <= 2)) {
628 for (i = 0; i < 3; i++)
629 out_point[i] = in_point[i] + mint * ray_direction[i];
632 for (i = 0; i < 3; i++) out_point[i] = in_point[i];
634 for (i = 0; i < 3; i++) {
635 if (fabs(out_point[i] - minmax[i * 2]) <
EPSILON)
636 face_sect[i] = i * 2;
637 else if (fabs(out_point[i] - minmax[i * 2 + 1]) <
EPSILON)
638 face_sect[i] = i * 2 + 1;
641 return (intersection);
644 static void find_next_cell(
int ijkn[3],
int current_ijk[3],
int face_sect[3],
645 double vv[3],
int next_ijk[3])
652 for (j = 0; j < 3; j++) face1_sect[j] = face_sect[j];
653 for (j = 0; j < 3; j++) next_ijk[j] = current_ijk[j];
654 for (m = 0; m < 3; m++) {
655 if (face_sect[m] != -1) {
656 if (face_sect[m] == 0) {
658 next_ijk[0] = current_ijk[0] - 1;
660 if (next_ijk[0] < 0)
break;
662 }
else if (face_sect[m] == 1) {
664 next_ijk[0] = current_ijk[0] + 1;
666 if (next_ijk[0] > ijkn[0] - 1)
break;
668 }
else if (face_sect[m] == 2) {
670 next_ijk[1] = current_ijk[1] - 1;
672 if (next_ijk[1] < 0)
break;
674 }
else if (face_sect[m] == 3) {
676 next_ijk[1] = current_ijk[1] + 1;
678 if (next_ijk[1] > ijkn[1] - 1)
break;
680 }
else if (face_sect[m] == 4) {
682 next_ijk[2] = current_ijk[2] - 1;
684 if (next_ijk[2] < 0)
break;
686 }
else if (face_sect[m] == 5) {
688 next_ijk[2] = current_ijk[2] + 1;
690 if (next_ijk[2] > ijkn[2] - 1)
break;
696 for (m = 0; m < 3; m++) face_sect[m] = face1_sect[m];
701 static int find_next_point(
double orig_xyz[3],
double r_dxyz[3],
int r_level[3],
702 int current_ijk[3],
double in_point[3],
703 double out_point[3],
double ray_direction[3],
705 int flag, face_sect[3];
708 flag = find_out_point(orig_xyz, r_dxyz, current_ijk, in_point, ray_direction,
709 face_sect, out_point);
713 "ERROR: HEC-MW-VIS-E2007:There is some problem in finding intersection "
722 find_next_cell(r_level, current_ijk, face_sect, ray_direction, next_ijk);
723 if ((next_ijk[0] < 0) || (next_ijk[0] > r_level[0] - 1) ||
724 (next_ijk[1] < 0) || (next_ijk[1] > r_level[1] - 1) ||
725 (next_ijk[2] < 0) || (next_ijk[2] > r_level[2] - 1))
731 void ray_trace(
int remove_0_display_on,
int color_mapping_style,
732 double *interval_point,
int transfer_function_style,
733 double opa_value,
int num_of_features,
double *fea_point,
734 double view_point_d[3],
int interval_mapping_num,
735 int color_system_type,
int num_of_lights,
double *light_point,
736 double k_ads[3],
double orig_xyz[3],
double dxyz[3],
737 double r_dxyz[3],
int r_level[3],
int *empty_flag,
double *var,
738 double *grad_var,
double first_p[3],
int first_ijk[3],
739 double ray_direction[3],
double mincolor,
double maxcolor,
740 double accum_rgba[4],
double grad_minmax[2],
741 double feap_minmax[2],
double feai_minmax[2],
742 double dis_minmax[2],
double *opa_table,
double tav_length,
743 int time_step,
int test_i,
int test_j)
757 double in_point[3], out_point[3];
758 int flag, single_empty_flag, value_flag, index, current_ijk[3], next_ijk[3];
761 for (i = 0; i < 4; i++) accum_rgba[i] = 0.0;
763 for (i = 0; i < 3; i++) in_point[i] = first_p[i];
764 for (i = 0; i < 3; i++) current_ijk[i] = first_ijk[i];
765 while ((accum_rgba[3] < 0.99) && (flag == 1)) {
771 flag = find_next_point(orig_xyz, r_dxyz, r_level, current_ijk, in_point,
772 out_point, ray_direction, next_ijk);
774 single_empty_flag = 1;
783 for (i = 0; i < 8; i++) {
785 index = (current_ijk[2] + (int)(i / 4)) * (r_level[0] + 1) *
787 (current_ijk[1] + (
int)(j / 2)) * (r_level[0] + 1) +
788 current_ijk[0] + j % 2;
789 if (empty_flag[index] == 0) single_empty_flag = 0;
818 if ((single_empty_flag == 1) && (flag != 0) && (value_flag == 1))
820 transfer_function_style, opa_value, num_of_features,
821 fea_point, view_point_d, interval_mapping_num,
822 color_system_type, num_of_lights, light_point, k_ads,
823 r_level, orig_xyz, r_dxyz, var, grad_var, accum_rgba,
824 mincolor, maxcolor, grad_minmax, feap_minmax,
825 feai_minmax, dis_minmax, opa_table, in_point, out_point,
826 tav_length, time_step, print_flag);
828 for (i = 0; i < 3; i++) in_point[i] = out_point[i];
829 for (i = 0; i < 3; i++) current_ijk[i] = next_ijk[i];