home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / grafik / coregraf / dots.c < prev    next >
Encoding:
C/C++ Source or Header  |  1986-01-06  |  8.6 KB  |  315 lines

  1. /*    dots - view a synthetic object in 3D
  2.  
  3.     history...
  4.         11 May 85    Allowing two-character cursor keys.
  5.         6 May 85    Always calling terminate_view_surface(1) before exit().
  6.     Obeying ^S ^X ^D ^E in addition to regular cursor keys.
  7.          18 Apr 85    Using cursor control keys defined in g.h.
  8. */
  9.  
  10. #include "stdio.h"
  11. #include "math.h"
  12. #include "g3.h"
  13. #include "g.h"
  14.  
  15. #define VERSION "1.2"
  16. #define RIGHT "Copyright (c) 1985 by James R. Van Zandt.  All rights reserved.\n"
  17. #define RESTRICTION "This program may be reproduced for personal, non-profit use only.\n"
  18.  
  19. extern double atof(),best_width,best_height;
  20.  
  21. extern int debugging;
  22. char string[80];
  23. int persp=1,    /* nonzero if perspective projection desired */
  24. markers=0,        /* nonzero if marker desired at each data point */
  25. framing=1;        /* nonzero if frame desired around plot */
  26. int tails;
  27. static double cc,ss,angle,step,
  28. p1=-3.,p2=0.,p3=0.,
  29. n1= 3.,n2=0.,n3=0.;
  30.  
  31. double x[500],y[500],z[500],
  32. xmin,xmax,ymin,ymax,zmin,zmax;
  33. int last;
  34.  
  35. main(argc,argv) int argc; char **argv;
  36. {    static double t;
  37.     int i,j;
  38.  
  39.     if(argc<2 || (argc>1 && streq(argv[1],"?"))) sample(); 
  40.     
  41.     initialize_core(1);
  42.     select_view_surface(1);
  43.     initialize_view_surface(1);
  44.     initialize_parameters(argc,argv);
  45.  
  46.     while(1)
  47.         {new_frame();                /* clears the screen */
  48.         if(persp) perspective(p1,p2,p3);
  49.         else parallel(p1,p2,p3);
  50.         view_plane_normal(-p1,-p2,-p3);
  51.         create_temporary_segment(1); /* finds viewing transformation */
  52.         image();            /* use drawing primitives to create image */
  53.         frame();            /* draw framework around image */
  54. /*        printf("p = (%f,%f,%f) \n",p1,p2,p3); */
  55.         close_temporary_segment();    
  56.         update_parameters();
  57.         }
  58. }
  59.  
  60. initialize_parameters(argc,argv) int argc; char **argv;
  61. {/*    if(want("use right handed coordinate system? ")) */
  62.         coordinate_system_type(1);        /* default coordinates are LH */
  63.     ndc_space_2(best_width,best_height); /* enable use of all of screen */
  64.     viewport2(0.,best_width,0.,best_height); /* viewport is all of screen */
  65.     /*    if(want("enable clipping? ")) */
  66.         clip_window(1);
  67.     read_data(argc,argv);
  68.     view_up_3(0.,0.,1.);        /* vector in this direction appears
  69.                                        vertical in final view        */
  70.     angle=3.14159/12.;
  71.     ss=sin(angle); cc=cos(angle);
  72. }
  73.  
  74. update_parameters()
  75. {    int c;
  76.     static double t;
  77.  
  78.     while(1)
  79.         {c=getchar();
  80.         switch(c)
  81.             {case '+':    angle=angle*4.; step=step*4.;
  82.                         ss=sin(angle); cc=cos(angle);
  83.                         break;
  84.             case '-':    angle=angle/4.; step=step/4.;
  85.                         ss=sin(angle); cc=cos(angle);
  86.                         break;
  87.             case '?':    help();    return;
  88.             case 'q':    terminate_view_surface(1); exit();
  89.             case 'Q':    terminate_view_surface(1); exit();
  90.             default:
  91.                 {if(escaped_arrows&(c==escape_char))c=getchar();
  92.                 if((c==up_arrow)|(c==('E'-64))) {p3+=step; return;}
  93.                 else if((c==down_arrow)|(c==('X'-64))) {p3-=step; return;}
  94.                 else if((c==right_arrow)|(c==('D'-64)))
  95.                     {t=cc*p1-ss*p2; p2= ss*p1+cc*p2; p1=t; return;
  96.                     }
  97.                 else if((c==left_arrow)|(c==('S'-64)))
  98.                     {t=cc*p1+ss*p2; p2=-ss*p1+cc*p2; p1=t; return;
  99.                     }
  100.                 putchar(7);  /* beep */
  101.                 break;
  102.                 }
  103.             }
  104.         puts("\008 \008");    /* erase that character */
  105.         }
  106. }
  107.  
  108. help()
  109. {    clear_graphics();
  110.     printf("Cursor keys move observer higher, lower, ");
  111.     printf("around to left, or around to right.\n");
  112.     printf("+   enlarge cursor key steps by a factor of 4\n");
  113.     printf("-   shrink cursor key steps by a factor of 4\n");
  114.     printf("q   exit program\n");
  115.     printf("?   print this help menu\n");
  116.  
  117.     printf("\n \n \n press any key to continue");
  118.     getchar();
  119. }
  120.  
  121. read_data(argc,argv) int argc; char **argv;
  122. {    int i,file;
  123.     double xx,yy,zz,diag;
  124.  
  125.     file=fopen(argv[1],"r");
  126.     if(file==0)
  127.         {printf("file %s not found\n",argv[1]);
  128.         goodbye();
  129.         }
  130.     argc=argc-2; argv=argv+2;
  131.     xmin=ymin=zmin=1.e50;
  132.     xmax=ymax=zmax=-1.e50;
  133.     while(argc>0)
  134.         {/* printf("read_data: parsing \"%s\" \n",*argv); */
  135.         i=get_parameter(argc,argv);
  136.         argv=argv+i; argc=argc-i;
  137.         }
  138.     for(i=0; i<500; i++)
  139.         {if(fscanf(file,"%F %F %F",&x[i],&y[i],&z[i])==-1)break;
  140.         if(x[i]<xmin)xmin=x[i];
  141.         if(y[i]<ymin)ymin=y[i];
  142.         if(z[i]<zmin)zmin=z[i];
  143.  
  144.         if(x[i]>xmax)xmax=x[i];
  145.         if(y[i]>ymax)ymax=y[i];
  146.         if(z[i]>zmax)zmax=z[i];
  147.         }
  148.     xx=xmax-xmin; yy=ymax-ymin; zz=zmax-zmin;
  149.     diag=sqrt(xx*xx+yy*yy+zz*zz)/2./best_height;
  150.     view_reference_point((xmax+xmin)/2.,(ymin+ymax)/2.,(zmin+zmax)/2.);
  151.     window(-diag*best_width,diag*best_width,
  152.            -diag*best_height,diag*best_height); /* use all of view surface */
  153.     p1=2*diag; p2=-3*diag; p3=diag;
  154.     step=diag;    
  155.     last=i-1;
  156.     if(last<=0)
  157.         {puts("no data points found \n");
  158.         sample();
  159.         }
  160. /*    printf("x in (%f,%f),\ny in (%f,%f),\nz in (%f,%f) \n",xmin,xmax,
  161.     ymin,ymax,zmin,zmax);
  162.     printf("xx,yy,zz=(%f,%f,%f), diag=%f, step=%f \n",xx,yy,zz,diag,step);
  163.     printf("points 0 through %d \n",last); getchar();
  164. */
  165. }
  166.  
  167. sample()
  168. {    printf("Dots   version %s for %s \n\n",VERSION,machine);
  169.     printf("sample usage...\n   dots  alpha.dat [options]\n");
  170.     printf("options are:\n");
  171.     printf("   -f   omit frame around plot \n");
  172.     printf("   -m   draw marker at each data point, ");
  173.     printf("rather than connecting points\n");
  174.     printf("   -p   use parallel rather than perspective projection\n");
  175.     printf("   -t   draw line from each data point to the XY plane\n");
  176.     printf("   -x  NUM1 NUM2  let x axis extend from NUM1 to NUM2\n");
  177.     printf("   -y  NUM1 NUM2  let y axis extend from NUM1 to NUM2\n");
  178.     printf("   -z  NUM1 NUM2  let z axis extend from NUM1 to NUM2\n\n");
  179.     printf(RIGHT);
  180.     printf(RESTRICTION);
  181.     goodbye();
  182. }
  183.  
  184. /* get_parameter - process one command line option
  185.         (return # parameters used) */
  186. get_parameter(argc,argv) int argc; char **argv;
  187. {    if(streq(*argv,"-x"))
  188.         {if(argc<3) gripe(argv);
  189.         xmin=atof(argv[1]); xmax=atof(argv[2]); return 3;
  190.         }
  191.     else if(streq(*argv,"-y"))
  192.         {if(argc<3) gripe(argv);
  193.         ymin=atof(argv[1]); ymax=atof(argv[2]); return 3;
  194.         }
  195.     else if(streq(*argv,"-z"))
  196.         {if(argc<3) gripe(argv);
  197.         zmin=atof(argv[1]); zmax=atof(argv[2]); return 3;
  198.         }
  199.     else if(streq(*argv,"-d")) {debugging=1; return 1;}
  200.     else if(streq(*argv,"-f")) {framing=0; return 1;}
  201.     else if(streq(*argv,"-m")) {markers=1; return 1;}
  202.     else if(streq(*argv,"-p")) {persp=0; return 1;}
  203.     else if(streq(*argv,"-t")) {tails=1; return 1;}
  204.     else gripe(argv);
  205. }
  206.  
  207. int streq(a,b) char *a,*b;
  208. {    while(*a)
  209.         {if(*a!=*b)return 0;
  210.         a++; b++;
  211.         }
  212.     return 1;
  213. }
  214.  
  215. gripe(argv) char **argv;
  216. {    puts(*argv); puts(" isn\'t a legal argument \n");
  217.     sample();
  218. }
  219.  
  220. frame()
  221. {    double xx,yy,zz;
  222.  
  223.     set_color(6);    /* draw axes */
  224.     if((xmin<0.)&&(xmax>0.)) xx=0.; else xx=xmin;
  225.     if((ymin<0.)&&(ymax>0.)) yy=0.; else yy=ymin;
  226.     if((zmin<0.)&&(zmax>0.)) zz=0.; else zz=zmin;
  227.     move_abs_3(xmin,yy,zz); line_abs_3(xmax,yy,zz);
  228.     move_abs_3(xx,ymin,zz); line_abs_3(xx,ymax,zz);
  229.     move_abs_3(xx,yy,zmin); line_abs_3(xx,yy,zmax);
  230.  
  231.     if(!framing) return;
  232.                             /* draw frame */
  233.     set_color(2);
  234.     move_abs_3(xmin,ymin,zmin);
  235.     line_abs_3(xmax,ymin,zmin);
  236.     line_abs_3(xmax,ymax,zmin);
  237.     line_abs_3(xmin,ymax,zmin);
  238.     line_abs_3(xmin,ymin,zmin);
  239.  
  240.     line_abs_3(xmin,ymin,zmax);
  241.  
  242.     line_abs_3(xmax,ymin,zmax);
  243.     line_abs_3(xmax,ymin,zmin);
  244.     line_abs_3(xmax,ymin,zmax);
  245.  
  246.     line_abs_3(xmax,ymax,zmax);
  247.     line_abs_3(xmax,ymax,zmin);
  248.     line_abs_3(xmax,ymax,zmax);
  249.  
  250.     line_abs_3(xmin,ymax,zmax);
  251.     line_abs_3(xmin,ymax,zmin);
  252.     line_abs_3(xmin,ymax,zmax);
  253.  
  254.     line_abs_3(xmin,ymin,zmax);
  255. }
  256.  
  257. image()
  258. {    int i;
  259.  
  260.     set_color(4);
  261.     move_abs_3(x[0],y[0],z[0]);
  262.     for(i=0;i<=last;i++)
  263.         {if(markers)marker_abs_3(x[i],y[i],z[i],4);
  264.         else line_abs_3(x[i],y[i],z[i]);
  265.         if(tails)
  266.             {line_abs_3(x[i],y[i],0.);
  267.             if(i&&(markers==0))line_abs_3(x[i-1],y[i-1],0.);
  268.             move_abs_3(x[i],y[i],z[i]);
  269.             }
  270.         }
  271. }
  272.  
  273. domino()
  274. {    set_color(2);
  275.     move_abs_3(0.,0.,0.); line_abs_3(3.,0.,0.);    /* 3 coordinate axes */
  276.     move_abs_3(0.,0.,0.); line_abs_3(0.,2.,0.);
  277.     move_abs_3(0.,0.,0.); line_abs_3(0.,0.,.5);
  278.     set_color(4);
  279.     move_abs_3(0.,0.,0.);    /* bottom */
  280.     line_abs_3(2.,0.,0.);
  281.     line_abs_3(2.,1.,0.);
  282.     line_abs_3(0.,1.,0.);
  283.     line_abs_3(0.,0.,0.);
  284.     line_abs_3(0.,0.,.3);    /* top */
  285.     line_abs_3(2.,0.,.3);
  286.     line_abs_3(2.,1.,.3);
  287.     line_abs_3(0.,1.,.3);
  288.     line_abs_3(0.,0.,.3);
  289.     move_abs_3(1.,0.,.3);    /* dividing line */
  290.     line_abs_3(1.,1.,.3);
  291.     move_abs_3(2.,0.,0.);    /* other three connecting edges */
  292.     line_abs_3(2.,0.,.3);
  293.     move_abs_3(2.,1.,0.);
  294.     line_abs_3(2.,1.,.3);
  295.     move_abs_3(0.,1.,0.);
  296.     line_abs_3(0.,1.,.3);
  297.     marker_abs_3(.3,.3,.3,4);    /* four spots */
  298.     marker_abs_3(.3,.7,.3,4);
  299.     marker_abs_3(.7,.3,.3,4);
  300.     marker_abs_3(.7,.7,.3,4);
  301. }
  302.  
  303. want(s) char *s;
  304. {    printf(s);
  305.     scanf("%s",&string);
  306.     if((string[0]=='y')|(string[0]=='Y'))return 1;
  307.     else return 0;
  308. }
  309.  
  310. goodbye()
  311. {    printf("\n<press any key to continue>"); getchar();
  312.     terminate_view_surface(1);
  313.     exit();
  314. }
  315.