Advertisement
Guest User

NoiseGeneraton3 C

a guest
Jul 18th, 2016
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.02 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <time.h>
  5. #define A_ASDF sqrt(3.00)
  6.  
  7. typedef struct {
  8.     double b, c, d;
  9.     int f[512];
  10. } NoiseGenerator3Handler;
  11. typedef struct {
  12.     int b;
  13.     NoiseGenerator3Handler a[];
  14. } NoiseGenerator3;
  15.  
  16.  
  17. void NG3Hinit (NoiseGenerator3Handler *ptr, int x),
  18.      NG3init (NoiseGenerator3 *ptr, int i);
  19. int NG3Hrand_interval (int max),
  20.     NG3Ha0 (double d0);
  21. double NG3Ha1 (int *aint, double d0, double d1),
  22.        NG3Ha2 (NoiseGenerator3Handler *ptr, double d0, double d1);
  23.  
  24.  
  25. int e[12][3] = { { 1, 1, 0}, { -1, 1, 0}, { 1, -1, 0}, { -1, -1, 0},
  26.                         { 1, 0, 1}, { -1, 0, 1}, { 1, 0, -1}, { -1, 0, -1},
  27.                         { 0, 1, 1}, { 0, -1, 1}, { 0, 1, -1}, { 0, -1, -1}
  28.                       };
  29. double g = 0.50 * (A_ASDF - 1.00),
  30.        h = (3.00 - A_ASDF) / 6.00;
  31.  
  32.  
  33. void NG3Hinit (NoiseGenerator3Handler *ptr, int x) {
  34.     for(int y = 0; y < x; y++) {
  35.         ptr->b = rand()/(RAND_MAX + 1.) * 256.00;
  36.         ptr->c = rand()/(RAND_MAX + 1.) * 256.00;
  37.         ptr->d = rand()/(RAND_MAX + 1.) * 256.00;
  38.        
  39.         int i;
  40.        
  41.         for (i = 0; i < 256; ++i) {
  42.             int j = NG3Hrand_interval(256 - i) + i;
  43.             int k = ptr->f[i];
  44.            
  45.             ptr->f[i] = ptr->f[j];
  46.             ptr->f[j] = k;
  47.             ptr->f[256 + i] = ptr->f[i];
  48.         }
  49.         ptr++;
  50.     }
  51. }
  52.  
  53. int NG3Hrand_interval(int max)
  54. {
  55.     int r;
  56.     unsigned int y = max;
  57.     const unsigned int range = 1 + y,
  58.                        buckets = RAND_MAX / range,
  59.                        limit = buckets * range;
  60.  
  61.     /* Create equal size buckets all in a row, then fire randomly towards
  62.      * the buckets until you land in one of them. All buckets are equally
  63.      * likely. If you land off the end of the line of buckets, try again. */
  64.     do { r = rand(); } while (r >= limit);
  65.    
  66.     unsigned int z = (r / buckets);
  67.     return (int)r;
  68. }
  69.  
  70. int NG3Ha0 (double d0) {
  71.     return d0 > 0.00 ? (int)d0 : (int)d0 - 1;
  72. }
  73.  
  74. double NG3Ha1 (int *aint, double d0, double d1) {
  75.     int x = aint[0], y = aint[1];
  76.     return (double) (x * d0) + (y * d1);
  77. }
  78.  
  79. double NG3Ha2 (NoiseGenerator3Handler *ptr, double d0, double d1) {
  80.     double d2 = 0.50 * (A_ASDF - 1.00);
  81.     double d3 = (d0 + d1) * d2;
  82.     int i = NG3Ha0(d0 + d3);
  83.     int j = NG3Ha0(d1 + d3);
  84.     double d4 = (3.00 - A_ASDF) / 6.00;
  85.     double d5 = (double) (i + j) * d4;
  86.     double d6 = (double) i - d5;
  87.     double d7 = (double) j - d5;
  88.     double d8 = d0 - d6;
  89.     double d9 = d1 - d7;
  90.     unsigned char b0, b1;
  91.  
  92.     if (d8 > d9) {
  93.         b0 = 1;
  94.         b1 = 0;
  95.     } else {
  96.         b0 = 0;
  97.         b1 = 1;
  98.     }
  99.  
  100.     double d10 = d8 - (double) b0 + d4;
  101.     double d11 = d9 - (double) b1 + d4;
  102.     double d12 = d8 - 1.00 + 2.00 * d4;
  103.     double d13 = d9 - 1.00 + 2.00 * d4;
  104.     int k = i & 255;
  105.     int l = j & 255;
  106.     int i1 = ptr->f[k + ptr->f[1]] % 12;
  107.     int j1 = ptr->f[k + b0 + ptr->f[l + b1]] % 12;
  108.     int k1 = ptr->f[k + 1 + ptr->f[l + 1]] % 12;
  109.     double d14 = 0.50 - d8 * d8 - d9 * d9;
  110.     double d15;
  111.  
  112.     if (d14 < 0.00) {
  113.         d15 = 0.00;
  114.     } else {
  115.         d14 *= d14;
  116.         d15 = d14 * d14 * NG3Ha1(e[i1], d8, d9);
  117.     }
  118.  
  119.     double d16 = 0.50 - d10 * d10 - d11 * d11;
  120.     double d17;
  121.  
  122.     if (d16 < 0.00) {
  123.         d17 = 0.00;
  124.     } else {
  125.         d16 *= d16;
  126.         d17 = d16 * d16 * NG3Ha1(e[j1], d10, d11);
  127.     }
  128.  
  129.     double d18 = 0.50 - d12 * d12 - d13 * d13;
  130.     double d19;
  131.  
  132.     if (d18 < 0.00) {
  133.         d19 = 0.00;
  134.     } else {
  135.         d18 *= d18;
  136.         d19 = d18 * d18 * NG3Ha1(e[k1], d12, d13);
  137.     }
  138.  
  139.     return 70.00 * (d15 + d17 + d19);
  140. }
  141.  
  142. void NG3init (NoiseGenerator3 *ptr, int i) {
  143.     srand((unsigned)time(NULL));
  144.     NoiseGenerator3 *x = (NoiseGenerator3*) malloc(sizeof(NoiseGenerator3) + i * sizeof(NoiseGenerator3Handler));
  145.     ptr->b = i;
  146.     NG3Hinit(ptr->a, i);
  147.    
  148.     x = ptr;
  149. }
  150.  
  151.  
  152. int main()
  153. {
  154.     NoiseGenerator3 *test;
  155.     NG3init(test, 3);
  156.    
  157.     return 0;
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement