FrontISTR  5.7.0
Large-scale structural analysis program with finit element method
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>
9 #include "hecmw_vis_mem_util.h"
10 
11 #define EPSILON 0.00000001
12 #define PI 3.1415926
13 
14 void 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 
28 static 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 
39 void 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 axis 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 
66 void 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, inverse = 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 
94 void 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 
118 void 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 
143 void 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 
159 void 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 /*
179 void output_frame(Parameter_rendering *vr, double view_point[3], double
180 n_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
197 correct\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  */
224 void 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 
248 void 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 
285 void 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 
312 void 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 
339 void 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];
437 screen_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 
545 void 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 }
tranverse_transform
void tranverse_transform(double screen_point[3], double point_s[3], double inv_matrix[3][3], double point_o[3])
Definition: hecmw_vis_define_parameters.c:159
find_projection_range
void find_projection_range(double view_point[3], double n_vertex[24], double scr_area[4])
Definition: hecmw_vis_define_parameters.c:312
hecmw_vis_mem_util.h
view1_parameter_define
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])
Definition: hecmw_vis_define_parameters.c:545
transform2_frame
void transform2_frame(double coff_matrix[3][3], double view_point[3])
Definition: hecmw_vis_define_parameters.c:143
find_projection_range2
void find_projection_range2(double view_point[3], double n_f[3][3], double scr_area[4])
Definition: hecmw_vis_define_parameters.c:285
transform_frame3
void transform_frame3(double screen_point[3], double f[3][3], double coff_matrix[3][3], double n_f[3][3])
Definition: hecmw_vis_define_parameters.c:118
hecmw_vis_define_parameters.h
get_frame_transform_matrix
void get_frame_transform_matrix(double view_point_d[3], double screen_point[3], double up[3], double coff_matrix[3][3])
Definition: hecmw_vis_define_parameters.c:39
HECMW_vis_print_exit
void HECMW_vis_print_exit(char *var)
Definition: hecmw_vis_mem_util.c:21
transform_frame4
void transform_frame4(double screen_point[3], double iso_p[6], double coff_matrix[3][3], double n_iso[6])
Definition: hecmw_vis_define_parameters.c:224
transform_frame
void transform_frame(double screen_point[3], double vertex[24], double coff_matrix[3][3], double n_vertex[24])
Definition: hecmw_vis_define_parameters.c:94
EPSILON
#define EPSILON
Definition: hecmw_vis_define_parameters.c:11
find_inverse_matrix
void find_inverse_matrix(double coff_matrix[3][3], double inv_matrix[3][3])
Definition: hecmw_vis_define_parameters.c:66
find_projection_range3
void find_projection_range3(double view_point[3], double n_iso[6], double pixel_d[2][2], double iso_p[6])
Definition: hecmw_vis_define_parameters.c:248
view_parameter_define
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])
Definition: hecmw_vis_define_parameters.c:339
transform_range_vertex
void transform_range_vertex(double range[6], double vertex[24])
Definition: hecmw_vis_define_parameters.c:14
PI
#define PI
Definition: hecmw_vis_define_parameters.c:12