FrontISTR 5.2.0
Large-scale structural analysis program with finit element method
Loading...
Searching...
No Matches
hecmw_vis_define_parameters.c
Go to the documentation of this file.
1/*****************************************************************************
2 * Copyright (c) 2019 FrontISTR Commons
3 * This software is released under the MIT License, see LICENSE.txt
4 *****************************************************************************/
5
7
8#include <math.h>
10
11#define EPSILON 0.00000001
12#define PI 3.1415926
13
14void transform_range_vertex(double range[6], double vertex[24]) {
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];
25 return;
26}
27
28static void normalize_f(double vector[3]) {
29 int i;
30 double norm_v;
31 norm_v = sqrt(vector[0] * vector[0] + vector[1] * vector[1] +
32 vector[2] * vector[2]);
33 if (fabs(norm_v) > EPSILON) {
34 for (i = 0; i < 3; i++) vector[i] /= norm_v;
35 }
36 return;
37}
38
39void get_frame_transform_matrix(double view_point_d[3], double screen_point[3],
40 double up[3], double coff_matrix[3][3]) {
41 double U[3], V[3], N[3];
42 int i;
43
44 for (i = 0; i < 3; i++) {
45 N[i] = -(view_point_d[i] - screen_point[i]);
46 }
47 normalize_f(N);
48 /* find the direction of axis U */
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];
52 normalize_f(U);
53 /*find the direction of axix V */
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];
57 normalize_f(V);
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];
62 }
63 return;
64}
65
66void find_inverse_matrix(double coff_matrix[3][3], double inv_matrix[3][3]) {
67 int i, j;
68 double a[3][3], norm_a, aa[3][3];
69
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, invers =0");
79
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;
91 return;
92}
93
94void transform_frame(double screen_point[3], double vertex[24],
95 double coff_matrix[3][3], double n_vertex[24]) {
96 int i, j;
97 double xx, yy, zz;
98
99 for (i = 0; i < 24; i++) n_vertex[i] = vertex[i];
100
101 for (i = 0; i < 8; i++)
102 for (j = 0; j < 3; j++) n_vertex[i * 3 + j] -= screen_point[j];
103
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];
114 }
115 return;
116}
117
118void transform_frame3(double screen_point[3], double f[3][3],
119 double coff_matrix[3][3], double n_f[3][3]) {
120 int i, j;
121 double xx, yy, zz;
122
123 for (i = 0; i < 3; i++)
124 for (j = 0; j < 3; j++) n_f[i][j] = f[i][j];
125
126 for (i = 0; i < 3; i++)
127 for (j = 0; j < 3; j++) n_f[i][j] -= screen_point[j];
128
129 for (i = 0; i < 3; i++) {
130 xx = n_f[i][0];
131 yy = n_f[i][1];
132 zz = n_f[i][2];
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];
139 }
140 return;
141}
142
143void transform2_frame(double coff_matrix[3][3], double view_point[3]) {
144 double xx, yy, zz;
145
146 xx = view_point[0];
147 yy = view_point[1];
148 zz = view_point[2];
149 view_point[0] =
150 xx * coff_matrix[0][0] + yy * coff_matrix[1][0] + zz * coff_matrix[2][0];
151 view_point[1] =
152 xx * coff_matrix[0][1] + yy * coff_matrix[1][1] + zz * coff_matrix[2][1];
153 view_point[2] =
154 xx * coff_matrix[0][2] + yy * coff_matrix[1][2] + zz * coff_matrix[2][2];
155
156 return;
157}
158
159void tranverse_transform(double screen_point[3], double point_s[3],
160 double inv_matrix[3][3], double point_o[3]) {
161 int i;
162 double xx, yy, zz;
163
164 xx = point_s[0];
165 yy = point_s[1];
166 zz = point_s[2];
167 point_o[0] =
168 xx * inv_matrix[0][0] + yy * inv_matrix[1][0] + zz * inv_matrix[2][0];
169 point_o[1] =
170 xx * inv_matrix[0][1] + yy * inv_matrix[1][1] + zz * inv_matrix[2][1];
171 point_o[2] =
172 xx * inv_matrix[0][2] + yy * inv_matrix[1][2] + zz * inv_matrix[2][2];
173
174 /* transform (x0, y0, z0)*/
175 for (i = 0; i < 3; i++) point_o[i] += screen_point[i];
176 return;
177}
178/*
179void output_frame(Parameter_rendering *vr, double view_point[3], double
180n_vertex[24], double scr_area[4],
181 double xd, double yd)
182{
183
184 int i, pp[8][2];
185 int start_x, start_y;
186 double p[8][2];
187 FILE *f1;
188
189 f1=fopen("frame.dat", "w");
190 if(f1==NULL) {
191 fprintf(stderr, "cannot open the frame output file\n");
192 exit(0);
193 }
194 for(i=0;i<8;i++) {
195 if(fabs(n_vertex[i*3+2]-view_point[2])<EPSILON) {
196 fprintf(stderr, " The viewpoint position is not
197correct\n");
198 exit(0);
199 }
200 p[i][0]=view_point[0]-view_point[2]/(n_vertex[i*3+2]-view_point[2])*
201 (n_vertex[i*3]-view_point[0]);
202 p[i][1]=view_point[1]-view_point[2]/(n_vertex[i*3+2]-view_point[2])*
203 (n_vertex[i*3+1]-view_point[1]);
204 }
205 if((vr->color_mapping_bar_on==0) && (vr->scale_marking_on==0)) {
206 start_x=10; start_y=10;
207 }
208 else if((vr->color_mapping_bar_on==1) && (vr->scale_marking_on==0)) {
209 start_x=30; start_y=10;
210 }
211 else if((vr->color_mapping_bar_on==1) && (vr->scale_marking_on==1)) {
212 start_x=45; start_y=10;
213 }
214 for(i=0;i<8;i++) {
215 pp[i][0]=(int)((p[i][0]-scr_area[0])/xd)+start_x;
216 pp[i][1]=(int)((p[i][1]-scr_area[2])/yd)+start_y;
217 fprintf(f1, "%d %d\n", pp[i][0], pp[i][1]);
218 }
219 fclose(f1);
220 return;
221}
222
223 */
224void transform_frame4(double screen_point[3], double iso_p[6],
225 double coff_matrix[3][3], double n_iso[6]) {
226 int i, j;
227 double xx, yy, zz;
228
229 for (i = 0; i < 6; i++) n_iso[i] = iso_p[i];
230
231 for (i = 0; i < 2; i++)
232 for (j = 0; j < 3; j++) n_iso[i * 3 + j] -= screen_point[j];
233
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];
244 }
245 return;
246}
247
248void find_projection_range3(double view_point[3], double n_iso[6],
249 double pixel_d[2][2], double iso_p[6]) {
250 int i;
251 double tmp_d;
252
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]);
263 }
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;
269 }
270 for (i = 0; i < 3; i++) {
271 tmp_d = n_iso[3 + i];
272 n_iso[3 + i] = n_iso[i];
273 n_iso[i] = tmp_d;
274 }
275 for (i = 0; i < 3; i++) {
276 tmp_d = iso_p[3 + i];
277 iso_p[3 + i] = iso_p[i];
278 iso_p[i] = tmp_d;
279 }
280 }
281
282 return;
283}
284
285void find_projection_range2(double view_point[3], double n_f[3][3],
286 double scr_area[4]) {
287 int i;
288 double p[3][2];
289
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]);
300 }
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];
308 }
309 return;
310}
311
312void find_projection_range(double view_point[3], double n_vertex[24],
313 double scr_area[4]) {
314 int i;
315 double p[8][2];
316
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]);
327 }
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];
335 }
336 return;
337}
338
339void view_parameter_define(int ii, int num_of_frames, int rotate_style,
340 double view_point_d[3], double screen_point[3],
341 double up[3], int num_of_lights, double *light_point,
342 double trange[6]) {
343 int i, j;
344 double center[3], t[3], angle, tminx, tmaxx, tminy, tmaxy, tminz, tmaxz;
345
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) { /*rotate 30 along x axis */
350 /* rotate viewpoint */
351 up[0] = 1.0;
352 up[1] = 0.0;
353 up[2] = 0.0;
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];
359 /* rotate screen_point if it is not in center */
360 /* if((fabs(screen_point[1]-center[1])>EPSILON) ||
361 (fabs(screen_point[2]-center[2])>EPSILON)) {
362 for(i=0;i<3;i++)
363 t[i]=screen_point[i]-center[i];
364 screen_point[0]=t[0];
365 screen_point[1]=t[1]*cos(angle)+t[2]*sin(angle);
366 screen_point[2]=-t[1]*sin(angle)+t[2]*cos(angle);
367 for(i=0;i<3;i++)
368 screen_point[i]+=center[i];
369 }
370 */
371 /* rotate light_position */
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];
378 }
379 /* rotate up_direction */
380 for (i = 0; i < 3; i++) t[i] = up[i];
381 up[0] = t[0];
382 up[1] = t[1] * cos(angle) + t[2] * sin(angle);
383 up[2] = -t[1] * sin(angle) + t[2] * cos(angle);
384 }
385 if (rotate_style == 2) { /*rotate 30 along y axis */
386 /* rotate viewpoint */
387 up[0] = 0.0;
388 up[1] = 1.0;
389 up[2] = 0.0;
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];
395 /* rotate screen_point if it is not in center */
396 /* if((fabs(screen_point[0]-center[0])>EPSILON) ||
397 (fabs(screen_point[2]-center[2])>EPSILON)) {
398 for(i=0;i<3;i++)
399 t[i]=screen_point[i]-center[i];
400 screen_point[0]=t[0]*cos(angle)+t[2]*sin(angle);
401 screen_point[1]=t[1];
402 screen_point[2]=-t[0]*sin(angle)+t[2]*cos(angle);
403 for(i=0;i<3;i++)
404 screen_point[i]+=center[i];
405 }
406 */
407 /* rotate light_position */
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];
414 }
415 /* rotate up direction */
416 for (i = 0; i < 3; i++) t[i] = up[i];
417 up[0] = t[0] * cos(angle) + t[2] * sin(angle);
418 up[1] = t[1];
419 up[2] = -t[0] * sin(angle) + t[2] * cos(angle);
420 }
421 if (rotate_style == 3) { /*rotate 30 along z axis */
422 /* rotate viewpoint */
423 /* up[0]=0.0;
424 up[1]=0.0;
425 up[2]=1.0;
426 */
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];
432 /* rotate screen_point if it is not in center */
433 /* if((fabs(screen_point[0]-center[0])>EPSILON) ||
434(fabs(screen_point[1]-center[1])>EPSILON)) {
435 for(i=0;i<3;i++)
436 t[i]=screen_point[i]-center[i];
437screen_point[0]=t[0]*cos(angle)+t[1]*sin(angle);
438 screen_point[1]=-t[0]*sin(angle)+t[1]*cos(angle);
439 screen_point[2]=t[2];
440 for(i=0;i<3;i++)
441 screen_point[i]+=center[i];
442 }
443 */
444 /* rotate light_position */
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];
451 }
452 /* rotate up direction */
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);
456 up[2] = t[2];
457 }
458 if (rotate_style == 4) {
459 if (ii > 0) {
460 tminx = trange[0];
461 tmaxx = trange[1];
462 tminy = trange[2];
463 tmaxy = trange[3];
464 tminz = trange[4];
465 tmaxz = trange[5];
466 for (i = 0; i < 3; i++) screen_point[i] = center[i];
467 num_of_lights = 1;
468 if (ii == 1) {
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;
475 up[0] = 0.0;
476 up[1] = 0.0;
477 up[2] = 1.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;
485 up[0] = 0.0;
486 up[1] = 0.0;
487 up[2] = 1.0;
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;
495 up[0] = 0.0;
496 up[1] = 0.0;
497 up[2] = 1.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;
505 up[0] = 0.0;
506 up[1] = -1.0;
507 up[2] = 0.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;
515 up[0] = 0.0;
516 up[1] = 0.0;
517 up[2] = 1.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;
525 up[0] = 0.0;
526 up[1] = 0.0;
527 up[2] = 1.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;
535 up[0] = 0.0;
536 up[1] = 0.0;
537 up[2] = 1.0;
538 }
539 }
540 }
541 }
542 return;
543}
544
545void view1_parameter_define(int ii, int num_of_frames, int rotate_style,
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])
549
550{
551 int i;
552 double center[3], t[3], angle, tminx, tmaxx, tminy, tmaxy, tminz, tmaxz;
553
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) { /*rotate 30 along x axis */
558 /* rotate viewpoint */
559 up[0] = 1.0;
560 up[1] = 0.0;
561 up[2] = 0.0;
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];
567 /* rotate screen_point if it is not in center */
568 /* if((fabs(screen_point[1]-center[1])>EPSILON) ||
569 (fabs(screen_point[2]-center[2])>EPSILON)) {
570 for(i=0;i<3;i++)
571 t[i]=screen_point[i]-center[i];
572 screen_point[0]=t[0];
573 screen_point[1]=t[1]*cos(angle)+t[2]*sin(angle);
574 screen_point[2]=-t[1]*sin(angle)+t[2]*cos(angle);
575 for(i=0;i<3;i++)
576 screen_point[i]+=center[i];
577 }
578 */
579 /* rotate light_position */
580 /* for(j=0;j<num_of_lights;j++) {
581 for(i=0;i<3;i++)
582 t[i]=light_point[j*3+i]-center[i];
583 light_point[j*3+0]=t[0];
584 light_point[j*3+1]=t[1]*cos(angle)+t[2]*sin(angle);
585 light_point[j*3+2]=-t[1]*sin(angle)+t[2]*cos(angle);
586 for(i=0;i<3;i++)
587 light_point[j*3+i]+=center[i];
588 }
589 */
590 }
591 if (rotate_style == 2) { /*rotate 30 along y axis */
592 /* rotate viewpoint */
593 up[0] = 0.0;
594 up[1] = 1.0;
595 up[2] = 0.0;
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];
601 /* rotate screen_point if it is not in center */
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];
609 }
610 /* rotate light_position */
611 /* for(j=0;j<num_of_lights;j++) {
612 for(i=0;i<3;i++)
613 t[i]=light_point[j*3+i]-center[i];
614 light_point[j*3+0]=t[0]*cos(angle)+t[2]*sin(angle);
615 light_point[j*3+1]=t[1];
616 light_point[j*3+2]=-t[0]*sin(angle)+t[2]*cos(angle);
617 for(i=0;i<3;i++)
618 light_point[j*3+i]+=center[i];
619 }
620 */
621 }
622 if (rotate_style == 3) { /*rotate 30 along z axis */
623 /* up[0]=0.0;
624 up[1]=0.0;
625 up[2]=1.0;
626 */
627 /* rotate viewpoint */
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];
633 /* rotate screen_point if it is not in center */
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];
641 }
642 /* rotate light_position */
643 /* for(j=0;j<num_of_lights;j++) {
644 for(i=0;i<3;i++)
645 t[i]=light_point[j*3+i]-center[i];
646 light_point[j*3+0]=t[0]*cos(angle)+t[1]*sin(angle);
647 light_point[j*3+1]=-t[0]*sin(angle)+t[1]*cos(angle);
648 light_point[j*3+2]=t[2];
649 for(i=0;i<3;i++)
650 light_point[j*3+i]+=center[i];
651 }
652 */
653 }
654 if (rotate_style == 4) {
655 if (ii > 0) {
656 tminx = trange[0];
657 tmaxx = trange[1];
658 tminy = trange[2];
659 tmaxy = trange[3];
660 tminz = trange[4];
661 tmaxz = trange[5];
662 if (ii == 1) {
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);
666 up[0] = 0.0;
667 up[1] = 0.0;
668 up[2] = 1.0;
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;
673 up[0] = 0.0;
674 up[1] = 0.0;
675 up[2] = 1.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);
680 up[0] = 0.0;
681 up[1] = 0.0;
682 up[2] = 1.0;
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);
687 up[0] = 0.0;
688 up[1] = -1.0;
689 up[2] = 0.0;
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);
694 up[0] = 0.0;
695 up[1] = 0.0;
696 up[2] = 1.0;
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);
701 up[0] = 0.0;
702 up[1] = 0.0;
703 up[2] = 1.0;
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);
708 up[0] = 0.0;
709 up[1] = 0.0;
710 up[2] = 1.0;
711 }
712 }
713 }
714 }
715 return;
716}
#define EPSILON
void find_projection_range(double view_point[3], double n_vertex[24], double scr_area[4])
void view1_parameter_define(int ii, int num_of_frames, int rotate_style, double view_point_d[3], double screen_point[3], int num_of_lights, double *light_point, double up[3], double trange[6])
void transform_frame4(double screen_point[3], double iso_p[6], double coff_matrix[3][3], double n_iso[6])
void find_projection_range3(double view_point[3], double n_iso[6], double pixel_d[2][2], double iso_p[6])
void tranverse_transform(double screen_point[3], double point_s[3], double inv_matrix[3][3], double point_o[3])
void find_inverse_matrix(double coff_matrix[3][3], double inv_matrix[3][3])
void get_frame_transform_matrix(double view_point_d[3], double screen_point[3], double up[3], double coff_matrix[3][3])
void view_parameter_define(int ii, int num_of_frames, int rotate_style, double view_point_d[3], double screen_point[3], double up[3], int num_of_lights, double *light_point, double trange[6])
void transform2_frame(double coff_matrix[3][3], double view_point[3])
void find_projection_range2(double view_point[3], double n_f[3][3], double scr_area[4])
void transform_range_vertex(double range[6], double vertex[24])
void transform_frame(double screen_point[3], double vertex[24], double coff_matrix[3][3], double n_vertex[24])
void transform_frame3(double screen_point[3], double f[3][3], double coff_matrix[3][3], double n_f[3][3])
void HECMW_vis_print_exit(char *var)