home *** CD-ROM | disk | FTP | other *** search
/ Stars of Shareware: Raytrace & Morphing / SOS-RAYTRACE.ISO / programm / source / radsrc22 / src / gen / genrev.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-10-02  |  5.1 KB  |  244 lines

  1. #ifndef lint
  2. static char SCCSid[] = "@(#)genrev.c 2.2 10/2/92 LBL";
  3. #endif
  4.  
  5. /* Copyright (c) 1989 Regents of the University of California */
  6.  
  7. /*
  8.  *  genrev.c - program to generate functions of rotation about z
  9.  *
  10.  *    The program takes as input the functions of t for z and r
  11.  *    (the radius).  If z is increasing, the normal points
  12.  *    outward, inward for decreasing z.  Negative radii are forbidden.
  13.  *
  14.  *    8/6/86
  15.  */
  16.  
  17. #include  <stdio.h>
  18. #include  <math.h>
  19.  
  20. #define  ZNAME        "Z`SYS`"        /* z function name */
  21. #define  RNAME        "R`SYS`"        /* r function name */
  22.  
  23. #define  PI        3.14159265358979323846
  24.  
  25. #define  FTINY        1e-9
  26.                     /* orientation */
  27. #define  OUT        01
  28. #define  IN        02
  29. #define  UP        04
  30. #define  DOWN        010
  31.  
  32. double  funvalue(), l_hermite(), l_bezier(), l_bspline(), argument();
  33.  
  34.  
  35. main(argc, argv)
  36. int  argc;
  37. char  *argv[];
  38. {
  39.     extern long    eclock;
  40.     char  stmp[256];
  41.     char  *modname;
  42.     int  smooth = 0;
  43.     double  t, lastz, z, nextz, lastr, r, nextr;
  44.     double  lastnz, lastnr, nz, nr, nextnz, nextnr;
  45.     int  i, nseg;
  46.     int  orient;
  47.  
  48.     varset("PI", ':', PI);
  49.     funset("hermite", 5, ':', l_hermite);
  50.     funset("bezier", 5, ':', l_bezier);
  51.     funset("bspline", 5, ':', l_bspline);
  52.  
  53.     if (argc < 6)
  54.         goto userror;
  55.  
  56.     for (i = 6; i < argc; i++)
  57.         if (!strcmp(argv[i], "-e"))
  58.             scompile(argv[++i], NULL, 0);
  59.         else if (!strcmp(argv[i], "-f"))
  60.             fcompile(argv[++i]);
  61.         else if (!strcmp(argv[i], "-s"))
  62.             smooth = 1;
  63.         else
  64.             goto userror;
  65.  
  66.     sprintf(stmp, "%s(t)=%s;", ZNAME, argv[3]);
  67.     scompile(stmp, NULL, 0);
  68.     sprintf(stmp, "%s(t)=%s;", RNAME, argv[4]);
  69.     scompile(stmp, NULL, 0);
  70.     nseg = atoi(argv[5]);
  71.     if (nseg <= 0)
  72.         goto userror;
  73.     modname = smooth ? "Phong" : argv[1];
  74.  
  75.     printhead(argc, argv);
  76.     eclock = 0;
  77.  
  78.     lastnz = lastnr = 0.0;
  79.     t = 0.0;
  80.     lastz = funvalue(ZNAME, 1, &t);
  81.     lastr = funvalue(RNAME, 1, &t);
  82.     t = 1.0/nseg;
  83.     z = funvalue(ZNAME, 1, &t);
  84.     r = funvalue(RNAME, 1, &t);
  85.     computen(&nz, &nr, lastz, lastr, z, r);
  86.     for (i = 1; i <= nseg; i++) {
  87.         if (i < nseg) {
  88.             t = (double)(i+1)/nseg;
  89.             nextz = funvalue(ZNAME, 1, &t);
  90.             nextr = funvalue(RNAME, 1, &t);
  91.             computen(&nextnz, &nextnr, z, r, nextz, nextr);
  92.         } else
  93.             nextnz = nextnr = 0.0;
  94.         orient = 0;
  95.         if (z < lastz-FTINY)
  96.             orient |= DOWN;
  97.         else if (z > lastz+FTINY)
  98.             orient |= UP;
  99.         if (r < lastr-FTINY)
  100.             orient |= IN;
  101.         else if (r > lastr+FTINY)
  102.             orient |= OUT;
  103.         if (!orient)
  104.             goto endfor;
  105.         if (smooth) {
  106.             printf("\n%s texfunc Phong\n", argv[1]);
  107.             printf("4 rev_dx rev_dy rev_dz rev.cal\n");
  108.             printf("0\n4\n");
  109.             if (orient&(UP|DOWN)) {
  110.                 t = (nextnz - lastnz)/(z - lastz);
  111.                 printf("\t%15.9g\t%15.9g\n",
  112.                         t, lastnz - t*lastz);
  113.             } else
  114.                 printf("\t0\t%d\n", orient&IN ? 1 : -1);
  115.             if (orient&(OUT|IN))  {
  116.                 t = (nextnr - lastnr)/(r - lastr);
  117.                 printf("\t%15.9g\t%15.9g\n",
  118.                         t, lastnr - t*lastr);
  119.             } else
  120.                 printf("\t0\t%d\n", orient&UP ? 1 : -1);
  121.         }
  122.         if (!(orient&(IN|OUT))) {
  123.             printf("\n%s %s %s.%d\n", modname,
  124.                     orient&DOWN ? "tube" : "cylinder",
  125.                     argv[2], i);
  126.             printf("0\n0\n7\n");
  127.             printf("\t0\t0\t%15.9g\n", lastz);
  128.             printf("\t0\t0\t%15.9g\n", z);
  129.             printf("\t%15.9g\n", r);
  130.         } else if (!(orient&(UP|DOWN))) {
  131.             printf("\n%s ring %s.%d\n", modname, argv[2], i);
  132.             printf("0\n0\n8\n");
  133.             printf("\t0\t0\t%15.9g\n", z);
  134.             printf("\t0\t0\t%15.9g\n", orient&IN ? 1.0 : -1.0);
  135.             printf("\t%15.9g\t%15.9g\n", lastr, r);
  136.         } else {
  137.             printf("\n%s %s %s.%d\n", modname,
  138.                     orient&DOWN ? "cup" : "cone",
  139.                     argv[2], i);
  140.             printf("0\n0\n8\n");
  141.             printf("\t0\t0\t%15.9g\n", lastz);
  142.             printf("\t0\t0\t%15.9g\n", z);
  143.             printf("\t%15.9g\t%15.9g\n", lastr, r);
  144.         }
  145.     endfor:
  146.         lastz = z; lastr = r;
  147.         z = nextz; r = nextr;
  148.         lastnz = nz; lastnr = nr;
  149.         nz = nextnz; nr = nextnr;
  150.     }
  151.     quit(0);
  152.  
  153. userror:
  154.     fprintf(stderr,
  155.     "Usage: %s material name z(t) r(t) nseg [-e expr] [-f file] [-s]\n",
  156.             argv[0]);
  157.     quit(1);
  158. }
  159.  
  160.  
  161. computen(nzp, nrp, z0, r0, z1, r1)        /* compute normal */
  162. double  *nzp, *nrp, z0, r0, z1, r1;
  163. {
  164.     double  dr, dz, len;
  165.  
  166.     dz = r0 - r1;                /* right angle vector */
  167.     dr = z1 - z0;
  168.     len = sqrt(dr*dr + dz*dz);
  169.     *nzp = dz/len;
  170.     *nrp = dr/len;
  171. }
  172.  
  173.  
  174. eputs(msg)
  175. char  *msg;
  176. {
  177.     fputs(msg, stderr);
  178. }
  179.  
  180.  
  181. wputs(msg)
  182. char  *msg;
  183. {
  184.     eputs(msg);
  185. }
  186.  
  187.  
  188. quit(code)
  189. {
  190.     exit(code);
  191. }
  192.  
  193.  
  194. printhead(ac, av)        /* print command header */
  195. register int  ac;
  196. register char  **av;
  197. {
  198.     putchar('#');
  199.     while (ac--) {
  200.         putchar(' ');
  201.         fputs(*av++, stdout);
  202.     }
  203.     putchar('\n');
  204. }
  205.  
  206.  
  207. double
  208. l_hermite()            
  209. {
  210.     double  t;
  211.     
  212.     t = argument(5);
  213.     return(    argument(1)*((2.0*t-3.0)*t*t+1.0) +
  214.         argument(2)*(-2.0*t+3.0)*t*t +
  215.         argument(3)*((t-2.0)*t+1.0)*t +
  216.         argument(4)*(t-1.0)*t*t );
  217. }
  218.  
  219.  
  220. double
  221. l_bezier()
  222. {
  223.     double  t;
  224.  
  225.     t = argument(5);
  226.     return(    argument(1) * (1.+t*(-3.+t*(3.-t))) +
  227.         argument(2) * 3.*t*(1.+t*(-2.+t)) +
  228.         argument(3) * 3.*t*t*(1.-t) +
  229.         argument(4) * t*t*t );
  230. }
  231.  
  232.  
  233. double
  234. l_bspline()
  235. {
  236.     double  t;
  237.  
  238.     t = argument(5);
  239.     return(    argument(1) * (1./6.+t*(-1./2.+t*(1./2.-1./6.*t))) +
  240.         argument(2) * (2./3.+t*t*(-1.+1./2.*t)) +
  241.         argument(3) * (1./6.+t*(1./2.+t*(1./2.-1./2.*t))) +
  242.         argument(4) * (1./6.*t*t*t) );
  243. }
  244.