home *** CD-ROM | disk | FTP | other *** search
- /* dots - view a synthetic object in 3D
-
- history...
- 11 May 85 Allowing two-character cursor keys.
- 6 May 85 Always calling terminate_view_surface(1) before exit().
- Obeying ^S ^X ^D ^E in addition to regular cursor keys.
- 18 Apr 85 Using cursor control keys defined in g.h.
- */
-
- #include "stdio.h"
- #include "math.h"
- #include "g3.h"
- #include "g.h"
-
- #define VERSION "1.2"
- #define RIGHT "Copyright (c) 1985 by James R. Van Zandt. All rights reserved.\n"
- #define RESTRICTION "This program may be reproduced for personal, non-profit use only.\n"
-
- extern double atof(),best_width,best_height;
-
- extern int debugging;
- char string[80];
- int persp=1, /* nonzero if perspective projection desired */
- markers=0, /* nonzero if marker desired at each data point */
- framing=1; /* nonzero if frame desired around plot */
- int tails;
- static double cc,ss,angle,step,
- p1=-3.,p2=0.,p3=0.,
- n1= 3.,n2=0.,n3=0.;
-
- double x[500],y[500],z[500],
- xmin,xmax,ymin,ymax,zmin,zmax;
- int last;
-
- main(argc,argv) int argc; char **argv;
- { static double t;
- int i,j;
-
- if(argc<2 || (argc>1 && streq(argv[1],"?"))) sample();
-
- initialize_core(1);
- select_view_surface(1);
- initialize_view_surface(1);
- initialize_parameters(argc,argv);
-
- while(1)
- {new_frame(); /* clears the screen */
- if(persp) perspective(p1,p2,p3);
- else parallel(p1,p2,p3);
- view_plane_normal(-p1,-p2,-p3);
- create_temporary_segment(1); /* finds viewing transformation */
- image(); /* use drawing primitives to create image */
- frame(); /* draw framework around image */
- /* printf("p = (%f,%f,%f) \n",p1,p2,p3); */
- close_temporary_segment();
- update_parameters();
- }
- }
-
- initialize_parameters(argc,argv) int argc; char **argv;
- {/* if(want("use right handed coordinate system? ")) */
- coordinate_system_type(1); /* default coordinates are LH */
- ndc_space_2(best_width,best_height); /* enable use of all of screen */
- viewport2(0.,best_width,0.,best_height); /* viewport is all of screen */
- /* if(want("enable clipping? ")) */
- clip_window(1);
- read_data(argc,argv);
- view_up_3(0.,0.,1.); /* vector in this direction appears
- vertical in final view */
- angle=3.14159/12.;
- ss=sin(angle); cc=cos(angle);
- }
-
- update_parameters()
- { int c;
- static double t;
-
- while(1)
- {c=getchar();
- switch(c)
- {case '+': angle=angle*4.; step=step*4.;
- ss=sin(angle); cc=cos(angle);
- break;
- case '-': angle=angle/4.; step=step/4.;
- ss=sin(angle); cc=cos(angle);
- break;
- case '?': help(); return;
- case 'q': terminate_view_surface(1); exit();
- case 'Q': terminate_view_surface(1); exit();
- default:
- {if(escaped_arrows&(c==escape_char))c=getchar();
- if((c==up_arrow)|(c==('E'-64))) {p3+=step; return;}
- else if((c==down_arrow)|(c==('X'-64))) {p3-=step; return;}
- else if((c==right_arrow)|(c==('D'-64)))
- {t=cc*p1-ss*p2; p2= ss*p1+cc*p2; p1=t; return;
- }
- else if((c==left_arrow)|(c==('S'-64)))
- {t=cc*p1+ss*p2; p2=-ss*p1+cc*p2; p1=t; return;
- }
- putchar(7); /* beep */
- break;
- }
- }
- puts("\008 \008"); /* erase that character */
- }
- }
-
- help()
- { clear_graphics();
- printf("Cursor keys move observer higher, lower, ");
- printf("around to left, or around to right.\n");
- printf("+ enlarge cursor key steps by a factor of 4\n");
- printf("- shrink cursor key steps by a factor of 4\n");
- printf("q exit program\n");
- printf("? print this help menu\n");
-
- printf("\n \n \n press any key to continue");
- getchar();
- }
-
- read_data(argc,argv) int argc; char **argv;
- { int i,file;
- double xx,yy,zz,diag;
-
- file=fopen(argv[1],"r");
- if(file==0)
- {printf("file %s not found\n",argv[1]);
- goodbye();
- }
- argc=argc-2; argv=argv+2;
- xmin=ymin=zmin=1.e50;
- xmax=ymax=zmax=-1.e50;
- while(argc>0)
- {/* printf("read_data: parsing \"%s\" \n",*argv); */
- i=get_parameter(argc,argv);
- argv=argv+i; argc=argc-i;
- }
- for(i=0; i<500; i++)
- {if(fscanf(file,"%F %F %F",&x[i],&y[i],&z[i])==-1)break;
- if(x[i]<xmin)xmin=x[i];
- if(y[i]<ymin)ymin=y[i];
- if(z[i]<zmin)zmin=z[i];
-
- if(x[i]>xmax)xmax=x[i];
- if(y[i]>ymax)ymax=y[i];
- if(z[i]>zmax)zmax=z[i];
- }
- xx=xmax-xmin; yy=ymax-ymin; zz=zmax-zmin;
- diag=sqrt(xx*xx+yy*yy+zz*zz)/2./best_height;
- view_reference_point((xmax+xmin)/2.,(ymin+ymax)/2.,(zmin+zmax)/2.);
- window(-diag*best_width,diag*best_width,
- -diag*best_height,diag*best_height); /* use all of view surface */
- p1=2*diag; p2=-3*diag; p3=diag;
- step=diag;
- last=i-1;
- if(last<=0)
- {puts("no data points found \n");
- sample();
- }
- /* printf("x in (%f,%f),\ny in (%f,%f),\nz in (%f,%f) \n",xmin,xmax,
- ymin,ymax,zmin,zmax);
- printf("xx,yy,zz=(%f,%f,%f), diag=%f, step=%f \n",xx,yy,zz,diag,step);
- printf("points 0 through %d \n",last); getchar();
- */
- }
-
- sample()
- { printf("Dots version %s for %s \n\n",VERSION,machine);
- printf("sample usage...\n dots alpha.dat [options]\n");
- printf("options are:\n");
- printf(" -f omit frame around plot \n");
- printf(" -m draw marker at each data point, ");
- printf("rather than connecting points\n");
- printf(" -p use parallel rather than perspective projection\n");
- printf(" -t draw line from each data point to the XY plane\n");
- printf(" -x NUM1 NUM2 let x axis extend from NUM1 to NUM2\n");
- printf(" -y NUM1 NUM2 let y axis extend from NUM1 to NUM2\n");
- printf(" -z NUM1 NUM2 let z axis extend from NUM1 to NUM2\n\n");
- printf(RIGHT);
- printf(RESTRICTION);
- goodbye();
- }
-
- /* get_parameter - process one command line option
- (return # parameters used) */
- get_parameter(argc,argv) int argc; char **argv;
- { if(streq(*argv,"-x"))
- {if(argc<3) gripe(argv);
- xmin=atof(argv[1]); xmax=atof(argv[2]); return 3;
- }
- else if(streq(*argv,"-y"))
- {if(argc<3) gripe(argv);
- ymin=atof(argv[1]); ymax=atof(argv[2]); return 3;
- }
- else if(streq(*argv,"-z"))
- {if(argc<3) gripe(argv);
- zmin=atof(argv[1]); zmax=atof(argv[2]); return 3;
- }
- else if(streq(*argv,"-d")) {debugging=1; return 1;}
- else if(streq(*argv,"-f")) {framing=0; return 1;}
- else if(streq(*argv,"-m")) {markers=1; return 1;}
- else if(streq(*argv,"-p")) {persp=0; return 1;}
- else if(streq(*argv,"-t")) {tails=1; return 1;}
- else gripe(argv);
- }
-
- int streq(a,b) char *a,*b;
- { while(*a)
- {if(*a!=*b)return 0;
- a++; b++;
- }
- return 1;
- }
-
- gripe(argv) char **argv;
- { puts(*argv); puts(" isn\'t a legal argument \n");
- sample();
- }
-
- frame()
- { double xx,yy,zz;
-
- set_color(6); /* draw axes */
- if((xmin<0.)&&(xmax>0.)) xx=0.; else xx=xmin;
- if((ymin<0.)&&(ymax>0.)) yy=0.; else yy=ymin;
- if((zmin<0.)&&(zmax>0.)) zz=0.; else zz=zmin;
- move_abs_3(xmin,yy,zz); line_abs_3(xmax,yy,zz);
- move_abs_3(xx,ymin,zz); line_abs_3(xx,ymax,zz);
- move_abs_3(xx,yy,zmin); line_abs_3(xx,yy,zmax);
-
- if(!framing) return;
- /* draw frame */
- set_color(2);
- move_abs_3(xmin,ymin,zmin);
- line_abs_3(xmax,ymin,zmin);
- line_abs_3(xmax,ymax,zmin);
- line_abs_3(xmin,ymax,zmin);
- line_abs_3(xmin,ymin,zmin);
-
- line_abs_3(xmin,ymin,zmax);
-
- line_abs_3(xmax,ymin,zmax);
- line_abs_3(xmax,ymin,zmin);
- line_abs_3(xmax,ymin,zmax);
-
- line_abs_3(xmax,ymax,zmax);
- line_abs_3(xmax,ymax,zmin);
- line_abs_3(xmax,ymax,zmax);
-
- line_abs_3(xmin,ymax,zmax);
- line_abs_3(xmin,ymax,zmin);
- line_abs_3(xmin,ymax,zmax);
-
- line_abs_3(xmin,ymin,zmax);
- }
-
- image()
- { int i;
-
- set_color(4);
- move_abs_3(x[0],y[0],z[0]);
- for(i=0;i<=last;i++)
- {if(markers)marker_abs_3(x[i],y[i],z[i],4);
- else line_abs_3(x[i],y[i],z[i]);
- if(tails)
- {line_abs_3(x[i],y[i],0.);
- if(i&&(markers==0))line_abs_3(x[i-1],y[i-1],0.);
- move_abs_3(x[i],y[i],z[i]);
- }
- }
- }
-
- domino()
- { set_color(2);
- move_abs_3(0.,0.,0.); line_abs_3(3.,0.,0.); /* 3 coordinate axes */
- move_abs_3(0.,0.,0.); line_abs_3(0.,2.,0.);
- move_abs_3(0.,0.,0.); line_abs_3(0.,0.,.5);
- set_color(4);
- move_abs_3(0.,0.,0.); /* bottom */
- line_abs_3(2.,0.,0.);
- line_abs_3(2.,1.,0.);
- line_abs_3(0.,1.,0.);
- line_abs_3(0.,0.,0.);
- line_abs_3(0.,0.,.3); /* top */
- line_abs_3(2.,0.,.3);
- line_abs_3(2.,1.,.3);
- line_abs_3(0.,1.,.3);
- line_abs_3(0.,0.,.3);
- move_abs_3(1.,0.,.3); /* dividing line */
- line_abs_3(1.,1.,.3);
- move_abs_3(2.,0.,0.); /* other three connecting edges */
- line_abs_3(2.,0.,.3);
- move_abs_3(2.,1.,0.);
- line_abs_3(2.,1.,.3);
- move_abs_3(0.,1.,0.);
- line_abs_3(0.,1.,.3);
- marker_abs_3(.3,.3,.3,4); /* four spots */
- marker_abs_3(.3,.7,.3,4);
- marker_abs_3(.7,.3,.3,4);
- marker_abs_3(.7,.7,.3,4);
- }
-
- want(s) char *s;
- { printf(s);
- scanf("%s",&string);
- if((string[0]=='y')|(string[0]=='Y'))return 1;
- else return 0;
- }
-
- goodbye()
- { printf("\n<press any key to continue>"); getchar();
- terminate_view_surface(1);
- exit();
- }