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

GIS编程

开发平台:

Visual C++

  1. /* 
  2.  * transport.c
  3.  * 
  4.  * FUNCTION:
  5.  * Illustrate principle of shearing vs. parallel transport.
  6.  *
  7.  * HISTORY:
  8.  * -- created by Linas Vepstas October 1991
  9.  * -- C++ and OO playing around Linas Vepstas June 1993
  10.  * -- converted to use GLUT -- December 1995, Linas
  11.  *
  12.  */
  13. /* required include files */
  14. #include <stdlib.h>
  15. #include <math.h>
  16. #include <GL/glut.h>
  17. #include <GL/tube.h>
  18. /* =========================================================== */
  19. #define SET_RGB(rgb,r,g,b) {
  20. rgb[0]=r; rgb[1]=g; rgb[2]=b;
  21. typedef struct _material {
  22.    /* public data areas */
  23.    float emission[3];
  24.    float ambient[3];  
  25.    float diffuse[3];  
  26.    float specular[3]; 
  27.    float shininess;
  28. } Material;
  29. #define SET_EMIS(self,r,g,b) { SET_RGB(self->emission, r,g,b); }
  30. #define SET_AMB(self,r,g,b) { SET_RGB(self->ambient, r,g,b); }
  31. #define SET_DIFF(self,r,g,b) { SET_RGB(self->diffuse, r,g,b); }
  32. #define SET_SPEC(self,r,g,b) { SET_RGB(self->specular, r,g,b); }
  33. /* =========================================================== */
  34. #ifdef NOTNOW
  35. class goPolyline {
  36.    public:
  37.       int dimension;
  38.       int numPoints;
  39.       double * pts;
  40.    private:
  41.       int  nfree;
  42.    public:
  43.       goPolyline (); // by default, construct 3D polyline
  44.       goPolyline (int);            // construct arbitrary dimension polyline
  45.       void Print ();
  46.       void AddPoint (double x, double y);
  47.       void AddNormal (double x, double y);
  48.       void MakeFacetNormal ();
  49. };
  50. #endif /* NOTNOW */
  51. typedef double SVec[2];
  52. typedef struct contour {
  53.    /* public data areas */
  54.    int numContourPoints;
  55.    int numContourNorms;
  56.    SVec * pts;
  57.    SVec * norms;
  58.    double up[3];
  59. } Contour;
  60. #define pfree numContourPoints
  61. #define nfree numContourNorms
  62. #define NEW_CONTOUR(self) {
  63.    self -> pts = (SVec *) malloc (100*sizeof (double));
  64.    self -> norms = (SVec *) malloc (100*sizeof (double));
  65.    self -> pfree = 0;
  66.    self -> nfree = 0;
  67. }
  68. #define ADD_POINT(self,x,y) { 
  69.    self -> pts[self->pfree][0] = x;
  70.    self -> pts[self->pfree][1] = y;
  71.    self->pfree ++;
  72. }
  73. #define ADD_NORMAL(self,x,y) { 
  74.    self -> norms[self->nfree][0] = x;
  75.    self -> norms[self->nfree][1] = y;
  76.    self->nfree ++;
  77. }
  78. #define MAKE_NORMAL(self) {
  79.    float dx, dy, w;
  80.    dx = self -> pts [self->pfree -1][0];
  81.    dx -= self -> pts [self->pfree -2][0];
  82.    dy = self -> pts [self->pfree -1][1];
  83.    dy -= self -> pts [self->pfree -2][1];
  84.    w = 1.0 / sqrt (dx*dx+dy*dy);
  85.    dx *= w;
  86.    dy *= w;
  87.    self -> norms[self->nfree][0] = -dy;
  88.    self -> norms[self->nfree][1] = dx;
  89.    self -> nfree ++;
  90. }
  91. /* =========================================================== */
  92. /* class gleExtrustion */
  93. typedef struct _extrusion {
  94.    Material *material; /* material description */
  95.    Contour  *contour; /* 2D contour */
  96.    double radius; /* for polycylinder, torus */
  97.    double startRadius;     /* spiral starts in x-y plane */
  98.    double drdTheta;        /* change in radius per revolution */
  99.    double startZ;          /* starting z value */
  100.    double dzdTheta;        /* change in Z per revolution */
  101.    double startXform[2][3]; /* starting contour affine xform */
  102.    double dXdTheta[2][3]; /* tangent change xform per revoln */
  103.    double startTheta;      /* start angle in x-y plane */
  104.    double sweepTheta;     /* degrees to spiral around */
  105. } Extrusion;
  106. #define  NEW_EXTRUSION(self) {
  107.    self -> material = (Material *) malloc (sizeof (Material));
  108.    self -> contour = (Contour *) malloc (sizeof (Contour));
  109.    NEW_CONTOUR (self->contour);
  110. }
  111. /* =========================================================== */
  112. Extrusion *arrow = NULL;
  113. /* =========================================================== */
  114. float lastx=0;
  115. float lasty=0;
  116. void draw_arrow (void) {
  117.    /* attach the mouse */
  118.    arrow->sweepTheta = 180.0 + 0.13* lastx;
  119.    arrow->dzdTheta = 0.03 * (lasty+10.0);
  120.    glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT, arrow->material->ambient);
  121.    glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, arrow->material->diffuse);
  122.    glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, arrow->material->specular);
  123.    glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, 2.0);
  124. #ifdef IBM_GL_32
  125.    rotate (-750, 'x');
  126.    rotate (-100, 'z');
  127.    /* first, draw with the routine that uses a local coordinate 
  128.     * system with torsion */
  129.    translate (-0.5, -0.5, 3.2);
  130.    lathe (arrow->contour->numContourPoints,
  131.            arrow->contour->pts,
  132.            arrow->contour->norms,
  133.            arrow->contour->up,
  134.            arrow->startRadius,    /* donut radius */
  135.            arrow->drdTheta,   /* change in donut radius per revolution */
  136.            arrow->startZ,    /* start z value */
  137.            arrow->dzdTheta,     /* change in Z per revolution */
  138.            NULL,
  139.            NULL,
  140.            arrow->startTheta,     /* start angle */
  141.            arrow->sweepTheta);     /* sweep angle */
  142.    draw_axes ();
  143.    /* next, draw with a routine that uses parallel transport */
  144.    translate (0.0, 0.0, -5.4);
  145.    lmbind (MATERIAL, 88);
  146.    cpack (0x339999);
  147.    spiral (arrow->contour->numContourPoints,
  148.            arrow->contour->pts,
  149.            arrow->contour->norms,
  150.            arrow->contour->up,
  151.            arrow->startRadius,    /* donut radius */
  152.            arrow->drdTheta,   /* change in donut radius per revolution */
  153.            arrow->startZ,    /* start z value */
  154.            arrow->dzdTheta,     /* change in Z per revolution */
  155.            NULL,
  156.            NULL,
  157.            arrow->startTheta,     /* start angle */
  158.            arrow->sweepTheta);     /* sweep angle */
  159. #endif 
  160. #define OPENGL_10
  161. #ifdef OPENGL_10
  162.    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  163.    /* set up some matrices so that the object spins with the mouse */
  164.    glPushMatrix ();
  165.    glTranslatef (0.0, 0.0, -80.0);
  166.    glRotated (-75.0, 1.0, 0.0, 0.0);
  167.    glRotated (-10.0, 0.0, 0.0, 1.0);
  168.    /* first, draw with the routine that uses a local coordinate 
  169.     * system with torsion */
  170.    glTranslated (-0.5, -0.5, 4.2);
  171.    gleLathe (arrow->contour->numContourPoints,
  172.            arrow->contour->pts,
  173.            arrow->contour->norms,
  174.            arrow->contour->up,
  175.            arrow->startRadius,    /* donut radius */
  176.            arrow->drdTheta,   /* change in donut radius per revolution */
  177.            arrow->startZ,    /* start z value */
  178.            arrow->dzdTheta,     /* change in Z per revolution */
  179.            NULL,
  180.            NULL,
  181.            arrow->startTheta,     /* start angle */
  182.            arrow->sweepTheta);     /* sweep angle */
  183.    /* next, draw with a routine that uses parallel transport */
  184.    glTranslated (0.0, 0.0, -8.4);
  185. /*
  186.    lmbind (MATERIAL, 88);
  187.    cpack (0x339999);
  188. */
  189.    gleSpiral (arrow->contour->numContourPoints,
  190.            arrow->contour->pts,
  191.            arrow->contour->norms,
  192.            arrow->contour->up,
  193.            arrow->startRadius,    /* donut radius */
  194.            arrow->drdTheta,   /* change in donut radius per revolution */
  195.            arrow->startZ,    /* start z value */
  196.            arrow->dzdTheta,     /* change in Z per revolution */
  197.            NULL,
  198.            NULL,
  199.            arrow->startTheta,     /* start angle */
  200.            arrow->sweepTheta);     /* sweep angle */
  201.    glPopMatrix ();
  202.    glutSwapBuffers ();
  203. #endif 
  204. }
  205. /* =========================================================== */
  206. #define SCALE 1.80
  207. #define PT(x,y) { ADD_POINT (arrow->contour, SCALE*x, SCALE*y); }
  208. #define NORM(x,y) { ADD_NORMAL (arrow->contour, x, y); }
  209. #define FACET { MAKE_NORMAL (arrow->contour); }
  210. /* =========================================================== */
  211. void init_arrow (void)
  212. {
  213.    int style;
  214.    arrow = (Extrusion *) malloc (sizeof (Extrusion));
  215.    NEW_EXTRUSION (arrow);
  216.    /* define color of arrow */
  217.    SET_AMB (arrow->material, 0.15, 0.15, 0.15);
  218.    SET_DIFF (arrow->material, 0.15, 0.55, 0.55);
  219.    SET_SPEC (arrow->material, 0.4, 0.4, 0.4);
  220.    /* define lathe/spiral parameters */
  221.    arrow -> startRadius = 7.3;
  222.    arrow -> drdTheta = 0.0;
  223.    arrow -> startZ = 0.0;
  224.    arrow -> dzdTheta = 0.0;
  225.    arrow -> startTheta = 0.0;
  226.    arrow -> sweepTheta = 90.0;
  227.    /* define arrow contour */
  228.    PT (-1.0, -2.0); 
  229.    PT (-1.0, 0.0); FACET; 
  230.    PT (-2.0, 0.0); FACET;
  231.    PT (0.0, 2.0); FACET;
  232.    PT (2.0, 0.0); FACET;
  233.    PT (1.0, 0.0); FACET;
  234.    PT (1.0, -2.0); FACET;
  235.    /* define contour up vector */
  236.    arrow->contour->up[0] = 0.0;
  237.    arrow->contour->up[1] = 0.0;
  238.    arrow->contour->up[2] = 1.0;
  239.    /* set the initial join style */
  240.    style = 0x0;
  241.    style |= TUBE_JN_CAP;
  242.    style |= TUBE_NORM_PATH_EDGE;
  243.    style |= TUBE_NORM_FACET;
  244.    style |= TUBE_CONTOUR_CLOSED;
  245.    gleSetJoinStyle (style);
  246. }
  247. /* =========================================================== */
  248. /* get notified of mouse motions */
  249. void MouseMotion (int x, int y)
  250. {
  251.    lastx = x;
  252.    lasty = y;
  253.    glutPostRedisplay ();
  254. }
  255. /* ARGSUSED */
  256. void JoinStyle (int msg) 
  257. {
  258.    exit (0);
  259. }
  260. /* set up a light */
  261. GLfloat lightOnePosition[] = {40.0, 40, 100.0, 0.0};
  262. GLfloat lightOneColor[] = {0.54, 0.54, 0.54, 1.0}; 
  263. GLfloat lightTwoPosition[] = {-40.0, 40, 100.0, 0.0};
  264. GLfloat lightTwoColor[] = {0.54, 0.54, 0.54, 1.0}; 
  265. GLfloat lightThreePosition[] = {40.0, 40, -100.0, 0.0};
  266. GLfloat lightThreeColor[] = {0.54, 0.54, 0.54, 1.0}; 
  267. int
  268. main (int argc, char * argv[]) {
  269.    /* initialize glut */
  270.    glutInit (&argc, argv);
  271.    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  272.    glutCreateWindow ("transport");
  273.    glutDisplayFunc (draw_arrow);
  274.    glutMotionFunc (MouseMotion);
  275.    /* create popup menu */
  276.    glutCreateMenu (JoinStyle);
  277.    glutAddMenuEntry ("Exit", 99);
  278.    glutAttachMenu (GLUT_MIDDLE_BUTTON);
  279.    /* initialize GL */
  280.    glClearDepth (1.0);
  281.    glEnable (GL_DEPTH_TEST);
  282.    glClearColor (0.0, 0.0, 0.0, 0.0);
  283.    glShadeModel (GL_SMOOTH);
  284.    glMatrixMode (GL_PROJECTION);
  285.    /* roughly, measured in centimeters */
  286.    glFrustum (-9.0, 9.0, -9.0, 9.0, 50.0, 150.0);
  287.    glMatrixMode(GL_MODELVIEW);
  288.    /* initialize lighting */
  289.    glLightfv (GL_LIGHT0, GL_POSITION, lightOnePosition);
  290.    glLightfv (GL_LIGHT0, GL_AMBIENT, lightOneColor);
  291.    glLightfv (GL_LIGHT0, GL_DIFFUSE, lightOneColor);
  292.    glLightfv (GL_LIGHT0, GL_SPECULAR, lightOneColor);
  293.    glEnable (GL_LIGHT0);
  294.    glLightfv (GL_LIGHT1, GL_POSITION, lightTwoPosition);
  295.    glLightfv (GL_LIGHT1, GL_DIFFUSE, lightTwoColor);
  296.    glLightfv (GL_LIGHT1, GL_AMBIENT, lightTwoColor);
  297.    glEnable (GL_LIGHT1);
  298.    glLightfv (GL_LIGHT2, GL_POSITION, lightThreePosition);
  299.    glLightfv (GL_LIGHT2, GL_DIFFUSE, lightThreeColor);
  300.    glLightfv (GL_LIGHT2, GL_AMBIENT, lightThreeColor);
  301.    glEnable (GL_LIGHT2);
  302.    glEnable (GL_LIGHTING);
  303.    glEnable (GL_NORMALIZE);
  304.    /* glColorMaterial (GL_FRONT_AND_BACK, GL_DIFFUSE); */
  305.    /* glEnable (GL_COLOR_MATERIAL); */
  306.    init_arrow ();
  307.    glutMainLoop ();
  308.    return 0;             /* ANSI C requires main to return int. */
  309. }
  310. /* ================== END OF FILE ================== */