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

GIS编程

开发平台:

Visual C++

  1. /* ==========================================================================
  2.                             DISPLAY_C
  3. =============================================================================
  4.     FUNCTION NAMES
  5.     void paint_muscles  -- displays the muscles.
  6.     void paint_polyline  -- paint the polyline.
  7.     paint_polygons -- display the polygons.
  8.     calculate_polygon_vertex_normal  -- calculate the vertex norms.
  9.     calc_normal  -- calculate a normal.
  10.     C SPECIFICATIONS
  11.     void paint_muscles  ( HEAD *face )
  12.     void paint_polyline  ( HEAD *face )
  13.     paint_polygons       ( HEAD *face, int type, int normals )
  14.     calculate_polygon_vertex_normal  ( HEAD *face ) 
  15.     calc_normal  ( float *p1, float *p2, float *p3, 
  16.                                           float *norm )
  17.     DESCRIPTION
  18.     
  19.     This module is responsible for displaying the face geometry.
  20.     This module comes as is with no warranties.  
  21.     HISTORY
  22. 16-Dec-94  Keith Waters (waters) at DEC's Cambridge Research Lab
  23. Created.
  24. ============================================================================ */
  25. #include <math.h>           /* C header for any math functions               */
  26. #include <stdio.h>          /* C header for standard I/O                     */
  27. #include <string.h>         /* For String compare                            */
  28. #include <stdlib.h>
  29. #ifndef _WIN32
  30. #include <sys/types.h>
  31. #include <sys/file.h>
  32. #endif
  33. #include <GL/glut.h>     /* OpenGl headers      */
  34. #include "head.h"    /* local header for the face              */
  35. void calc_normal ( float *p1, float *p2, float *p3, float *norm );
  36. /* ========================================================================= */  
  37. /* paint_muscles                                                             */
  38. /* ========================================================================= */  
  39. /*
  40. ** Displays the face muscles.
  41. **
  42. */
  43. #define PAINT_MUSCLES_DEBUG 0
  44. void paint_muscles ( HEAD *face )
  45. {
  46.   int i,j;
  47.   float v1[3], v2[3] ;
  48.   glLineWidth   ( 3.0 ) ;
  49.   glColor3f     ( 100.0, 200.0, 200.0 ) ;
  50.     for ( i=0; i<face->nmuscles; i++ ) {
  51.     
  52.       for (j=0; j<3; j++) {
  53.       v1[j] = face->muscle[i]->head[j] ;
  54.       v2[j] = face->muscle[i]->tail[j] ;
  55.     }
  56.       
  57. #if PAINT_MUSCLES_DEBUG
  58.     fprintf (stderr, "head x: %f y: %f z: %fn",   v1[0], v1[1], v1[2] ) ;
  59.     fprintf (stderr, "tail x: %f y: %f z: %fnn", v2[0], v2[1], v2[2] ) ;
  60. #endif
  61.       glBegin ( GL_LINE_STRIP ) ;
  62.       glVertex3f ( v1[0], v1[1], v1[2] ) ;
  63.       glVertex3f ( v2[0], v2[1], v2[2] ) ;
  64.       glEnd ( ) ;
  65.   }
  66.   glLineWidth   ( 1.0 ) ;
  67. }
  68. /* ========================================================================= */  
  69. /* paint_polyline                                                            */
  70. /* ========================================================================= */  
  71. /*
  72. ** Displays the polyline.
  73. **
  74. */
  75. void paint_polyline ( HEAD *face )
  76. {
  77.   int i,j,cnt ;
  78.   float v1[3] ;
  79.   static float r ;
  80.   glClear     ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ) ;
  81.   glLineWidth   ( 1.0 ) ;
  82.   glColor3f     ( 100.0, 100.0, 0.0 ) ;
  83.   
  84.   glPushMatrix  ( ) ;
  85.   glRotatef ( r, 1.0, 1.0, 1.0 ) ;
  86.   glBegin ( GL_LINE_STRIP ) ;
  87.     for (cnt=0, i=0; i<face->npolylinenodes; i++ ) {
  88.     
  89.     for (j=0; j<3; j++, cnt++) 
  90.       v1[j] = face->polyline[cnt] ;
  91. #if PAINT_POLYLINE_DEBUG
  92.     printf ("x: %f y: %f z: %fn", v1[0], v1[1], v1[2] ) ;
  93. #endif
  94.       glVertex3f ( v1[0], v1[1], v1[2] ) ;
  95.   }
  96.   
  97.   glEnd ( ) ;
  98.   glPopMatrix ( ) ;
  99.   glFlush ( ) ;
  100.   
  101. }
  102. /* ========================================================================= */  
  103. /* paint_polygons                                                            */
  104. /* ========================================================================= */  
  105. /*
  106. ** Paints the polygons of the face. 
  107. ** Type indicates if they are to be 
  108. ** drawn         (type=0), 
  109. ** flat shaded   (type=1),
  110. ** smooth shaded (type=2).
  111. */
  112. void paint_polygons ( HEAD *face, int type, int normals )
  113. {
  114.   int    i, j ;
  115.   float  v1[3], v2[3], v3[3] ;
  116.   float  norm1[3], norm2[3], norm3[3] ;
  117.   float  vn1[3], vn2[3], vn3[3] ;
  118.   glLineWidth   ( 2.0 ) ;  
  119.   for (i=0; i<face->npolygons; i++ )
  120.     {
  121.       for (j=0; j<3; j++) {
  122. v1[j] = face->polygon[i]->vertex[0]->xyz[j] ;
  123. v2[j] = face->polygon[i]->vertex[1]->xyz[j] ;
  124. v3[j] = face->polygon[i]->vertex[2]->xyz[j] ;
  125.       }
  126.       if ( type == 0 ) {
  127. for (j=0; j<3; j++) {
  128.   norm1[j] = face->polygon[i]->vertex[0]->norm[j] ;
  129.   norm2[j] = face->polygon[i]->vertex[1]->norm[j] ;
  130.   norm3[j] = face->polygon[i]->vertex[2]->norm[j] ;
  131. }
  132. glBegin ( GL_LINE_LOOP ) ; {
  133.   glNormal3f ( norm1[0], norm1[1], norm1[2] ) ;
  134.   glVertex3f ( v1[0],    v1[1],    v1[2]    ) ;
  135.   glNormal3f ( norm2[0], norm2[1], norm2[2] ) ;
  136.   glVertex3f ( v2[0],    v2[1],    v2[2]    ) ;
  137.   glNormal3f ( norm3[0], norm3[1], norm3[2] ) ;
  138.   glVertex3f ( v3[0],    v3[1],    v3[2]    ) ;
  139. }  glEnd ( ) ;
  140.       } /* end if drawn */
  141.       if ( type == 1 ) {
  142. for (j=0; j<3; j++) {
  143.   norm1[j] = face->polygon[i]->vertex[0]->norm[j] ;
  144.   norm2[j] = face->polygon[i]->vertex[1]->norm[j] ;
  145.   norm3[j] = face->polygon[i]->vertex[2]->norm[j] ;
  146. }
  147. glBegin ( GL_TRIANGLES ) ; {
  148.   glNormal3f ( norm1[0], norm1[1], norm1[2] ) ;
  149.   glVertex3f ( v1[0],    v1[1],    v1[2]    ) ;
  150.   glNormal3f ( norm2[0], norm2[1], norm2[2] ) ;
  151.   glVertex3f ( v2[0],    v2[1],    v2[2]    ) ;
  152.   glNormal3f ( norm3[0], norm3[1], norm3[2] ) ;
  153.   glVertex3f ( v3[0],    v3[1],    v3[2]    ) ;
  154. }  glEnd ( ) ;
  155.       } /* end if drawn */
  156.       else if ( type == 1) {
  157. for (j=0; j<3; j++) {
  158.   norm1[j] = face->polygon[i]->vertex[0]->norm[j] ;
  159.   norm2[j] = face->polygon[i]->vertex[1]->norm[j] ;
  160.   norm3[j] = face->polygon[i]->vertex[2]->norm[j] ;
  161. }
  162.       } /* end if flat */
  163.       else if ( type == 2 ) {
  164. averaged_vertex_normals ( face, i, norm1, norm2, norm3 ) ;
  165.       } /* end if smoothed */
  166.       if ( type ) {
  167. glBegin ( GL_TRIANGLES ) ; {
  168.   glNormal3f ( norm1[0], norm1[1], norm1[2] ) ;
  169.   glVertex3f ( v1[0],    v1[1],    v1[2]    ) ;
  170.   glNormal3f ( norm2[0], norm2[1], norm2[2] ) ;
  171.   glVertex3f ( v2[0],    v2[1],    v2[2]    ) ;
  172.   glNormal3f ( norm3[0], norm3[1], norm3[2] ) ;
  173.   glVertex3f ( v3[0],    v3[1],    v3[2]    ) ;
  174. }  glEnd ( ) ;
  175.       } /* endif painted */
  176.       if ( normals ) {
  177. for (j=0; j<3; j++) {
  178.   vn1[j] = face->polygon[i]->vertex[0]->xyz[j] + norm1[j] ;
  179.   vn2[j] = face->polygon[i]->vertex[1]->xyz[j] + norm2[j] ;
  180.   vn3[j] = face->polygon[i]->vertex[2]->xyz[j] + norm3[j] ;
  181. }
  182. glBegin ( GL_LINE_STRIP ) ; {
  183.   glVertex3f ( v1[0],    v1[1],    v1[2]     ) ;
  184.   glVertex3f ( vn1[0],  vn1[1],    vn1[2]    ) ;
  185. }  glEnd ( ) ;
  186. glBegin ( GL_LINES ) ; {
  187.   glVertex3f ( v2[0],    v2[1],    v2[2]     ) ;
  188.   glVertex3f ( vn2[0],  vn2[1],    vn2[2]    ) ;
  189. }  glEnd ( ) ;
  190. glBegin ( GL_LINES ) ; {
  191.   glVertex3f ( v3[0],    v3[1],    v3[2]     ) ;
  192.   glVertex3f ( vn3[0],  vn3[1],    vn3[2]    ) ;
  193. }  glEnd ( ) ;
  194.       }
  195.     }
  196.   glLineWidth   ( 1.0 ) ;  
  197. /* ========================================================================= */  
  198. /* calculate_polygon_vertex_normal.      */
  199. /* ========================================================================= */
  200. /*
  201. ** As it says.
  202. */
  203. void
  204. calculate_polygon_vertex_normal ( HEAD *face ) 
  205. {
  206.   int i,j,k ;
  207.   float p1[3], p2[3], p3[3] ;
  208.   float norm[3] ;
  209.   for (i=0; i<face->npolygons; i++ )
  210.     {
  211.       for (j=0; j<3; j++) 
  212. p1[j] = face->polygon[i]->vertex[0]->xyz[j] ;
  213.       for (j=0; j<3; j++) 
  214. p2[j] = face->polygon[i]->vertex[1]->xyz[j] ;
  215.       for (j=0; j<3; j++) 
  216. p3[j] = face->polygon[i]->vertex[2]->xyz[j] ;
  217.       calc_normal ( p1, p2, p3, norm ) ;
  218.       for (j=0; j<3; j++) 
  219. for (k=0; k<3; k++)
  220.   face->polygon[i]->vertex[j]->norm[k] = norm[k] ;
  221.     }
  222. }
  223. /* ========================================================================= */  
  224. /* calc_normal.            */
  225. /* ========================================================================= */
  226. /*
  227. ** Calculates the normal vector from three vertices.
  228. */
  229. void
  230. calc_normal ( float *p1, float *p2, float *p3, float *norm )
  231. {
  232.   float coa, cob, coc ;
  233.   float px1, py1, pz1 ;
  234.   float px2, py2, pz2 ;
  235.   float px3, py3, pz3 ;
  236.   
  237.   float absvec ;
  238.   
  239.   px1 = p1[0] ;
  240.   py1 = p1[1] ;
  241.   pz1 = p1[2] ;
  242.   
  243.   px2 = p2[0] ;
  244.   py2 = p2[1] ;
  245.   pz2 = p2[2] ;
  246.   
  247.   px3 = p3[0] ;
  248.   py3 = p3[1] ;
  249.   pz3 = p3[2] ;
  250.   
  251.   coa = -(py1 * (pz2-pz3) + py2*(pz3-pz1) + py3*(pz1-pz2)) ;
  252.   cob = -(pz1 * (px2-px3) + pz2*(px3-px1) + pz3*(px1-px2)) ;
  253.   coc = -(px1 * (py2-py3) + px2*(py3-py1) + px3*(py1-py2)) ;
  254.   
  255.   absvec = sqrt ((double) ((coa*coa) + (cob*cob) + (coc*coc))) ;
  256.   
  257.   norm[0] = coa/absvec ;
  258.   norm[1] = cob/absvec ;
  259.   norm[2] = coc/absvec ;
  260. }