home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 September / Simtel20_Sept92.cdr / msdos / ddjmag / ddj8711.arc / MAKE_HID.C < prev    next >
C/C++ Source or Header  |  1987-10-08  |  3KB  |  109 lines

  1. /*----------------------------------------------------------------------
  2.     make_hidlin.c
  3.     
  4.     Creates a grid of elevations and then
  5.     input file for the 3D hidden line algorithm (hidlinpix)
  6.     
  7.     The input file creation process is fully explained in Ammeraal's
  8.     book "Programming Principle in Computer Graphics"
  9.     
  10.     William May
  11.     303A Ridgefield Cirlce
  12.     Clinton, MA 01510
  13.     
  14.     created:    3/20/87
  15.   ----------------------------------------------------------------------*/
  16.  
  17. #include <stdio.h>
  18. #include "make_hidlin.h"
  19. #include "contour.h"
  20.  
  21. #define SCALE 100.0
  22.  
  23. int grid[HMAX][VMAX];
  24. FILE *fp;
  25.  
  26. /*------------------------------------------------------------------------
  27.     Coordinate creating an input file for hidlinpix
  28.   ------------------------------------------------------------------------*/
  29. make_hidlin()
  30. {
  31.     printf("Beginning make_hidlin\n");
  32.     
  33.     init_grid();
  34.  
  35.     make_grid();
  36.     
  37.     fp = fopen("grid.dat", "w");
  38.  
  39.     /* convert grid to hidlin input format */
  40.     conv_hidlin();
  41.  
  42.     printf("Conversion complete\n");
  43.     
  44.     fclose(fp);
  45. }
  46.  
  47. /*------------------------------------------------------------------------
  48.     0 the grid
  49.     this may be unnecessary for a global, but doesn't hurt
  50.     It is however, necessary if the contour analysis is
  51.     done repeatedly without quitting the program
  52.   ------------------------------------------------------------------------*/
  53. init_grid()
  54. {
  55.     register int h,v;
  56.     
  57.     for (h = 0; h < HMAX; h++)
  58.         for (v=0; v < VMAX; v++)
  59.             grid[h][v] = 0;
  60. }
  61.  
  62. /*------------------------------------------------------------------------
  63.     Convert the grid to a hidlinpix input file
  64.     This function is based on code from Ammeraal's book for
  65.     doing 3D projections of mathematical functions
  66.   ------------------------------------------------------------------------*/
  67. conv_hidlin()
  68. {
  69.     int i, j, k, l;
  70.     double f();
  71.                             
  72.     fprintf(fp, "%lf %lf %lf\n", (double)HMAX / 2.0, (double)VMAX / 2.0, 0.0);
  73.     
  74.     printf("Printing the point coordinates\n");
  75.     
  76.     for (i = 0; i < HMAX; i++) {
  77.         for (j = 0; j < VMAX; j++) {                
  78.             fprintf(fp, "%d %lf %lf %lf\n", j*(HMAX+1)+i+1,
  79.                 (double)i, (double)j, f(i,j));
  80.         }
  81.     }
  82.  
  83.     fprintf(fp, "Faces:\n");
  84.     
  85.     printf("Printing the faces\n");
  86.     
  87.     /* next two lines switched */
  88.     for (i = 0; i < HMAX; i++) {
  89.         for (j = 0; j < VMAX; j++) {    
  90.             k = j*(HMAX+1)+i+1;
  91.             l = k+HMAX+1;
  92.             fprintf(fp, "%d %d %d#\n", k, -(l+1), k+1);
  93.             fprintf(fp, "%d %d %d#\n", k+1, l+1, -k);
  94.             fprintf(fp, "%d %d %d#\n", k, -(l+1), l);
  95.             fprintf(fp, "%d %d %d#\n", l, l+1, -k);
  96.         }
  97.     }
  98. }
  99.  
  100. /*------------------------------------------------------------------------
  101.     note reversing the h coordinates
  102.     somewhere the grid is being reversed
  103.   ------------------------------------------------------------------------*/
  104. double f(h,v)
  105. int h,v;
  106. {
  107.     return ((double)(grid[HMAX - h - 1][v]) / SCALE);
  108. }
  109.