Advertisement
Guest User

Untitled

a guest
Sep 26th, 2017
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.45 KB | None | 0 0
  1. #include <stdlib.h> // malloc, EXIT_*
  2. #include <string.h> // memset
  3. #include <inttypes.h>
  4. #include <math.h>
  5. #include <png.h>
  6.  
  7. #define HILS 10
  8. #define SMOOTHLENGTH 20
  9.  
  10. #define EXIT_PNG(F) if (!F) { \
  11.     fprintf(stderr, "%s\n", bild.message); \
  12.     return EXIT_FAILURE; \
  13. }
  14. #define u8 unsigned char
  15.  
  16. void get_hilbert(int *curve, int a)
  17. {
  18.     curve[0] = 0;
  19.     curve[1] = 1;
  20.     curve[2] = a + 1;
  21.     curve[3] = a;
  22.     int step = 0;
  23.     int sidelen = 2;
  24.     while (sidelen < a) {
  25.         int cnt;
  26.         switch (step) {
  27.         case 0: // rotate right, write down
  28.             cnt = sidelen * sidelen;
  29.             for (int i = 0; i < cnt; ++i) {
  30.                 int x = curve[i];
  31.                 int y = x / a;
  32.                 x %= a;
  33.                 curve[cnt + i] = (x + sidelen) * a + y;
  34.             }
  35.             break;
  36.         case 1: // mirror right, write right
  37.             cnt = sidelen * sidelen * 2;
  38.             for (int i = 0; i < cnt; ++i) {
  39.                 int x = curve[i];
  40.                 int y = x / a;
  41.                 x %= a;
  42.                 curve[2 * cnt - i - 1] = y * a + 2 * sidelen - x - 1;
  43.             }
  44.             sidelen *= 2;
  45.             break;
  46.         case 2: // rotate left, write right
  47.             cnt = sidelen * sidelen;
  48.             for (int i = 0; i < cnt; ++i) {
  49.                 int x = curve[i];
  50.                 int y = x / a;
  51.                 x %= a;
  52.                 curve[cnt + i] = x * a + y + sidelen;
  53.             }
  54.             break;
  55.         case 3: // mirror down, write down
  56.             cnt = sidelen * sidelen * 2;
  57.             for (int i = 0; i < cnt; ++i) {
  58.                 int x = curve[i];
  59.                 int y = x / a;
  60.                 x %= a;
  61.                 curve[2 * cnt - i - 1] = (2 * sidelen - y - 1) * a + x;
  62.             }
  63.             sidelen *= 2;
  64.             break;
  65.         default:
  66.             exit(EXIT_FAILURE);
  67.         }
  68.         step = (step + 1) % 4;
  69.     }
  70. }
  71.  
  72.  
  73. double rv = 0.5;
  74. double getrand()
  75. {
  76.     rv = 10000.0 * sqrt(rv);
  77.     rv -= floor(rv);
  78.     return rv;
  79. }
  80.  
  81. int main(int argc, char **args)
  82. {
  83.     png_image bild;
  84.     memset(&bild, 0, sizeof(bild));
  85.     bild.version = PNG_IMAGE_VERSION;
  86.     bild.version = PNG_IMAGE_VERSION;
  87.     bild.format = PNG_FORMAT_GRAY;
  88.     bild.flags = PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB;
  89.  
  90.  
  91.     int a = 1 << HILS;
  92.  
  93.     bild.width = a;
  94.     bild.height = a;
  95.     u8 *pixels = malloc(a * a);
  96.  
  97.  
  98.     int *hilb = malloc(a * a * sizeof(int));
  99.     get_hilbert(hilb, a);
  100.     //~ int *hilbinv = malloc(a * a * sizeof(int));
  101.     //~ for (int i = 0; i < a*a; ++i) {
  102.         //~ hilbinv[hilb[i]] = i;
  103.     //~ }
  104.  
  105.     for (int i = 0; i < a * a; ++i) {
  106.         pixels[i] = getrand() * 255;
  107.     }
  108.  
  109.  
  110.     float *smoothpixels = malloc(a * a * sizeof(float));
  111.     float *data = malloc(a * a * sizeof(float));
  112.     for (int i = 0; i < a * a; ++i) {
  113.         data[i] = pixels[i];
  114.     }
  115.  
  116.     for (int j = 0; j < 500; ++j) {
  117.         for (int i = 2; i < a * a - 2; ++i) {
  118.             if (i < SMOOTHLENGTH || i >= (a * a - SMOOTHLENGTH))
  119.                 continue;
  120.             //~ float px = data[i];
  121.             float v = 0.0f;
  122.             for (int o = -SMOOTHLENGTH; o < SMOOTHLENGTH+1; ++o) {
  123.                 float otherv = pixels[i + o];
  124.                 //~ if (fabsf(otherv - px) < TRESH)
  125.                     v += otherv;
  126.                 //~ else
  127.                     //~ v += px;
  128.             }
  129.             smoothpixels[i] = v / (SMOOTHLENGTH+SMOOTHLENGTH+1);
  130.         }
  131.  
  132.         for (int i = 0; i < SMOOTHLENGTH; ++i) {
  133.             smoothpixels[i] = smoothpixels[SMOOTHLENGTH];
  134.             smoothpixels[a * a - i - 1] = smoothpixels[a * a - SMOOTHLENGTH - 1];
  135.         }
  136.  
  137.         for (int i = 0; i < a * a; ++i) {
  138.             data[hilb[i]] = smoothpixels[i];
  139.         }
  140.     }
  141.  
  142.     float min = data[0];
  143.     float max = data[0];
  144.     for (int i = 0; i < a * a; ++i) {
  145.         if (data[i] < min)
  146.             min = data[i];
  147.         else if (data[i] > max)
  148.             max = data[i];
  149.     }
  150.  
  151.     float f = 255.0f / (max - min);
  152.     for (int i = 0; i < a * a; ++i) {
  153.         pixels[i] = (data[i] - min) * f;
  154.     }
  155.  
  156.  
  157.  
  158.     EXIT_PNG(png_image_write_to_stdio(&bild, stdout, 0, pixels, 0, NULL));
  159.     return EXIT_SUCCESS;
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement