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

GIS编程

开发平台:

Visual C++

  1. /* 
  2.  * candlestick.c
  3.  * 
  4.  * FUNCTION:
  5.  * Draws a skewed candlestick shape using the Lathe primitive
  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. /* Some <math.h> files do not define M_PI... */
  19. #ifndef M_PI
  20. #define M_PI 3.14159265358979323846
  21. #endif
  22. /* =========================================================== */
  23. #define SET_RGB(rgb,r,g,b) {
  24. rgb[0]=r; rgb[1]=g; rgb[2]=b;
  25. typedef struct _material {
  26.    /* public data areas */
  27.    float emission[3];
  28.    float ambient[3];  
  29.    float diffuse[3];  
  30.    float specular[3]; 
  31.    float shininess;
  32. } Material;
  33. #define SET_EMIS(self,r,g,b) { SET_RGB(self->emission, r,g,b); }
  34. #define SET_AMB(self,r,g,b) { SET_RGB(self->ambient, r,g,b); }
  35. #define SET_DIFF(self,r,g,b) { SET_RGB(self->diffuse, r,g,b); }
  36. #define SET_SPEC(self,r,g,b) { SET_RGB(self->specular, r,g,b); }
  37. /* =========================================================== */
  38. #ifdef NOTNOW
  39. class goPolyline {
  40.    public:
  41.       int dimension;
  42.       int numPoints;
  43.       double * pts;
  44.    private:
  45.       int  nfree;
  46.    public:
  47.       goPolyline (); // by default, construct 3D polyline
  48.       goPolyline (int);            // construct arbitrary dimension polyline
  49.       void Print ();
  50.       void AddPoint (double x, double y);
  51.       void AddNormal (double x, double y);
  52.       void MakeFacetNormal ();
  53. };
  54. #endif /* NOTNOW */
  55. typedef double SVec[2];
  56. typedef struct contour {
  57.    /* public data areas */
  58.    int numContourPoints;
  59.    int numContourNorms;
  60.    SVec * pts;
  61.    SVec * norms;
  62.    double up[3];
  63. } Contour;
  64. #define pfree numContourPoints
  65. #define nfree numContourNorms
  66. #define NEW_CONTOUR(self) {
  67.    self -> pts = (SVec *) malloc (100*sizeof (double));
  68.    self -> norms = (SVec *) malloc (100*sizeof (double));
  69.    self -> pfree = 0;
  70.    self -> nfree = 0;
  71. }
  72. #define ADD_POINT(self,x,y) { 
  73.    self -> pts[self->pfree][0] = x;
  74.    self -> pts[self->pfree][1] = y;
  75.    self->pfree ++;
  76. }
  77. #define ADD_NORMAL(self,x,y) { 
  78.    self -> norms[self->nfree][0] = x;
  79.    self -> norms[self->nfree][1] = y;
  80.    self->nfree ++;
  81. }
  82. #define MAKE_NORMAL(self) {
  83.    float dx, dy, w;
  84.    dx = self -> pts [self->pfree -1][0];
  85.    dx -= self -> pts [self->pfree -2][0];
  86.    dy = self -> pts [self->pfree -1][1];
  87.    dy -= self -> pts [self->pfree -2][1];
  88.    w = 1.0 / sqrt (dx*dx+dy*dy);
  89.    dx *= w;
  90.    dy *= w;
  91.    self -> norms[self->nfree][0] = -dy;
  92.    self -> norms[self->nfree][1] = dx;
  93.    self -> nfree ++;
  94. }
  95. /* =========================================================== */
  96. /* class gleExtrustion */
  97. typedef struct _extrusion {
  98.    Material *material; /* material description */
  99.    Contour  *contour; /* 2D contour */
  100.    double radius; /* for polycylinder, torus */
  101.    double startRadius;     /* spiral starts in x-y plane */
  102.    double drdTheta;        /* change in radius per revolution */
  103.    double startZ;          /* starting z value */
  104.    double dzdTheta;        /* change in Z per revolution */
  105.    double startXform[2][3]; /* starting contour affine xform */
  106.    double dXdTheta[2][3]; /* tangent change xform per revoln */
  107.    double startTheta;      /* start angle in x-y plane */
  108.    double sweepTheta;     /* degrees to spiral around */
  109. } Extrusion;
  110. #define  NEW_EXTRUSION(self) {
  111.    self -> material = (Material *) malloc (sizeof (Material));
  112.    self -> contour = (Contour *) malloc (sizeof (Contour));
  113.    NEW_CONTOUR (self->contour);
  114. }
  115. /* =========================================================== */
  116. Extrusion *candle = NULL;
  117. /* =========================================================== */
  118. float lastx=0;
  119. float lasty=0;
  120. void draw_candle (void) {
  121.    /* attach the mouse */
  122.    candle->dzdTheta = - 0.015 * (lasty -150.0);
  123. /* rotational delta sine & cosines from mouse */
  124. /* disable twist -- confusing to the viewer, hard to explain */
  125. /*
  126.    mouse -> AttachMouseYd (mouse, 0.0004, -0.1, &candle->dXdTheta[0][1]);
  127. */
  128.    glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT, candle->material->ambient);
  129.    glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, candle->material->diffuse);
  130.    glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, candle->material->specular);
  131.    glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, 2.0);
  132. #ifdef IBM_GL_32
  133.    rotate (-750, 'x');
  134.    rotate (-1050, 'z');
  135.    translate (-0.5, -0.5, -0.5);
  136.    lathe (candle->contour->numContourPoints,
  137.            candle->contour->pts,
  138.            candle->contour->norms,
  139.            candle->contour->up,
  140.            candle->startRadius,    /* donut radius */
  141.            candle->drdTheta,   /* change in donut radius per revolution */
  142.            candle->startZ,    /* start z value */
  143.            candle->dzdTheta,     /* change in Z per revolution */
  144.            candle->startXform, 
  145.            candle->dXdTheta,
  146.            candle->startTheta,     /* start angle */
  147.            candle->sweepTheta);     /* sweep angle */
  148. #endif
  149. #define OPENGL_10
  150. #ifdef OPENGL_10
  151.    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  152.    /* set up some matrices so that the object spins with the mouse */
  153.    glPushMatrix ();
  154.    glTranslatef (0.0, 0.0, -80.0);
  155.    glRotated (-75.0, 1.0, 0.0, 0.0);
  156.    glRotated (-105.0, 0.0, 0.0, 1.0);
  157.    glEnable (GL_LIGHTING);
  158.    gleLathe (candle->contour->numContourPoints,
  159.            candle->contour->pts,
  160.            candle->contour->norms,
  161.            candle->contour->up,
  162.            candle->startRadius,    /* donut radius */
  163.            candle->drdTheta,   /* change in donut radius per revolution */
  164.            candle->startZ,    /* start z value */
  165.            candle->dzdTheta,     /* change in Z per revolution */
  166.            candle->startXform, 
  167.            candle->dXdTheta,
  168.            candle->startTheta,     /* start angle */
  169.            candle->sweepTheta);     /* sweep angle */
  170.    glDisable (GL_LIGHTING);
  171.    glPopMatrix ();
  172.    glutSwapBuffers ();
  173. #endif 
  174. }
  175. /* =========================================================== */
  176. #define SCALE 1.0
  177. #define PT(x,y) { ADD_POINT (candle->contour, SCALE*x, SCALE*y); }
  178. #define NORM(x,y) { ADD_NORMAL (candle->contour, x, y); }
  179. #define FACET { MAKE_NORMAL (candle->contour); }
  180. /* =========================================================== */
  181. void init_candle (void)
  182. {
  183.    int j;
  184.    double theta, dtheta;
  185.    int style;
  186.    candle = (Extrusion *) malloc (sizeof (Extrusion));
  187.    NEW_EXTRUSION (candle);
  188.    /* define candle color */
  189.    SET_AMB (candle->material, 0.25, 0.25, 0.25);
  190.    SET_DIFF (candle->material, 0.8, 0.6, 0.175);
  191.    SET_SPEC (candle->material, 0.45, 0.45, 0.45);
  192.    /* define lathe/spiral parameters */
  193.    candle -> startRadius = 1.5;
  194.    candle -> drdTheta = 0.0;
  195.    candle -> startZ = 0.0;
  196.    candle -> dzdTheta = 0.0;
  197.    candle -> startTheta = 0.0;
  198.    candle -> sweepTheta = 360.0;
  199.    /* initialize contour up vector */
  200.    candle->contour->up[0] = 1.0;
  201.    candle->contour->up[1] = 0.0;
  202.    candle->contour->up[2] = 0.0;
  203.    /* define candlestick contour */
  204.    PT (-8.0, 0.0); 
  205.    PT (-10.0, 0.0); FACET; 
  206.    PT (-10.0, 2.0); FACET;
  207.    PT (-9.6, 2.0); FACET;
  208.    PT (-8.0, 0.0); FACET;
  209.    PT (-5.8, 0.0); FACET;
  210.    PT (-5.2, 0.6); FACET;
  211.    PT (-4.6, 0.0); FACET;
  212.    PT (-1.5, 0.0); FACET;
  213.    dtheta = M_PI /14.0;
  214.    theta = 0.0;
  215.    for (j=0; j<14; j++) {
  216.       PT ((-1.5*cos(theta)) , (1.5*sin(theta)));
  217.       NORM ((-cos(theta)) , sin(theta));
  218.       theta += dtheta;
  219.    }
  220.    PT (1.5, 0.0); FACET; 
  221.    PT (4.6, 0.0); FACET;
  222.    PT (5.2, 0.6); FACET;
  223.    PT (5.8, 0.0); FACET;
  224.    PT (7.0, 0.0); FACET;
  225.    PT (7.5, 0.2); FACET;
  226.    PT (8.0, 0.8); FACET;
  227.    PT (8.3, 0.9); FACET;
  228.    PT (8.15, 1.8); FACET;
  229.    PT (8.8, 2.8); FACET;
  230.    PT (9.2, 3.8); FACET;
  231.    PT (9.5, 3.8); FACET;
  232.    PT (9.56, 3.75); FACET;
  233.    PT (9.62, 3.75); FACET;
  234.    PT (9.7, 3.8); FACET; 
  235.    PT (10.0, 3.8); FACET;
  236.    PT (10.0, 0.0); FACET;
  237.    PT (7.0, 0.0); FACET;
  238.    /* initialize the transofrms */
  239.    candle->startXform[0][0] = 1.0;
  240.    candle->startXform[0][1] = 0.0;
  241.    candle->startXform[0][2] = 0.0;
  242.    candle->startXform[1][0] = 0.0;
  243.    candle->startXform[1][1] = 1.0;
  244.    candle->startXform[1][2] = 0.0;
  245.    candle->dXdTheta[0][0] = 0.0;
  246.    candle->dXdTheta[0][1] = 0.0;
  247.    candle->dXdTheta[0][2] = 0.0;
  248.    candle->dXdTheta[1][0] = 0.0;
  249.    candle->dXdTheta[1][1] = 0.0;
  250.    candle->dXdTheta[1][2] = 0.0;
  251.    /* set the initial join style */
  252.    style = gleGetJoinStyle ();
  253.    style &= ~TUBE_NORM_MASK;
  254.    style |= TUBE_NORM_PATH_EDGE;
  255.    style |= TUBE_NORM_FACET;
  256.    gleSetJoinStyle (style);
  257. }
  258. /* =========================================================== */
  259. /* get notified of mouse motions */
  260. void MouseMotion (int x, int y)
  261. {
  262.    lastx = x;
  263.    lasty = y;
  264.    glutPostRedisplay ();
  265. }
  266. void JoinStyle (int msg) 
  267. {
  268.    int style;
  269.    /* get the current joint style */
  270.    style = gleGetJoinStyle ();
  271.    /* there are four different join styles, 
  272.     * and two different normal vector styles */
  273.    switch (msg) {
  274.       case 20:
  275.          style &= ~TUBE_NORM_MASK;
  276.          style |= TUBE_NORM_FACET;
  277.          break;
  278.       case 21:
  279.          style &= ~TUBE_NORM_MASK;
  280.          style |= TUBE_NORM_EDGE;
  281.          break;
  282.       case 22:
  283.          style &= ~TUBE_NORM_MASK;
  284.          style |= TUBE_NORM_PATH_EDGE;
  285.          style |= TUBE_NORM_FACET;
  286.          break;
  287.       case 23:
  288.          style &= ~TUBE_NORM_MASK;
  289.          style |= TUBE_NORM_PATH_EDGE;
  290.          style |= TUBE_NORM_EDGE;
  291.          break;
  292.       case 99:
  293.          exit (0);
  294.       default:
  295.          break;
  296.    }
  297.    gleSetJoinStyle (style);
  298.    glutPostRedisplay ();
  299. }
  300. /* set up a light */
  301. GLfloat lightOnePosition[] = {40.0, 40, 100.0, 0.0};
  302. GLfloat lightOneColor[] = {0.54, 0.54, 0.54, 1.0}; 
  303. GLfloat lightTwoPosition[] = {-40.0, 40, 100.0, 0.0};
  304. GLfloat lightTwoColor[] = {0.54, 0.54, 0.54, 1.0}; 
  305. int
  306. main (int argc, char * argv[]) {
  307.    /* initialize glut */
  308.    glutInit (&argc, argv);
  309.    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  310.    glutCreateWindow ("candlestick");
  311.    glutDisplayFunc (draw_candle);
  312.    glutMotionFunc (MouseMotion);
  313.    /* create popup menu */
  314.    glutCreateMenu (JoinStyle);
  315.    glutAddMenuEntry ("Facet Normal Vectors", 20);
  316.    glutAddMenuEntry ("Edge Normal Vectors", 21);
  317.    glutAddMenuEntry ("Facet Sweep Normal Vectors", 22);
  318.    glutAddMenuEntry ("Edge Sweep Normal Vectors", 23);
  319.    glutAddMenuEntry ("------------------", 9999);
  320.    glutAddMenuEntry ("Exit", 99);
  321.    glutAttachMenu (GLUT_MIDDLE_BUTTON);
  322.    /* initialize GL */
  323.    glClearDepth (1.0);
  324.    glEnable (GL_DEPTH_TEST);
  325.    glClearColor (0.0, 0.0, 0.0, 0.0);
  326.    glShadeModel (GL_SMOOTH);
  327.    glMatrixMode (GL_PROJECTION);
  328.    /* roughly, measured in centimeters */
  329.    glFrustum (-9.0, 9.0, -9.0, 9.0, 50.0, 150.0);
  330.    glMatrixMode(GL_MODELVIEW);
  331.    /* initialize lighting */
  332.    glLightfv (GL_LIGHT0, GL_POSITION, lightOnePosition);
  333.    glLightfv (GL_LIGHT0, GL_AMBIENT, lightOneColor);
  334.    glLightfv (GL_LIGHT0, GL_DIFFUSE, lightOneColor);
  335.    glLightfv (GL_LIGHT0, GL_SPECULAR, lightOneColor);
  336.    glEnable (GL_LIGHT0);
  337.    glLightfv (GL_LIGHT1, GL_POSITION, lightTwoPosition);
  338.    glLightfv (GL_LIGHT1, GL_DIFFUSE, lightTwoColor);
  339.    glLightfv (GL_LIGHT1, GL_AMBIENT, lightTwoColor);
  340.    glEnable (GL_LIGHT1);
  341.    glEnable (GL_LIGHTING);
  342.    glEnable (GL_NORMALIZE);
  343.    /* glColorMaterial (GL_FRONT_AND_BACK, GL_DIFFUSE); */
  344.    /* glEnable (GL_COLOR_MATERIAL); */
  345.    init_candle ();
  346.    glutMainLoop ();
  347.    return 0;             /* ANSI C requires main to return int. */
  348. }
  349. /* ===================== END OF FILE ================== */