11 #define EPSILON 0.00000001
15 vertex[0 * 3] = vertex[4 * 3] = vertex[7 * 3] = vertex[3 * 3] = range[0];
16 vertex[1 * 3] = vertex[5 * 3] = vertex[6 * 3] = vertex[2 * 3] = range[1];
17 vertex[0 * 3 + 1] = vertex[1 * 3 + 1] = vertex[5 * 3 + 1] =
18 vertex[4 * 3 + 1] = range[2];
19 vertex[3 * 3 + 1] = vertex[2 * 3 + 1] = vertex[6 * 3 + 1] =
20 vertex[7 * 3 + 1] = range[3];
21 vertex[0 * 3 + 2] = vertex[1 * 3 + 2] = vertex[2 * 3 + 2] =
22 vertex[3 * 3 + 2] = range[4];
23 vertex[4 * 3 + 2] = vertex[5 * 3 + 2] = vertex[6 * 3 + 2] =
24 vertex[7 * 3 + 2] = range[5];
28 static void normalize_f(
double vector[3]) {
31 norm_v = sqrt(vector[0] * vector[0] + vector[1] * vector[1] +
32 vector[2] * vector[2]);
34 for (i = 0; i < 3; i++) vector[i] /= norm_v;
40 double up[3],
double coff_matrix[3][3]) {
41 double U[3], V[3], N[3];
44 for (i = 0; i < 3; i++) {
45 N[i] = -(view_point_d[i] - screen_point[i]);
49 U[0] = up[1] * N[2] - N[1] * up[2];
50 U[1] = -up[0] * N[2] + N[0] * up[2];
51 U[2] = up[0] * N[1] - N[0] * up[1];
54 V[0] = N[1] * U[2] - U[1] * N[2];
55 V[1] = -N[0] * U[2] + U[0] * N[2];
56 V[2] = N[0] * U[1] - U[0] * N[1];
58 for (i = 0; i < 3; i++) {
59 coff_matrix[i][0] = U[i];
60 coff_matrix[i][1] = V[i];
61 coff_matrix[i][2] = N[i];
68 double a[3][3], norm_a, aa[3][3];
70 for (i = 0; i < 3; i++)
71 for (j = 0; j < 3; j++) a[i][j] = coff_matrix[i][j];
72 norm_a = a[0][0] * a[1][1] * a[2][2] + a[0][1] * a[1][2] * a[2][0] +
73 a[0][2] * a[1][0] * a[2][1] - a[0][2] * a[1][1] * a[2][0] -
74 a[0][1] * a[1][0] * a[2][2] - a[0][0] * a[1][2] * a[2][1];
75 if (fabs(norm_a) < 1.0E-7)
77 "ERROR: HEC-MW-VIS-E2001: There is something wrong with transform "
78 "matrix, inverse = 0");
80 aa[0][0] = a[1][1] * a[2][2] - a[1][2] * a[2][1];
81 aa[0][1] = -(a[0][1] * a[2][2] - a[2][1] * a[0][2]);
82 aa[0][2] = a[0][1] * a[1][2] - a[1][1] * a[0][2];
83 aa[1][0] = -(a[1][0] * a[2][2] - a[2][0] * a[1][2]);
84 aa[1][1] = a[0][0] * a[2][2] - a[2][0] * a[0][2];
85 aa[1][2] = -(a[0][0] * a[1][2] - a[1][0] * a[0][2]);
86 aa[2][0] = a[1][0] * a[2][1] - a[2][0] * a[1][1];
87 aa[2][1] = -(a[0][0] * a[2][1] - a[2][0] * a[0][1]);
88 aa[2][2] = a[0][0] * a[1][1] - a[1][0] * a[0][1];
89 for (i = 0; i < 3; i++)
90 for (j = 0; j < 3; j++) inv_matrix[i][j] = aa[i][j] / norm_a;
95 double coff_matrix[3][3],
double n_vertex[24]) {
99 for (i = 0; i < 24; i++) n_vertex[i] = vertex[i];
101 for (i = 0; i < 8; i++)
102 for (j = 0; j < 3; j++) n_vertex[i * 3 + j] -= screen_point[j];
104 for (i = 0; i < 8; i++) {
105 xx = n_vertex[i * 3];
106 yy = n_vertex[i * 3 + 1];
107 zz = n_vertex[i * 3 + 2];
108 n_vertex[i * 3] = xx * coff_matrix[0][0] + yy * coff_matrix[1][0] +
109 zz * coff_matrix[2][0];
110 n_vertex[i * 3 + 1] = xx * coff_matrix[0][1] + yy * coff_matrix[1][1] +
111 zz * coff_matrix[2][1];
112 n_vertex[i * 3 + 2] = xx * coff_matrix[0][2] + yy * coff_matrix[1][2] +
113 zz * coff_matrix[2][2];
119 double coff_matrix[3][3],
double n_f[3][3]) {
123 for (i = 0; i < 3; i++)
124 for (j = 0; j < 3; j++) n_f[i][j] = f[i][j];
126 for (i = 0; i < 3; i++)
127 for (j = 0; j < 3; j++) n_f[i][j] -= screen_point[j];
129 for (i = 0; i < 3; i++) {
133 n_f[i][0] = xx * coff_matrix[0][0] + yy * coff_matrix[1][0] +
134 zz * coff_matrix[2][0];
135 n_f[i][1] = xx * coff_matrix[0][1] + yy * coff_matrix[1][1] +
136 zz * coff_matrix[2][1];
137 n_f[i][2] = xx * coff_matrix[0][2] + yy * coff_matrix[1][2] +
138 zz * coff_matrix[2][2];
150 xx * coff_matrix[0][0] + yy * coff_matrix[1][0] + zz * coff_matrix[2][0];
152 xx * coff_matrix[0][1] + yy * coff_matrix[1][1] + zz * coff_matrix[2][1];
154 xx * coff_matrix[0][2] + yy * coff_matrix[1][2] + zz * coff_matrix[2][2];
160 double inv_matrix[3][3],
double point_o[3]) {
168 xx * inv_matrix[0][0] + yy * inv_matrix[1][0] + zz * inv_matrix[2][0];
170 xx * inv_matrix[0][1] + yy * inv_matrix[1][1] + zz * inv_matrix[2][1];
172 xx * inv_matrix[0][2] + yy * inv_matrix[1][2] + zz * inv_matrix[2][2];
175 for (i = 0; i < 3; i++) point_o[i] += screen_point[i];
225 double coff_matrix[3][3],
double n_iso[6]) {
229 for (i = 0; i < 6; i++) n_iso[i] = iso_p[i];
231 for (i = 0; i < 2; i++)
232 for (j = 0; j < 3; j++) n_iso[i * 3 + j] -= screen_point[j];
234 for (i = 0; i < 2; i++) {
235 xx = n_iso[i * 3 + 0];
236 yy = n_iso[i * 3 + 1];
237 zz = n_iso[i * 3 + 2];
238 n_iso[i * 3 + 0] = xx * coff_matrix[0][0] + yy * coff_matrix[1][0] +
239 zz * coff_matrix[2][0];
240 n_iso[i * 3 + 1] = xx * coff_matrix[0][1] + yy * coff_matrix[1][1] +
241 zz * coff_matrix[2][1];
242 n_iso[i * 3 + 2] = xx * coff_matrix[0][2] + yy * coff_matrix[1][2] +
243 zz * coff_matrix[2][2];
249 double pixel_d[2][2],
double iso_p[6]) {
253 for (i = 0; i < 2; i++) {
254 if (fabs(n_iso[i * 3 + 2] - view_point[2]) <
EPSILON)
256 "ERROR: HEC-MW-VIS-E2002: The viewpoint position is not correct");
257 pixel_d[i][0] = view_point[0] -
258 view_point[2] / (n_iso[i * 3 + 2] - view_point[2]) *
259 (n_iso[i * 3 + 0] - view_point[0]);
260 pixel_d[i][1] = view_point[1] -
261 view_point[2] / (n_iso[i * 3 + 2] - view_point[2]) *
262 (n_iso[i * 3 + 1] - view_point[1]);
264 if (pixel_d[0][0] > pixel_d[1][0]) {
265 for (i = 0; i < 2; i++) {
266 tmp_d = pixel_d[1][i];
267 pixel_d[1][i] = pixel_d[0][i];
268 pixel_d[0][i] = tmp_d;
270 for (i = 0; i < 3; i++) {
271 tmp_d = n_iso[3 + i];
272 n_iso[3 + i] = n_iso[i];
275 for (i = 0; i < 3; i++) {
276 tmp_d = iso_p[3 + i];
277 iso_p[3 + i] = iso_p[i];
286 double scr_area[4]) {
290 for (i = 0; i < 3; i++) {
291 if (fabs(n_f[i][2] - view_point[2]) <
EPSILON)
293 "ERROR: HEC-MW-VIS-E2002: The viewpoint position is not correct");
294 p[i][0] = view_point[0] -
295 view_point[2] / (n_f[i][2] - view_point[2]) *
296 (n_f[i][0] - view_point[0]);
297 p[i][1] = view_point[1] -
298 view_point[2] / (n_f[i][2] - view_point[2]) *
299 (n_f[i][1] - view_point[1]);
301 scr_area[0] = scr_area[1] = p[0][0];
302 scr_area[2] = scr_area[3] = p[0][1];
303 for (i = 0; i < 3; i++) {
304 if (p[i][0] < scr_area[0]) scr_area[0] = p[i][0];
305 if (p[i][0] > scr_area[1]) scr_area[1] = p[i][0];
306 if (p[i][1] < scr_area[2]) scr_area[2] = p[i][1];
307 if (p[i][1] > scr_area[3]) scr_area[3] = p[i][1];
313 double scr_area[4]) {
317 for (i = 0; i < 8; i++) {
318 if (fabs(n_vertex[i * 3 + 2] - view_point[2]) <
EPSILON)
320 "ERROR: HEC-MW-VIS-E2002: The viewpoint position is not correct");
321 p[i][0] = view_point[0] -
322 view_point[2] / (n_vertex[i * 3 + 2] - view_point[2]) *
323 (n_vertex[i * 3] - view_point[0]);
324 p[i][1] = view_point[1] -
325 view_point[2] / (n_vertex[i * 3 + 2] - view_point[2]) *
326 (n_vertex[i * 3 + 1] - view_point[1]);
328 scr_area[0] = scr_area[1] = p[0][0];
329 scr_area[2] = scr_area[3] = p[0][1];
330 for (i = 0; i < 8; i++) {
331 if (p[i][0] < scr_area[0]) scr_area[0] = p[i][0];
332 if (p[i][0] > scr_area[1]) scr_area[1] = p[i][0];
333 if (p[i][1] < scr_area[2]) scr_area[2] = p[i][1];
334 if (p[i][1] > scr_area[3]) scr_area[3] = p[i][1];
340 double view_point_d[3],
double screen_point[3],
341 double up[3],
int num_of_lights,
double *light_point,
344 double center[3], t[3], angle, tminx, tmaxx, tminy, tmaxy, tminz, tmaxz;
346 for (i = 0; i < 3; i++) center[i] = (trange[i * 2] + trange[i * 2 + 1]) / 2.0;
347 angle = 2.0 *
PI / (double)num_of_frames;
348 if (rotate_style != 0) {
349 if (rotate_style == 1) {
354 for (i = 0; i < 3; i++) t[i] = view_point_d[i] - center[i];
355 view_point_d[0] = t[0];
356 view_point_d[1] = t[1] * cos(angle) + t[2] * sin(angle);
357 view_point_d[2] = -t[1] * sin(angle) + t[2] * cos(angle);
358 for (i = 0; i < 3; i++) view_point_d[i] += center[i];
372 for (j = 0; j < num_of_lights; j++) {
373 for (i = 0; i < 3; i++) t[i] = light_point[j * 3 + i] - center[i];
374 light_point[j * 3 + 0] = t[0];
375 light_point[j * 3 + 1] = t[1] * cos(angle) + t[2] * sin(angle);
376 light_point[j * 3 + 2] = -t[1] * sin(angle) + t[2] * cos(angle);
377 for (i = 0; i < 3; i++) light_point[j * 3 + i] += center[i];
380 for (i = 0; i < 3; i++) t[i] = up[i];
382 up[1] = t[1] * cos(angle) + t[2] * sin(angle);
383 up[2] = -t[1] * sin(angle) + t[2] * cos(angle);
385 if (rotate_style == 2) {
390 for (i = 0; i < 3; i++) t[i] = view_point_d[i] - center[i];
391 view_point_d[0] = t[0] * cos(angle) + t[2] * sin(angle);
392 view_point_d[1] = t[1];
393 view_point_d[2] = -t[0] * sin(angle) + t[2] * cos(angle);
394 for (i = 0; i < 3; i++) view_point_d[i] += center[i];
408 for (j = 0; j < num_of_lights; j++) {
409 for (i = 0; i < 3; i++) t[i] = light_point[j * 3 + i] - center[i];
410 light_point[j * 3 + 0] = t[0] * cos(angle) + t[2] * sin(angle);
411 light_point[j * 3 + 1] = t[1];
412 light_point[j * 3 + 2] = -t[0] * sin(angle) + t[2] * cos(angle);
413 for (i = 0; i < 3; i++) light_point[j * 3 + i] += center[i];
416 for (i = 0; i < 3; i++) t[i] = up[i];
417 up[0] = t[0] * cos(angle) + t[2] * sin(angle);
419 up[2] = -t[0] * sin(angle) + t[2] * cos(angle);
421 if (rotate_style == 3) {
427 for (i = 0; i < 3; i++) t[i] = view_point_d[i] - center[i];
428 view_point_d[0] = t[0] * cos(angle) + t[1] * sin(angle);
429 view_point_d[1] = -t[0] * sin(angle) + t[1] * cos(angle);
430 view_point_d[2] = t[2];
431 for (i = 0; i < 3; i++) view_point_d[i] += center[i];
445 for (j = 0; j < num_of_lights; j++) {
446 for (i = 0; i < 3; i++) t[i] = light_point[j * 3 + i] - center[i];
447 light_point[j * 3 + 0] = t[0] * cos(angle) + t[1] * sin(angle);
448 light_point[j * 3 + 1] = -t[0] * sin(angle) + t[1] * cos(angle);
449 light_point[j * 3 + 2] = t[2];
450 for (i = 0; i < 3; i++) light_point[j * 3 + i] += center[i];
453 for (i = 0; i < 3; i++) t[i] = up[i];
454 up[0] = t[0] * cos(angle) + t[1] * sin(angle);
455 up[1] = -t[0] * sin(angle) + t[1] * cos(angle);
458 if (rotate_style == 4) {
466 for (i = 0; i < 3; i++) screen_point[i] = center[i];
469 view_point_d[0] = (tminx + tmaxx) / 2.0;
470 view_point_d[1] = tmaxy + 1.5 * (tmaxy - tminy);
471 view_point_d[2] = tmaxz + 1.5 * (tmaxz - tminz);
472 light_point[0] = (tminx + tmaxx) / 2.0;
473 light_point[1] = tmaxy + 0.1 * (tmaxy - tminy);
474 light_point[2] = tmaxz + (tmaxz - tminz) * 2.0;
478 }
else if (ii == 2) {
479 view_point_d[0] = (tminx + tmaxx) / 2.0;
480 view_point_d[1] = tmaxy + 1.5 * (tmaxy - tminy);
481 view_point_d[2] = (tmaxz + tminz) / 2.0;
482 light_point[0] = (tminx + tmaxx) / 2.0;
483 light_point[1] = tmaxy + 0.1 * (tmaxy - tminy);
484 light_point[2] = tmaxz + (tmaxz - tminz) * 0.5;
488 }
else if (ii == 3) {
489 view_point_d[0] = (tminx + tmaxx) / 2.0;
490 view_point_d[1] = tmaxy + 1.5 * (tmaxy - tminy);
491 view_point_d[2] = tminz - 1.5 * (tmaxz - tminz);
492 light_point[0] = (tminx + tmaxx) / 2.0;
493 light_point[1] = tmaxy + 0.1 * (tmaxy - tminy);
494 light_point[2] = tminz - (tmaxz - tminz) * 2.0;
498 }
else if (ii == 4) {
499 view_point_d[0] = (tminx + tmaxx) / 2.0;
500 view_point_d[1] = 0.5 * (tmaxy + tminy);
501 view_point_d[2] = tmaxz + 1.5 * (tmaxz - tminz);
502 light_point[0] = (tminx + tmaxx) / 2.0;
503 light_point[1] = 0.7 * (tmaxy + tminy);
504 light_point[2] = tmaxz + (tmaxz - tminz) * 2.0;
508 }
else if (ii == 5) {
509 view_point_d[0] = tmaxx + 1.5 * (tmaxx - tminx);
510 view_point_d[1] = 0.5 * (tmaxy + tminy);
511 view_point_d[2] = tmaxz + 1.5 * (tmaxz - tminz);
512 light_point[0] = tmaxx + 0.5 * (tmaxx - tminx);
513 light_point[1] = 0.5 * (tmaxy + tminy);
514 light_point[2] = tmaxz + (tmaxz - tminz) * 2.0;
518 }
else if (ii == 6) {
519 view_point_d[0] = tminx - 1.5 * (tmaxx - tminx);
520 view_point_d[1] = 0.5 * (tmaxy + tminy);
521 view_point_d[2] = tmaxz + 1.5 * (tmaxz - tminz);
522 light_point[0] = tminx - 0.5 * (tmaxx - tminx);
523 light_point[1] = 0.5 * (tmaxy + tminy);
524 light_point[2] = tmaxz + (tmaxz - tminz) * 2.0;
528 }
else if (ii == 7) {
529 view_point_d[0] = (tmaxx + tminx) / 2.0;
530 view_point_d[1] = tminy - 1.5 * (tmaxy - tminy);
531 view_point_d[2] = tmaxz + 1.5 * (tmaxz - tminz);
532 light_point[0] = (tmaxx + tminx) / 2.0;
533 light_point[1] = tminy - 0.5 * (tmaxy - tminy);
534 light_point[2] = tmaxz + (tmaxz - tminz) * 2.0;
546 double view_point_d[3],
double screen_point[3],
547 int num_of_lights,
double *light_point,
548 double up[3],
double trange[6])
552 double center[3], t[3], angle, tminx, tmaxx, tminy, tmaxy, tminz, tmaxz;
554 for (i = 0; i < 3; i++) center[i] = (trange[i * 2] + trange[i * 2 + 1]) / 2.0;
555 angle = 2.0 *
PI / (double)num_of_frames;
556 if (rotate_style != 0) {
557 if (rotate_style == 1) {
562 for (i = 0; i < 3; i++) t[i] = view_point_d[i] - center[i];
563 view_point_d[0] = t[0];
564 view_point_d[1] = t[1] * cos(angle) + t[2] * sin(angle);
565 view_point_d[2] = -t[1] * sin(angle) + t[2] * cos(angle);
566 for (i = 0; i < 3; i++) view_point_d[i] += center[i];
591 if (rotate_style == 2) {
596 for (i = 0; i < 3; i++) t[i] = view_point_d[i] - center[i];
597 view_point_d[0] = t[0] * cos(angle) + t[2] * sin(angle);
598 view_point_d[1] = t[1];
599 view_point_d[2] = -t[0] * sin(angle) + t[2] * cos(angle);
600 for (i = 0; i < 3; i++) view_point_d[i] += center[i];
602 if ((fabs(screen_point[0] - center[0]) >
EPSILON) ||
603 (fabs(screen_point[2] - center[2]) >
EPSILON)) {
604 for (i = 0; i < 3; i++) t[i] = screen_point[i] - center[i];
605 screen_point[0] = t[0] * cos(angle) + t[2] * sin(angle);
606 screen_point[1] = t[1];
607 screen_point[2] = -t[0] * sin(angle) + t[2] * cos(angle);
608 for (i = 0; i < 3; i++) screen_point[i] += center[i];
622 if (rotate_style == 3) {
628 for (i = 0; i < 3; i++) t[i] = view_point_d[i] - center[i];
629 view_point_d[0] = t[0] * cos(angle) + t[1] * sin(angle);
630 view_point_d[1] = -t[0] * sin(angle) + t[1] * cos(angle);
631 view_point_d[2] = t[2];
632 for (i = 0; i < 3; i++) view_point_d[i] += center[i];
634 if ((fabs(screen_point[0] - center[0]) >
EPSILON) ||
635 (fabs(screen_point[1] - center[1]) >
EPSILON)) {
636 for (i = 0; i < 3; i++) t[i] = screen_point[i] - center[i];
637 screen_point[0] = t[0] * cos(angle) + t[1] * sin(angle);
638 screen_point[1] = -t[0] * sin(angle) + t[1] * cos(angle);
639 screen_point[2] = t[2];
640 for (i = 0; i < 3; i++) screen_point[i] += center[i];
654 if (rotate_style == 4) {
663 view_point_d[0] = (tminx + tmaxx) / 2.0;
664 view_point_d[1] = tmaxy + 1.5 * (tmaxy - tminy);
665 view_point_d[2] = tmaxz + 1.5 * (tmaxz - tminz);
669 }
else if (ii == 2) {
670 view_point_d[0] = (tminx + tmaxx) / 2.0;
671 view_point_d[1] = tmaxy + 1.5 * (tmaxy - tminy);
672 view_point_d[2] = (tmaxz + tminz) / 2.0;
676 }
else if (ii == 3) {
677 view_point_d[0] = (tminx + tmaxx) / 2.0;
678 view_point_d[1] = tmaxy + 1.5 * (tmaxy - tminy);
679 view_point_d[2] = tminz - 1.5 * (tmaxz - tminz);
683 }
else if (ii == 4) {
684 view_point_d[0] = (tminx + tmaxx) / 2.0;
685 view_point_d[1] = 0.5 * (tmaxy + tminy);
686 view_point_d[2] = tmaxz + 1.5 * (tmaxz - tminz);
690 }
else if (ii == 5) {
691 view_point_d[0] = tmaxx + 1.5 * (tmaxx - tminx);
692 view_point_d[1] = 0.5 * (tmaxy + tminy);
693 view_point_d[2] = tmaxz + 1.5 * (tmaxz - tminz);
697 }
else if (ii == 6) {
698 view_point_d[0] = tminx - 1.5 * (tmaxx - tminx);
699 view_point_d[1] = 0.5 * (tmaxy + tminy);
700 view_point_d[2] = tmaxz + 1.5 * (tmaxz - tminz);
704 }
else if (ii == 7) {
705 view_point_d[0] = (tmaxx + tminx) / 2.0;
706 view_point_d[1] = tminy - 1.5 * (tmaxy - tminy);
707 view_point_d[2] = tmaxz + 1.5 * (tmaxz - tminz);