home *** CD-ROM | disk | FTP | other *** search
/ Photo CD Demo 1 / Demo.bin / gems / graphics / binrec.c < prev    next >
C/C++ Source or Header  |  1992-04-09  |  1KB  |  54 lines

  1. /*
  2. Recording Animation in Binary Order for Progressive Temporal Refinement
  3. by Paul Heckbert
  4. from "Graphics Gems", Academic Press, 1990
  5. */
  6.  
  7. /*
  8.  * binrec.c: demonstrate binary recording order
  9.  * Paul Heckbert    Jan 90
  10.  */
  11.  
  12. #include <stdio.h>
  13. main(ac, av)
  14. int ac;
  15. char **av;
  16. {
  17.     int nframes, i, start_frame, repeat_count;
  18.     if (ac!=2) {
  19.         fprintf(stderr, "Usage: binrec <nframes>\n");
  20.         exit(1);
  21.     }
  22.     nframes = atoi(av[1]);
  23.  
  24.     printf("step startframe repeatcount\n");
  25.     for (i=0; i<nframes; i++) {
  26.     inside_out(nframes, i, &start_frame, &repeat_count);
  27.     printf(" %2d     %2d          %2d\n", i, start_frame, repeat_count);
  28.     }
  29. }
  30.  
  31. /*
  32.  * inside_out: turn a number "inside-out": a generalization of bit- 
  33.  * reversal.
  34.  * For n = power of two, this is equivalent to bit-reversal.
  35.  *
  36.  * Turn the number a inside-out, yielding b.  If 0<=a<n then 0<=b<n.
  37.  * Also return r = min(n-b, largest power of 2 dividing b)
  38.  */
  39. inside_out(n, a, b, r)
  40. int n, a, *b, *r;
  41. {
  42.     int k, m;
  43.     *r = m = n;
  44.     for (*b=0, k=1; k<n; k<<=1)
  45.     if (a<<1>=m) {
  46.             if (*b==0) *r = k;
  47.             *b += k;
  48.             a -= m+1>>1;
  49.             m >>= 1;
  50.     }
  51.     else m = m+1>>1;
  52.     if (*r>n-*b) *r = n-*b;
  53. }
  54.