sandbox/Antoonvh/hilbert.c

    David Hilbert on displayed on one of his favortice Curves (by Stansy via Wikimedia)

    Hilbert curve grid iterator

    It fills the space

    #include "utils.h"
    
    void Hilbert (Point point, int lp, Cache * c) {
      if (point.level == depth()) {
        cache_append (c, point, 0);
      } else {
        Point p1 = point;
        p1.level++;
        switch (lp) {
        case 1:
          p1.i = _LEFT;  p1.j = _BOTTOM; Hilbert (p1,4,c);
          p1.i = _LEFT;  p1.j = _TOP;    Hilbert (p1,1,c);
          p1.i = _RIGHT; p1.j = _TOP;    Hilbert (p1,1,c);
          p1.i = _RIGHT; p1.j = _BOTTOM; Hilbert (p1,2,c);
          break;
        case 2:
          p1.i = _RIGHT; p1.j = _TOP;    Hilbert (p1,3,c);
          p1.i = _LEFT;  p1.j = _TOP;    Hilbert (p1,2,c);
          p1.i = _LEFT;  p1.j = _BOTTOM; Hilbert (p1,2,c);
          p1.i = _RIGHT; p1.j = _BOTTOM; Hilbert (p1,1,c);
          break;
        case 3:
          p1.i = _RIGHT; p1.j = _TOP;    Hilbert (p1,2,c);
          p1.i = _RIGHT; p1.j = _BOTTOM; Hilbert (p1,3,c);
          p1.i = _LEFT;  p1.j = _BOTTOM; Hilbert (p1,3,c);
          p1.i = _LEFT;  p1.j = _TOP;    Hilbert (p1,4,c);
          break;
        case 4:
          p1.i = _LEFT;   p1.j = _BOTTOM; Hilbert (p1,1,c);
          p1.i = _RIGHT;  p1.j = _BOTTOM; Hilbert (p1,4,c);
          p1.i = _RIGHT;  p1.j = _TOP;    Hilbert (p1,4,c);
          p1.i = _LEFT;   p1.j = _TOP;    Hilbert (p1,3,c);
          break;
        }
      }
    }
    
    int main() {
      init_grid (32);
      Cache H = {0};
      foreach_level(0) 
        Hilbert (point, 1, &H);
      cache_shrink (&H);
      scalar s[];
      foreach()
        s[] = nodata;
      double a = 0;
      foreach_cache(H) {
        s[] = a++;
        output_ppm (s, file = "hilbert_iterator.mp4", n = 500);
      }
      free(H.p);
    }