home *** CD-ROM | disk | FTP | other *** search
/ Photo CD Demo 1 / Demo.bin / gems / gemsii / hilbert.c < prev    next >
C/C++ Source or Header  |  1991-08-29  |  3KB  |  121 lines

  1.  
  2. #include <gl/gl.h>     /* SGI Graphics Library assumed */
  3.  
  4. #define STEP_SIZE 4    /* # of pixels in each step */
  5.  
  6. long coord[2];         /* X,Y for graphics calls */
  7.  
  8. void step(long angle)
  9. {
  10.    while (angle > 270) angle -= 360;    /* Fold ANGLE to be 0, 90, 180, 270 */
  11.    while (angle <   0) angle += 360;
  12.    if      (angle == 0)   coord[0] += STEP_SIZE;  /* +X */
  13.    else if (angle == 90)  coord[1] += STEP_SIZE;  /* +Y */
  14.    else if (angle == 180) coord[0] -= STEP_SIZE;  /* -X */
  15.    else if (angle == 270) coord[1] -= STEP_SIZE;  /* -Y */
  16.    v2i(coord);                          /* Draw (poly)line to new X,Y = coord */
  17. }
  18.  
  19. /* Recursive Hilbert-curve generation algorithm                    */
  20. /* ORIENT is either +1 or -1...it swaps left turns and right turns */
  21. /* ANGLE is some multiple of 90 degrees...positive or negative     */
  22. /* LEVEL is the recursion level                                    */
  23. /* 2^LEVEL by 2^LEVEL points will be visited in total              */
  24.  
  25. void hilbert (orient,angle,level)
  26. long orient,*angle,level;
  27. {
  28. long sw;
  29.    if (level-- <= 0) return;
  30.    *angle += orient * 90;
  31.    hilbert(-orient,angle,level);
  32.    step(*angle);
  33.    *angle -= orient * 90;
  34.    hilbert(orient,angle,level);
  35.    step(*angle);
  36.    hilbert(orient,angle,level);
  37.    *angle -= orient * 90;
  38.    step(*angle);
  39.    hilbert(-orient,angle,level);
  40.    *angle += orient * 90;
  41. }
  42.  
  43. /* Recursive Peano-curve generation  */
  44. /* Same parameters as Hilbert above  */
  45. /* 3^LEVEL by 3^LEVEL points visited */
  46.  
  47. void peano (orient,angle,level)
  48. long orient,*angle,level;
  49. {
  50. long sw;
  51.    if (level-- <= 0) return;
  52.    peano(orient,angle,level);
  53.    step(*angle);
  54.    peano(-orient,angle,level);
  55.    step(*angle);
  56.    peano(orient,angle,level);
  57.    *angle -= orient * 90;
  58.    step(*angle);
  59.    *angle -= orient * 90;
  60.    peano(-orient,angle,level);
  61.    step(*angle);
  62.    peano(orient,angle,level);
  63.    step(*angle);
  64.    peano(-orient,angle,level);
  65.    *angle += orient * 90;
  66.    step(*angle);
  67.    *angle += orient * 90;
  68.    peano(orient,angle,level);
  69.    step(*angle);
  70.    peano(-orient,angle,level);
  71.    step(*angle);
  72.    peano(orient,angle,level);
  73. }
  74.  
  75.  
  76. void main()
  77. {
  78. long initial_angle;
  79.  
  80. /* Set up window on screen for 24-bit drawing */
  81. /* This presumes SGI graphics library         */
  82.    prefposition(192,1088,236,788);  
  83.    foreground();
  84.    winopen("Hilbert and Peano curves");
  85.    RGBmode();
  86.    gconfig();
  87.    cpack(0x00701030);  /* Background = indigo */ 
  88.    clear();
  89.    cpack(0x00FFFFFF);  /* Curve = white */
  90.  
  91. /* Start polyline near bottom left corner */
  92.    bgnline();
  93.    coord[0] = 20;
  94.    coord[1] = 20;
  95.    v2i(coord);
  96.  
  97. /* Visit 128x128 points along Hilbert curve using STEP_SIZE steps, */
  98. /* so pattern will fill 512x512 area on screen since STEP_SIZE = 4 */
  99.    initial_angle = 0;
  100.    hilbert(1,&initial_angle,7);
  101.  
  102. /* Start polyline to right of other curve */
  103.    bgnline();
  104.    coord[0] = 552;
  105.    coord[1] = 20;
  106.    v2i(coord);
  107.  
  108. /* Visit 81x81 points along Peano curve using STEP_SIZE steps,     */
  109. /* so pattern will fill 324x324 area on screen since STEP_SIZE = 4 */
  110.    initial_angle = 0;
  111.    peano(-1,&initial_angle,4);
  112.  
  113. /* All done...admire it for 10 seconds */
  114.    endline();
  115.    sleep(10);
  116. }
  117.  
  118.  
  119.  
  120.  
  121.