make_face.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:14k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /* ==========================================================================
  2.                           MAKE_FACE_C
  3. =============================================================================
  4.     FUNCTION NAMES
  5.     face_reset -- reset the face to neutral.
  6.     create_face                 -- creates the face data
  7.     create_face -- returns a pointer to the head datastructure.
  8.     make_face -- makes a face from the two input files.
  9.     add_polygon_to_face -- adds a polygon to the face data structure.
  10.     reflect_polygon  -- reflect a polygon in the Y axis.
  11.     void averaged_vertex_normals - compute the average vertex normals.
  12.     data_struct  -- create the datastructure for the face.
  13.     C SPECIFICATIONS
  14.     void face_reset  ( HEAD *face )
  15.     HEAD *create_face  ( char *f1, char *f2 )
  16.     HEAD *create_face  ( f1, f2 )
  17.     make_face  ( HEAD *face ) 
  18.     add_polygon_to_face ( POLYGON *p, HEAD *face )
  19.     reflect_polygon  ( POLYGON *poly, HEAD *face ) 
  20.     void averaged_vertex_normals ( HEAD *face, int p, 
  21.                                    float *n1, float *n2, float *n3 ) 
  22.     data_struct  ( HEAD *face )
  23.     DESCRIPTION
  24. This module is where the face data structures are created.
  25. T his module comes as is with no warranties.  
  26.     HISTORY
  27. 16-Dec-94  Keith Waters (waters) at DEC's Cambridge Research Lab
  28. Created.
  29. Modified 22-Nov-96 Sing Bing Kang (sbk@crl.dec.com)
  30.   Added function expressions() to enable changing facial expression
  31. ============================================================================ */
  32. #include <math.h>           /* C header for any math functions               */
  33. #include <stdio.h>          /* C header for standard I/O                     */
  34. #include <string.h>         /* For String compare                            */
  35. #include <stdlib.h>
  36. #ifndef _WIN32
  37. #include <sys/types.h>
  38. #include <sys/file.h>
  39. #endif
  40. #include "memory.h"         /* Local memory allocation macros                */
  41. #include "head.h"     /* local header for the face      */
  42. void reflect_polygon ( POLYGON *poly, HEAD *face );
  43. void add_polygon_to_face ( POLYGON *p, HEAD *face );
  44. void make_face ( HEAD *face );
  45. /* ========================================================================= */  
  46. /* face_reset                                                              */
  47. /* ========================================================================= */  
  48. /*
  49. ** Resets the geometry of the face to neutral.
  50. **
  51. */
  52. void face_reset ( HEAD *face )
  53. {
  54.   int i,j,k ;
  55.   
  56.   for ( i=0; i<face->npolygons; i++ ) {
  57.     for ( j=0; j<3; j++ ) {
  58.       for ( k=0; k<3; k++ ) {
  59. face->polygon[i]->vertex[j]->xyz[k] = 
  60.   face->polygon[i]->vertex[j]->nxyz[k] ;
  61.       }
  62.     }
  63.   }
  64. }
  65. /* ========================================================================= 
  66.    expressions                                                            
  67.    Written by: Sing Bing Kang
  68.    Date: 11/22/96
  69.    ========================================================================= */  
  70. /*
  71. ** Produces the facial expressions as indicated by the muscle contraction
  72. ** vector
  73. **
  74. */
  75. void
  76. expressions ( HEAD *face, int e )
  77. {
  78.     int m;
  79.     fprintf( stderr, "Expression: %sn", face->expression[e]->name );
  80.     for (m=0; m<face->nmuscles; m++) {
  81. float m_val = face->expression[e]->m[m],
  82.               m_diff = m_val - face->muscle[m]->mstat;
  83. face->muscle[m]->mstat = m_val;
  84.         activate_muscle ( face,
  85.                          face->muscle[m]->head,
  86.                          face->muscle[m]->tail,
  87.                          face->muscle[m]->fs,
  88.                          face->muscle[m]->fe,
  89.                          face->muscle[m]->zone,
  90.                          m_diff ) ;
  91.     }
  92. }
  93. /* ========================================================================= */  
  94. /* create_face                                                              */
  95. /* ========================================================================= */  
  96. /*
  97. ** create the default structures for the face and retrun a pointer.
  98. **
  99. */
  100. HEAD *create_face ( char *f1, char *f2 )
  101. {
  102.   HEAD *h ;
  103.   
  104.   h = _new ( HEAD ) ;
  105.   
  106.   h->npolygons = 0 ;
  107.   h->npindices = 0 ;
  108.   h->npolylinenodes = 0 ;
  109.   h->nmuscles = 0 ;
  110.   read_polygon_indices ( f1, h ) ;
  111.   read_polygon_line    ( f2, h ) ;
  112.   make_face ( h ) ;
  113.   
  114.   return ( h ) ;
  115. }
  116. /* ========================================================================= */  
  117. /* make_face                                                                 */
  118. /* ========================================================================= */  
  119. /*
  120. ** makes the face from the two input files.
  121. **
  122. */
  123. void
  124. make_face ( HEAD *face ) 
  125. {
  126.   POLYGON  *p ;
  127.   int i, ii, j, k,
  128.       p1, p2, p3, p4 ;
  129.   int parray[4] ;
  130.   for ( i=0, ii=0; i < face->npindices; i++,ii+=4 ) {
  131.     p1 = face->indexlist[ii]   -1 ;
  132.     p2 = face->indexlist[ii+1] -1 ;
  133.     p3 = face->indexlist[ii+2] -1 ;
  134.     p4 = face->indexlist[ii+3] -1 ;
  135.     for (j=0; j<4; j++)
  136.       parray[j] = face->indexlist[ii+j] -1;
  137.     if ( p1 == 999 ) {
  138.       p = _new ( POLYGON ) ;
  139.       for (j=0; j<3; j++) {
  140. p->vertex[j] = _new ( VERTEX ) ;
  141. p->vertex[j]->np = 0 ;
  142.       }
  143.       for (j=0; j<3; j++) 
  144. p->vertex[0]->nxyz[j] = 
  145. p->vertex[0]->xyz[j]  = face->polyline[ p2*3 + j ] ;
  146.       
  147.       for (j=0; j<3; j++) 
  148. p->vertex[1]->nxyz[j] = 
  149.         p->vertex[1]->xyz[j]  = face->polyline[ p3*3 + j ] ;
  150.       
  151.       for (j=0; j<3; j++) 
  152. p->vertex[2]->nxyz[j] = 
  153.         p->vertex[2]->xyz[j]  = face->polyline[ p4*3 + j ] ;
  154.       add_polygon_to_face ( p, face ) ;
  155.       reflect_polygon     ( p, face ) ;
  156.     }
  157.     else {
  158.       p = _new ( POLYGON ) ;
  159.       for (j=0; j<3; j++) {
  160. p->vertex[j] = _new ( VERTEX ) ;
  161. p->vertex[j]->np = 0 ;
  162.       }
  163.       for (k=0; k<3; k++) {
  164. for (j=0; j<3; j++) 
  165.   p->vertex[k]->nxyz[j] =
  166.   p->vertex[k]->xyz[j]  = face->polyline[ parray[k]*3 + j ] ;
  167.       }
  168.       add_polygon_to_face ( p, face ) ;
  169.       reflect_polygon     ( p, face ) ;
  170.       p = _new ( POLYGON ) ;
  171.       for (j=0; j<3; j++) {
  172. p->vertex[j] = _new ( VERTEX ) ;
  173. p->vertex[j]->np = 0 ;
  174.       }
  175.       for (j=0; j<3; j++) 
  176. p->vertex[0]->nxyz[j] = 
  177. p->vertex[0]->xyz[j]  = face->polyline[ p1*3 + j ] ;
  178.       
  179.       for (j=0; j<3; j++) 
  180. p->vertex[1]->nxyz[j] =
  181. p->vertex[1]->xyz[j]  = face->polyline[ p3*3 + j ] ;
  182.       
  183.       for (j=0; j<3; j++) 
  184. p->vertex[2]->nxyz[j] = 
  185. p->vertex[2]->xyz[j]  = face->polyline[ p4*3 + j ] ;
  186.       add_polygon_to_face ( p, face ) ;
  187.       reflect_polygon     ( p, face ) ;
  188.       }
  189.   }
  190. }
  191. /* ========================================================================= */  
  192. /* add_polygon_to_face                                                       */
  193. /* ========================================================================= */  
  194. /*
  195. ** add a polygon to the face structure.
  196. **
  197. */
  198. void
  199. add_polygon_to_face ( POLYGON *p, HEAD *face )
  200. {
  201.   int nn ;
  202.   if(face->npolygons == 0)
  203.       face->polygon = _new_array(POLYGON *, 500) ;
  204.   else if(face->npolygons % 500 == 0)
  205.       face->polygon = _resize_array(face->polygon,POLYGON *,face->npolygons+500) ;
  206.   nn = face->npolygons ;
  207.   face->polygon[nn] = p ;
  208.   face->npolygons++ ;
  209. }
  210. /* ========================================================================= */  
  211. /* reflect_polygon                                                           */
  212. /* ========================================================================= */  
  213. /*
  214. **  Reflects all the polygons in the half-face and adds them to
  215. **  the data structure.
  216. **
  217. */
  218. void
  219. reflect_polygon ( POLYGON *poly, HEAD *face ) 
  220. {
  221.   POLYGON *newp ;
  222.   float   temp[3] ;
  223.   int      i, j ;
  224.   
  225.   /* 
  226.    * Allocate memory for the new polygon. 
  227.   */
  228.   newp = _new ( POLYGON ) ;
  229.   for (j=0; j<3; j++) {
  230.     newp->vertex[j] = _new ( VERTEX ) ;
  231.     newp->vertex[j]->np = 0 ;
  232.   }
  233.   /* 
  234.    * Load the old polygon values. 
  235.   */
  236.   for (i=0; i<3; i++) 
  237.     for (j=0; j<3; j++)
  238.       newp->vertex[i]->nxyz[j] = 
  239.       newp->vertex[i]->xyz[j]  = poly->vertex[i]->xyz[j] ;
  240.   /* 
  241.    * flip the X component.         
  242.   */
  243.   for (i=0; i<3; i++) 
  244.     newp->vertex[i]->nxyz[0] = 
  245.     newp->vertex[i]->xyz[0]  = -newp->vertex[i]->xyz[0] ;
  246.   
  247.   /* 
  248.    * Re-order the vertices, flip 0 and 1.
  249.   */
  250.   for (j=0; j<3; j++)
  251.     temp[j] = newp->vertex[0]->xyz[j] ;
  252.   for (j=0; j<3; j++)
  253.     newp->vertex[0]->nxyz[j] = 
  254.     newp->vertex[0]->xyz[j]  = newp->vertex[1]->xyz[j];
  255.   for (j=0; j<3; j++)
  256.     newp->vertex[1]->nxyz[j] = 
  257.     newp->vertex[1]->xyz[j]  = temp[j] ;
  258.   add_polygon_to_face ( newp, face ) ;
  259. }
  260. /* ========================================================================= */  
  261. /* averaged_vertex_normals                                                   */
  262. /* ========================================================================= */  
  263. /*
  264. ** Caculates the averaged polygon normal.
  265. */
  266. void averaged_vertex_normals ( HEAD *face, int p, float *n1, float *n2, float *n3 ) 
  267. {
  268.   int i,j,np, pt ;
  269.   float norm[3] ;
  270.   for (i=0; i<3; i++)
  271.     norm[i] = 0.0 ;
  272.   np = face->polygon[p]->vertex[0]->np ;
  273.   for ( i=0; i<np; i++) {
  274.     pt = face->polygon[p]->vertex[0]->plist[i] ;
  275.     for ( j=0; j<3; j++)  {
  276.       norm[j] += face->polygon[pt]->vertex[0]->norm[j] ;
  277.     }
  278.   }
  279.   for (i=0; i<3; i++)
  280.     norm[i] = norm[i] / (float)np ;
  281.     
  282.   for (i=0; i<3; i++)
  283.     n1[i] = norm[i] ;
  284.   for (i=0; i<3; i++)
  285.     norm[i] = 0.0 ;
  286.   np = face->polygon[p]->vertex[1]->np ;
  287.   for ( i=0; i<np; i++) {
  288.     pt = face->polygon[p]->vertex[1]->plist[i] ;
  289.     for ( j=0; j<3; j++) {
  290.       norm[j] += face->polygon[pt]->vertex[1]->norm[j] ;
  291.     }
  292.   }
  293.   for (i=0; i<3; i++)
  294.     norm[i] = norm[i] / (float) np ;
  295.   for (i=0; i<3; i++)
  296.     n2[i] = norm[i] ;
  297.   for (i=0; i<3; i++)
  298.     norm[i] = 0.0 ;
  299.   np = face->polygon[p]->vertex[2]->np ;
  300.   for ( i=0; i<np; i++) {
  301.     pt = face->polygon[p]->vertex[2]->plist[i] ;
  302.     for ( j=0; j<3; j++) {
  303.       norm[j] += face->polygon[pt]->vertex[2]->norm[j] ;
  304.     }
  305.   }
  306.   for (i=0; i<3; i++)
  307.     norm[i] = norm[i]/ (float) np ;
  308.     
  309.   for (i=0; i<3; i++)
  310.     n3[i] = norm[i] ;
  311.    
  312. }
  313. /* ========================================================================= */  
  314. /* data_struct                                                              */
  315. /* ========================================================================= */  
  316. /*
  317. ** Create a new data structure for the polygons.
  318. **
  319. */
  320. #define DATA_STRUCT_DEBUG 0
  321. void
  322. data_struct ( HEAD *face )
  323. {
  324.   int i,j, n ;
  325.   int flag, cptr ;
  326.   float x1,y1,z1, x2, y2, z2, x3, y3, z3 ;
  327.   float tx1, ty1, tz1, tx2, ty2, tz2, tx3, ty3, tz3 ;
  328.   for (i=0; i<face->npolygons; i++ ){
  329.       x1 = face->polygon[i]->vertex[0]->xyz[0] ;
  330.       y1 = face->polygon[i]->vertex[0]->xyz[1] ;
  331.       z1 = face->polygon[i]->vertex[0]->xyz[2] ;
  332.       x2 = face->polygon[i]->vertex[1]->xyz[0] ;
  333.       y2 = face->polygon[i]->vertex[1]->xyz[1] ;
  334.       z2 = face->polygon[i]->vertex[1]->xyz[2] ;
  335.       x3 = face->polygon[i]->vertex[2]->xyz[0] ;
  336.       y3 = face->polygon[i]->vertex[2]->xyz[1] ;
  337.       z3 = face->polygon[i]->vertex[2]->xyz[2] ;
  338. #if DATA_STRUCT_DEBUG
  339.       fprintf (stderr,"BASE polygon: %dn", i) ;
  340.       fprintf (stderr,"x1: %f y1: %f z1: %fn", x1,y1,z1) ;
  341.       fprintf (stderr,"x1: %f y1: %f z1: %fn", x2,y2,z2) ;
  342.       fprintf (stderr,"x1: %f y1: %f z1: %fn", x3,y3,z3) ;
  343. #endif
  344.       j    = 0 ;
  345.       flag = 0 ;
  346.       while ( !flag  &&
  347.       j<face->npolygons ) {
  348. tx1 = face->polygon[j]->vertex[0]->xyz[0] ;
  349. ty1 = face->polygon[j]->vertex[0]->xyz[1] ;
  350. tz1 = face->polygon[j]->vertex[0]->xyz[2] ;
  351. tx2 = face->polygon[j]->vertex[1]->xyz[0] ;
  352. ty2 = face->polygon[j]->vertex[1]->xyz[1] ;
  353. tz2 = face->polygon[j]->vertex[1]->xyz[2] ;
  354. tx3 = face->polygon[j]->vertex[2]->xyz[0] ;
  355. ty3 = face->polygon[j]->vertex[2]->xyz[1] ;
  356. tz3 = face->polygon[j]->vertex[2]->xyz[2] ;
  357. #if DATA_STRUCT_DEBUG
  358. fprintf (stderr, "COMPARED TO polygon: %dn", j) ;
  359. fprintf (stderr,"tx1: %f ty1: %f tz1: %fn", tx1,ty1,tz1) ;
  360. fprintf (stderr,"tx1: %f ty1: %f tz1: %fn", tx2,ty2,tz2) ;
  361. fprintf (stderr,"tx1: %f ty1: %f tz1: %fn", tx3,ty3,tz3) ;
  362. #endif
  363. if ( (x1 == tx1 && y1 == ty1 && z1 == tz1) ||
  364.      (x1 == tx2 && y1 == ty2 && z1 == tz2) ||
  365.      (x1 == tx3 && y1 == ty3 && z1 == tz3)) {
  366.   cptr = j ;
  367. #if DATA_STRUCT_DEBUG
  368.   fprintf (stderr,"found a vertex match on polygon: %d and %dn", i,j);
  369. #endif
  370.   n = face->polygon[i]->vertex[0]->np ;
  371.   face->polygon[i]->vertex[0]->plist[n] = cptr ;
  372.   face->polygon[i]->vertex[0]->np++ ;
  373. #if DATA_STRUCT_DEBUG
  374.   fprintf (stderr,"loaded: %d onto polygon: %d vertex[0]n", cptr, i) ;
  375.   fprintf (stderr,"total on vertex: %dn", face->polygon[i]->vertex[0]->np);
  376. #endif
  377. }
  378. j++ ;
  379.       } /* end while */
  380.       j    = 0 ;
  381.       flag = 0 ;
  382.       while ( !flag  &&
  383.       j<face->npolygons ) {
  384. tx1 = face->polygon[j]->vertex[0]->xyz[0] ;
  385. ty1 = face->polygon[j]->vertex[0]->xyz[1] ;
  386. tz1 = face->polygon[j]->vertex[0]->xyz[2] ;
  387. tx2 = face->polygon[j]->vertex[1]->xyz[0] ;
  388. ty2 = face->polygon[j]->vertex[1]->xyz[1] ;
  389. tz2 = face->polygon[j]->vertex[1]->xyz[2] ;
  390. tx3 = face->polygon[j]->vertex[2]->xyz[0] ;
  391. ty3 = face->polygon[j]->vertex[2]->xyz[1] ;
  392. tz3 = face->polygon[j]->vertex[2]->xyz[2] ;
  393. if ( (x2 == tx1 && y2 == ty1 && z2 == tz1) ||
  394.      (x2 == tx2 && y2 == ty2 && z2 == tz2) ||
  395.      (x2 == tx3 && y2 == ty3 && z2 == tz3)) {
  396.   cptr = j ;
  397.   n = face->polygon[i]->vertex[1]->np ;
  398.   face->polygon[i]->vertex[1]->plist[n] = j ;
  399.   face->polygon[i]->vertex[1]->np++ ;
  400. }
  401. j++ ;
  402.       } /* end while */
  403.       j    = 0 ;
  404.       flag = 0 ;
  405.       while ( !flag  &&
  406.       j<face->npolygons ) {
  407. tx1 = face->polygon[j]->vertex[0]->xyz[0] ;
  408. ty1 = face->polygon[j]->vertex[0]->xyz[1] ;
  409. tz1 = face->polygon[j]->vertex[0]->xyz[2] ;
  410. tx2 = face->polygon[j]->vertex[1]->xyz[0] ;
  411. ty2 = face->polygon[j]->vertex[1]->xyz[1] ;
  412. tz2 = face->polygon[j]->vertex[1]->xyz[2] ;
  413. tx3 = face->polygon[j]->vertex[2]->xyz[0] ;
  414. ty3 = face->polygon[j]->vertex[2]->xyz[1] ;
  415. tz3 = face->polygon[j]->vertex[2]->xyz[2] ;
  416. if ( x3 == tx1 &&  y3 == ty1 &&  z3 == tz1 ||
  417.      x3 == tx2 &&  y3 == ty2 &&  z3 == tz2 ||
  418.      x3 == tx3 &&  y3 == ty3 &&  z3 == tz3) {
  419.   cptr = j ;
  420.   n = face->polygon[i]->vertex[2]->np ;
  421.   face->polygon[i]->vertex[2]->plist[n] = cptr ;
  422.   face->polygon[i]->vertex[2]->np++ ;
  423. }
  424. j++ ;
  425.       } /* end while */
  426.     } /* end for i */
  427. }