home *** CD-ROM | disk | FTP | other *** search
/ Encyclopedia of Graphics File Formats Companion / GFF_CD.ISO / formats / ttddd / code / thread.c < prev   
C/C++ Source or Header  |  1994-06-20  |  6KB  |  178 lines

  1. /* thread.c - Generate a threaded screw-like object
  2.  *          - Written by Glenn M. Lewis - 5/15/91
  3.  *
  4.  * This code is placed in the public domain without any warranty for
  5.  * suitability for a particular purpose.  Please just leave my name in
  6.  * the source as the original author.
  7.  */
  8.  
  9. #include <stdio.h>
  10. #include <math.h>
  11.  
  12. #define PI    (3.14159265)
  13. char *malloc();
  14. double atof(), SPACING, HEIGHT, IN_RADIUS, OUT_RADIUS;
  15. double height, heightstep, theta, thetastep;
  16. double *outer_x, *outer_y, *outer_z;
  17. double *inner_x, *inner_y, *inner_z;
  18. int e, f, edge, face, count, NUMPTS;
  19.  
  20.  
  21. main(argc, argv)
  22. int argc;
  23. char *argv[];
  24. {
  25.     int i;
  26.  
  27.     if (argc != 6) {
  28.         fprintf(stderr, "Usage: %s NUMPTS SPACING HEIGHT IN_RADIUS OUT_RADIUS\n",
  29.             argv[0]);
  30.            fprintf(stderr, "where NUMPTS is the number of points in one revolution\n");
  31.            fprintf(stderr, "      SPACING is the number of units between threads\n");
  32.         fprintf(stderr, "      HEIGHT is the total height of the bolt.\n");
  33.         fprintf(stderr, "      IN_RADIUS is the radius of the inner thread.\n");
  34.         fprintf(stderr, "      OUT_RADIUS is the radius of the outer thread.\n");
  35.         fprintf(stderr, "A good starting point would be:\n");
  36.         fprintf(stderr, "Thread 60 0.5 10 4 5 | WriteTDDD > Thread.tddd\n");
  37.         exit(0);
  38.     }
  39.  
  40.     printf(
  41. "/* thread.ttddd - Written by Glenn M. Lewis - 3/26/91\n\
  42.  * Steve Worley had asked on the Imagine mailing list how to create\n\
  43.  * a thread-like object for Imagine.  Instead of saying 'how about\n\
  44.  * using TTDDD to create it,' I thought... I'll see if I can create\n\
  45.  * a thread using TTDDD.  Here are the results.\n\
  46.  */\n\
  47. \n\
  48. OBJ Begin\n\
  49. DESC Begin\n\
  50.   NAME \"Thread\"\n\
  51.   SHAP Shape 2\n\
  52.   SHAP Lamp 0\n\
  53. \n");
  54.  
  55. /* OK.  Start calculating the position of the points, edges, and faces... */
  56. NUMPTS     = atoi(argv[1]);
  57. SPACING    = atof(argv[2]);
  58. HEIGHT     = atof(argv[3]);
  59. IN_RADIUS  = atof(argv[4]);
  60. OUT_RADIUS = atof(argv[5]);
  61.  
  62. /*
  63.  * Calculate the points needed...
  64.  */
  65. height = 0.0;
  66. heightstep = SPACING/(double)NUMPTS;
  67. theta = 0.0;
  68. thetastep = PI*2.0/(double)NUMPTS;
  69.  
  70. count = 2+HEIGHT/heightstep;
  71. if (!(outer_x = (double*)malloc((unsigned)count*sizeof(double)))) {
  72. NO_MEM:
  73.     fprintf(stderr, "Out of memory.\n*** ABORT ***\n");
  74.     exit(-1);
  75. }
  76. if (!(outer_y = (double*)malloc((unsigned)count*sizeof(double)))) goto NO_MEM;
  77. if (!(outer_z = (double*)malloc((unsigned)count*sizeof(double)))) goto NO_MEM;
  78. if (!(inner_x = (double*)malloc((unsigned)count*sizeof(double)))) goto NO_MEM;
  79. if (!(inner_y = (double*)malloc((unsigned)count*sizeof(double)))) goto NO_MEM;
  80. if (!(inner_z = (double*)malloc((unsigned)count*sizeof(double)))) goto NO_MEM;
  81.  
  82. count = 0;
  83. while (height < HEIGHT) {
  84.     outer_x[count] = sin(theta) * OUT_RADIUS;
  85.     outer_y[count] = cos(theta) * OUT_RADIUS;
  86.     outer_z[count] = height;
  87.     inner_x[count] = sin(theta) * IN_RADIUS;
  88.     inner_y[count] = cos(theta) * IN_RADIUS;
  89.     inner_z[count] = height+SPACING/2.0;
  90.     theta += thetastep;
  91.     height += heightstep;
  92.     count++;
  93. }
  94.  
  95. /*
  96.  * Start writing the TTDDD data...
  97.  *
  98.  * First, list the points...
  99.  */
  100. printf("  PNTS Pcount %d\n", count*2);
  101. edge = 0;
  102. for (i=0; i<count; i++) {
  103.     printf("    PNTS Point %d %g %g %g\n", i*2,
  104.         outer_x[i], outer_y[i], outer_z[i]);
  105.     printf("    PNTS Point %d %g %g %g\n", i*2+1,
  106.         inner_x[i], inner_y[i], inner_z[i]);
  107.     /* Count up the number of edges we need    */
  108.     if (i<count-1) {
  109.         edge += 3;                            /* O[i]..O[i+1]..I[i]..O[i]    */
  110.         if (i+NUMPTS<count) { edge += 3; }    /* I[i]..I[i+1]..O[i-N]..I[i]    */
  111.         if (i+1<count) { edge += 3; }         /* O[i+1]..I[i+1]..I[i]..O[i+1]    */
  112.         if (i+NUMPTS+1<count) { edge += 3; }  /* I[i+1]..O[i+1-N]..O[i-N]..I[i+1]    */
  113.     }
  114. }
  115. /* Free up malloc()'d memory... */
  116. free(outer_x);
  117. free(outer_y);
  118. free(outer_z);
  119. free(inner_x);
  120. free(inner_y);
  121. free(inner_z);
  122.  
  123. /*
  124.  * Second, list the edges...
  125.  */
  126. printf("\n  EDGE ECount %d\n", edge);
  127. e=0;
  128. face = 0;
  129. for (i=0; i<count-1; i++) {
  130.     printf("    EDGE Edge %d %d %d\n", e++, i*2, (i+1)*2);
  131.     printf("    EDGE Edge %d %d %d\n", e++, (i+1)*2, i*2+1);
  132.     printf("    EDGE Edge %d %d %d\n", e++, i*2+1, i*2);
  133.     face++;
  134.     if (i+NUMPTS<count) {
  135.         printf("    EDGE Edge %d %d %d\n", e++, i*2+1, (i+1)*2+1);
  136.         printf("    EDGE Edge %d %d %d\n", e++, (i+1)*2+1, (i+NUMPTS)*2);
  137.         printf("    EDGE Edge %d %d %d\n", e++, (i+NUMPTS)*2, i*2+1);
  138.         face++;
  139.     }
  140.     if (i+1<count) {
  141.         printf("    EDGE Edge %d %d %d\n", e++, (i+1)*2, (i+1)*2+1);
  142.         printf("    EDGE Edge %d %d %d\n", e++, (i+1)*2+1, i*2+1);
  143.         printf("    EDGE Edge %d %d %d\n", e++, i*2+1, (i+1)*2);
  144.         face++;
  145.     }
  146.     if (i+NUMPTS+1<count) {
  147.         printf("    EDGE Edge %d %d %d\n", e++, (i+1)*2+1, (i+1+NUMPTS)*2);
  148.         printf("    EDGE Edge %d %d %d\n", e++,(i+1+NUMPTS)*2,(i+NUMPTS)*2);
  149.         printf("    EDGE Edge %d %d %d\n", e++, (i+NUMPTS)*2, (i+1)*2+1);
  150.         face++;
  151.     }
  152. }
  153.  
  154. /*
  155.  * Third, list the faces...
  156.  */
  157. printf("\n  FACE Tcount %d\n", face);
  158. e=0;
  159. f=0;
  160. for (i=0; i<count-1; i++) {
  161.     printf("    FACE Connect %d %d %d %d\n", f++, e++, e++, e++);
  162.     if (i+NUMPTS<count) {
  163.         printf("    FACE Connect %d %d %d %d\n", f++, e++, e++, e++);
  164.     }
  165.     if (i+1<count) {
  166.         printf("    FACE Connect %d %d %d %d\n", f++, e++, e++, e++);
  167.     }
  168.     if (i+NUMPTS+1<count) {
  169.         printf("    FACE Connect %d %d %d %d\n", f++, e++, e++, e++);
  170.     }
  171. }
  172. /*
  173.  * Now wrap up the object description...
  174.  */
  175. printf("\nEnd DESC\nTOBJ\nEnd OBJ\n");
  176. exit(0);
  177. }
  178.