|
|
1.1 root 1: /*
2: ...read triangle-format movie file...
3: nv
4: vx(i), vy(i) i=1,nv
5: nt
6: itri(1..3,it) it=1,nt
7: time, fmin, fmax
8: fk(i) i=1,nv in compressed format
9:
10: if nv=0 or nt=0, use same values as for previous frame
11:
12: WARNING. If vx,vy bounding box changes, so will grid.
13: */
14:
15: #include <stdio.h>
16: #include "../view2d.h"
17: #define INF 1e25
18: char *progname;
19:
20: int mx, my; /* output grid */
21: float *tr, *f;
22: int nv, nt;
23: float *vx, *vy;
24: float *fk;
25: int *itri;
26: float xmin, xmax, ymin, ymax;
27: int verbose;
28:
29: main(argc,argv)
30: int argc;
31: char **argv;
32: {
33: int i, ifr;
34: char *Malloc();
35:
36: progname = argv[0];
37: mx = 5; my = 5;
38: verbose = 0;
39: for(argc--, argv++; *argv; argv++){
40: if(**argv == '-' ){
41: switch(argv[0][1]) {
42: case 'n':
43: i = sscanf(&argv[0][2], "%d,%d", &mx, &my);
44: if(i==1) my = mx;
45: else if(i!=2) error("options: -nmx,my");
46: break;
47: case 'v':
48: verbose++;
49: break;
50: }
51: }
52: }
53:
54: i = mx*my*sizeof(float);
55: tr = (float *)Malloc(i);
56: f = (float *)Malloc(i);
57: nv = 0;
58: nt = 0;
59: while(fr()){
60: if(verbose)fprintf(stderr,"frame %d done\n",ifr++);
61: }
62:
63: exit(0);
64: }
65:
66: fr()
67: {
68: int new_nv, new_nt;
69: int i, j;
70: float time, fmin, fmax, floor;
71: char *Malloc();
72:
73: i = scanf("%d",&new_nv);
74: if( i == EOF ) return(0);
75: if(verbose)fprintf(stderr,"nv=%d\n",new_nv);
76: if( nv==0 ){
77: if(new_nv==0) error("nv must be nonzero for first frame");
78: }else{
79: if(new_nv!=0){
80: free((char *)fk);
81: free((char *)vx);
82: free((char *)vy);
83: }
84: }
85: if((nv==0)||(new_nv!=0)){
86: nv = new_nv;
87: i = nv*sizeof(float);
88: fk = (float *)Malloc(i);
89: vx = (float *)Malloc(i);
90: vy = (float *)Malloc(i);
91: xmin = INF; xmax = -INF;
92: ymin = INF; ymax = -INF;
93: for(j=0; j<nv; j++){
94: i = scanf("%e %e",vx+j,vy+j);
95: if( i == EOF ) error("unexpected EOF");
96: if( i!=2 ) error("bad format");
97: if(vx[j]<xmin) xmin=vx[j];
98: if(vx[j]>xmax) xmax=vx[j];
99: if(vy[j]<ymin) ymin=vy[j];
100: if(vy[j]>ymax) ymax=vy[j];
101: }
102: }
103:
104: i = scanf("%d",&new_nt);
105: if( i == EOF ) error("unexpected EOF");
106: if(verbose)fprintf(stderr,"nt=%d\n",new_nt);
107: if( nt==0 ){
108: if(new_nt==0) error("automatic triangulation not implemented yet");
109: }else{
110: if(nt!=0){
111: free((char *)itri);
112: }
113: }
114: if((nt==0)||(new_nt!=0)){
115: nt = new_nt;
116: i = 3*nt*sizeof(int);
117: itri = (int *)Malloc(i);
118: for(j=0; j<nt; j++){
119: i = scanf("%d %d %d",itri+3*j,itri+1+3*j,itri+2+3*j);
120: if( i == EOF ) error("unexpected EOF");
121: if( i!=3 ) error("bad format");
122: }
123: macbox_( &nv,vx,vy,&nt,itri,
124: &mx,&xmin,&xmax,&my,&ymin,&ymax,tr);
125: if(verbose){
126: fprintf(stderr,"tr=");
127: for(i=0;i<mx*my;i++){
128: fprintf(stderr," %f",tr[i]);
129: }
130: fprintf(stderr,"\n");
131: }
132: }
133:
134: i = scanf("%e %f %f\n", &time, &fmin, &fmax);
135: if( i != 3 ) error("bad time,fmin,fmax format %d",i);
136:
137: unpack(nv,fk,fmin,fmax,floor);
138:
139: floor = -INF;
140: intbox_(&mx,&xmin,&xmax,&my,&ymin,&ymax,f,tr,
141: &nv,fk,&floor,vx,vy,itri);
142: if(verbose){
143: fprintf(stderr,"f=\n");
144: for(j=0;j<my;j++){
145: for(i=0;i<mx;i++){
146: fprintf(stderr," %g",f[i+mx*j]);
147: }
148: fprintf(stderr,"\n");
149: }
150: }
151:
152: moviefil(1,mx,my,time,floor,f);
153:
154: return(1);
155: }
156:
157: /* read compressed values */
158: unpack(npts,data,fmin,fmax,floor)
159: int npts;
160: float *data;
161: float fmin, fmax; /* data range before compression */
162: float floor; /* value to flag out of bounds */
163: /* input: npts,fmin,fmax,floor */
164: /* output: data */
165: {
166: int hi, lo;
167: float frange = fmax - fmin;
168: for(; npts>0; npts--, data++){
169: hi = getchar()-33;
170: if(hi < 0) hi = getchar()-33; /* discard newline */
171: lo = getchar()-33;
172: if( (hi=='~'-33) && (lo=='~'-33) ){
173: *data = floor;
174: }else{
175: *data = fmin + (hi*64+lo)*frange/4095;
176: }
177: }
178: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.