home *** CD-ROM | disk | FTP | other *** search
/ Avalon - 3D Objects & Resources / Avalon.iso / objects / enff / dragon / f2enff.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-01-01  |  2.9 KB  |  195 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define MX_N 4
  6. typedef float matrix[MX_N][MX_N];
  7. typedef float vector[MX_N];
  8.  
  9. void
  10. MxMultiply(matrix a, matrix b, matrix c)
  11.   {
  12.     int i,j;
  13.     matrix h;
  14.  
  15.     for (i=0;i<4;i++)
  16.       for (j=0;j<4;j++)
  17.         {
  18.       h[i][j] = a[i][0]*b[0][j] +
  19.             a[i][1]*b[1][j] +
  20.             a[i][2]*b[2][j] +
  21.             a[i][3]*b[3][j];
  22.         };
  23.  
  24.      c = h;
  25.   }
  26.  
  27.  
  28. int surface;
  29.  
  30. #include <math.h>
  31.  
  32. matrix XControlT =
  33.     {0,0,0,0,
  34.     1/3.0, 1/3.0, 1/3.0, 1/3.0,
  35.     2/3.0, 2/3.0, 2/3.0, 2/3.0,
  36.      1,     1,     1,     1
  37.     };
  38.  
  39. matrix X,Y,Z;
  40.  
  41. matrix YControlT =
  42.     {
  43.     0,  1/3.0,   2/3.0,  1,
  44.     0,  1/3.0,   2/3.0,  1,
  45.     0,  1/3.0,   2/3.0,  1,
  46.     0,  1/3.0,   2/3.0,  1,
  47.     };
  48.  
  49. matrix ZControlT =
  50.     {
  51.     0, 0, 0, 0,
  52.     0, 0, 0, 0,
  53.     0, 0, 0, 0,
  54.     0, 0, 0, 0,
  55.     };
  56.  
  57. matrix XControl,YControl,ZControl;
  58.  
  59.  
  60. matrix Bezier =
  61.     {
  62.     -1, 3, -3, 1,
  63.     3, -6, 3, 0,
  64.     -3, 3, 0, 0,
  65.     1, 0, 0, 0
  66.     };
  67. matrix B_Spline =
  68.     {
  69.     -1/6.0, 3/6.0, -3/6.0,  1/6.0,
  70.     3/6.0, -6/6.0,  3/6.0,  0,
  71.     -3/6.0,   0,  3/6.0,  0,
  72.     1/6.0,  4/6.0,  1/6.0,  0,
  73.     };
  74. matrix BezierInv =
  75.     {
  76.         0,   0,    0,   1, 
  77.         0,   0,   1/3.0,  1,
  78.         0,  1/3.0,  2/3.0,  1,
  79.         1,   1,    1,   1,
  80.     };
  81. matrix Tchebi =
  82.     {
  83.     0, 0, 0, 4,
  84.     0, 0, 2, 0,
  85.     0, 1, 0, -3,
  86.     1, 0, -1, 0
  87.     };
  88. matrix Trans =
  89.     {
  90.     1/6.0,  2/3.0,    1/6.0,   0  ,
  91.     0,      2/3.0,    1/3.0,   0  ,
  92.     0,      1/3.0,    2/3.0,   0  ,
  93.     0,      1/6.0,    2/3.0,   1/6.0
  94.     };
  95. matrix TransT =
  96.     {
  97.     1/6.0, 0, 0, 0,
  98.     2/3.0, 2/3.0, 1/3.0, 1/6.0,
  99.     1/6.0, 1/3.0, 2/3.0, 2/3.0,
  100.     0, 0, 0, 1/6.0
  101.     };
  102. int ok = 1;
  103. double u1,v1,u2,v2;
  104.  
  105. main(argc,argv)
  106. int argc;
  107. char *argv[];
  108.   {
  109.     char s[256];
  110.  
  111.     do
  112.           {
  113.         scanf("%[^\n]s",s);
  114.         getchar();
  115.           }
  116.         while(strncmp(s,"ENDBODY",7) != 0);
  117.  
  118.     printf("# a DRAGON-ENFF-file\n");
  119.     printf("v\n");
  120.     printf("from 0 0 165.5\n");
  121.     printf("at 0 0 0\n");
  122.     printf("up 0 1 0\n");
  123.     printf("angle 30\n");
  124.     printf("hither 1\n");
  125.     printf("resolution 300 300\n");
  126.     printf("b 0.753 0.078 0.361\n");
  127.     printf("l 500 500 500 1 1 1 1\n");
  128.     printf("l 500 500 500 1 1 1 1\n");
  129.     printf("f 1 0.5 0.1 0.75 0.25 20 0 0\n");
  130.     printf("#\n");
  131.  
  132.     while(GetPatch())
  133.       {
  134.         FixPatch();
  135.         PrintPatch();
  136.       };
  137.  
  138.     printf("# end\n");
  139.     exit(0);
  140.   }
  141.  
  142.  
  143. int
  144. GetPatch()
  145.   {
  146.     int i,j,dum;
  147.     char s[256];
  148.  
  149.     do
  150.           {
  151.         dum = scanf("%[^\n]s",s);
  152.         getchar();
  153.           }
  154.         while((strncmp(s,"spline",6) != 0) && (strncmp(s,"end",3) != 0));
  155.     if (strncmp(s,"end",3) == 0) return(0);
  156.  
  157.     for (i=0;i<4;i++)
  158.       for(j =0; j<4; j++)
  159.         scanf("%d %f %f %f",&dum, &(X[i][j]),&(Y[i][j]),&(Z[i][j]));
  160.  
  161.     return(1);
  162.   }
  163.  
  164.  
  165. FixPatch()
  166.   {
  167.     MxMultiply(Trans,X,X);
  168.     MxMultiply(X,TransT,X);
  169.  
  170.     MxMultiply(Trans,Y,Y);
  171.     MxMultiply(Y,TransT,Y);
  172.  
  173.     MxMultiply(Trans,Z,Z);
  174.     MxMultiply(Z,TransT,Z);
  175.   }
  176.  
  177.  
  178. static int patch_no = 1;
  179.  
  180.  
  181. PrintPatch()
  182.   {
  183.     int i,j;
  184.     double du,dv;
  185.  
  186.     printf("# a new Bezier-patch --> no: %d\n",patch_no);
  187.     printf("pb 3 3\n");
  188.     for(i=0;i<4;i++)
  189.       for (j=0;j<4;j++)
  190.         printf("%g %g %g\n",X[i][j],Y[i][j],Z[i][j]); 
  191.  
  192.     patch_no++;
  193.   }
  194.  
  195.