perlin.cpp
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:6k
源码类别:

OpenGL

开发平台:

Visual C++

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include "mathlib.h"
  5. #include "vecmath.h"
  6. #include "perlin.h"
  7. float bias(float a, float b)
  8. {
  9.     return (float) pow((double) a, log((double) b) / log(0.5));
  10. }
  11. float gain(float a, float b)
  12. {
  13.     float p = (float) (log(1.0 - b) / log(0.5));
  14.     if (a < 0.001f)
  15. return 0.0f;
  16.     else if (a > 0.999f)
  17. return 1.0f;
  18.     if (a < 0.5f)
  19. return (float) pow(2 * a, p) / 2;
  20.     else
  21. return 1.0f - (float) pow(2.0 * (1.0 - a), (double) p) / 2;
  22. }
  23. float noise(float vec[], int len)
  24. {
  25.     switch (len) {
  26.     case 0:
  27. return 0.;
  28.     case 1:
  29. return noise1(vec[0]);
  30.     case 2:
  31. return noise2(vec);
  32.     default:
  33. return noise3(vec);
  34.     }
  35. }
  36. float turbulence(float v[], float freq)
  37. {
  38.     float t, vec[3];
  39.     for (t = 0. ; freq >= 1. ; freq /= 2) {
  40. vec[0] = freq * v[0];
  41. vec[1] = freq * v[1];
  42. vec[2] = freq * v[2];
  43. t += (float) fabs(noise3(vec)) / freq;
  44.     }
  45.     return t;
  46. }
  47. float turbulence(const Point2f& p, float freq)
  48. {
  49.     float t;
  50.     float vec[2];
  51.     for (t = 0.0f; freq >= 1.0f; freq *= 0.5f)
  52.     {
  53. vec[0] = freq * p.x;
  54. vec[1] = freq * p.y;
  55. t += (float) fabs(noise2(vec)) / freq;
  56.     }
  57.     return t;
  58. }
  59. float turbulence(const Point3f& p, float freq)
  60. {
  61.     float t;
  62.     float vec[3];
  63.     for (t = 0.0f; freq >= 1.0f; freq *= 0.5f)
  64.     {
  65. vec[0] = freq * p.x;
  66. vec[1] = freq * p.y;
  67. vec[2] = freq * p.z;
  68. t += (float) fabs(noise3(vec)) / freq;
  69.     }
  70.     return t;
  71. }
  72. float fractalsum(float v[], float freq)
  73. {
  74.     float t;
  75.     float vec[3];
  76.     for (t = 0.0f ; freq >= 1.0f ; freq /= 2.0f) {
  77. vec[0] = freq * v[0];
  78. vec[1] = freq * v[1];
  79. vec[2] = freq * v[2];
  80. t += noise3(vec) / freq;
  81.     }
  82.     return t;
  83. }
  84. float fractalsum(const Point2f& p, float freq)
  85. {
  86.     float t;
  87.     float vec[2];
  88.     for (t = 0.0f; freq >= 1.0f; freq *= 0.5f)
  89.     {
  90. vec[0] = freq * p.x;
  91. vec[1] = freq * p.y;
  92. t += noise2(vec) / freq;
  93.     }
  94.     return t;
  95. }
  96. float fractalsum(const Point3f& p, float freq)
  97. {
  98.     float t;
  99.     float vec[3];
  100.     for (t = 0.0f; freq >= 1.0f; freq *= 0.5f)
  101.     {
  102. vec[0] = freq * p.x;
  103. vec[1] = freq * p.y;
  104. vec[2] = freq * p.z;
  105. t += noise3(vec) / freq;
  106.     }
  107.     return t;
  108. }
  109. /* noise functions over 1, 2, and 3 dimensions */
  110. #define B 0x100
  111. #define BM 0xff
  112. #define N 0x1000
  113. #define NP 12   /* 2^N */
  114. #define NM 0xfff
  115. static int p[B + B + 2];
  116. static float g3[B + B + 2][3];
  117. static float g2[B + B + 2][2];
  118. static float g1[B + B + 2];
  119. static bool initialized = false;
  120. static void init(void);
  121. #define s_curve(t) ( t * t * (3.0f - 2.0f * t) )
  122. #define setup(i, b0, b1, r0, r1) 
  123. t = vec[i] + N;
  124. b0 = ((int)t) & BM;
  125. b1 = (b0+1) & BM;
  126. r0 = t - (int)t;
  127. r1 = r0 - 1.0f;
  128. float noise1(float arg)
  129. {
  130.     if (!initialized)
  131.         init();
  132.     int bx0, bx1;
  133.     float rx0, rx1, t, u, v, vec[1];
  134.     vec[0] = arg;
  135.     setup(0, bx0, bx1, rx0, rx1);
  136.     u = rx0 * g1[p[bx0]];
  137.     v = rx1 * g1[p[bx1]];
  138.     return Mathf::lerp(s_curve(rx0), u, v);
  139. }
  140. float noise2(float vec[2])
  141. {
  142. int bx0, bx1, by0, by1, b00, b10, b01, b11;
  143. float rx0, rx1, ry0, ry1, *q, sx, sy, a, b, t, u, v;
  144. int i, j;
  145. if (!initialized)
  146.     init();
  147. setup(0, bx0,bx1, rx0,rx1);
  148. setup(1, by0,by1, ry0,ry1);
  149. i = p[ bx0 ];
  150. j = p[ bx1 ];
  151. b00 = p[ i + by0 ];
  152. b10 = p[ j + by0 ];
  153. b01 = p[ i + by1 ];
  154. b11 = p[ j + by1 ];
  155. sx = s_curve(rx0);
  156. sy = s_curve(ry0);
  157. #define at2(rx,ry) ( rx * q[0] + ry * q[1] )
  158. q = g2[ b00 ] ; u = at2(rx0,ry0);
  159. q = g2[ b10 ] ; v = at2(rx1,ry0);
  160. a = Mathf::lerp(sx, u, v);
  161. q = g2[ b01 ] ; u = at2(rx0,ry1);
  162. q = g2[ b11 ] ; v = at2(rx1,ry1);
  163. b = Mathf::lerp(sx, u, v);
  164. return Mathf::lerp(sy, a, b);
  165. }
  166. float noise3(float vec[3])
  167. {
  168. if (!initialized)
  169.     init();
  170. int bx0, bx1, by0, by1, bz0, bz1, b00, b10, b01, b11;
  171. float rx0, rx1, ry0, ry1, rz0, rz1, *q, sy, sz, a, b, c, d, t, u, v;
  172. int i, j;
  173. setup(0, bx0,bx1, rx0,rx1);
  174. setup(1, by0,by1, ry0,ry1);
  175. setup(2, bz0,bz1, rz0,rz1);
  176. i = p[ bx0 ];
  177. j = p[ bx1 ];
  178. b00 = p[ i + by0 ];
  179. b10 = p[ j + by0 ];
  180. b01 = p[ i + by1 ];
  181. b11 = p[ j + by1 ];
  182. t  = s_curve(rx0);
  183. sy = s_curve(ry0);
  184. sz = s_curve(rz0);
  185. #define at3(rx,ry,rz) ( rx * q[0] + ry * q[1] + rz * q[2] )
  186. q = g3[ b00 + bz0 ] ; u = at3(rx0,ry0,rz0);
  187. q = g3[ b10 + bz0 ] ; v = at3(rx1,ry0,rz0);
  188. a = Mathf::lerp(t, u, v);
  189. q = g3[ b01 + bz0 ] ; u = at3(rx0,ry1,rz0);
  190. q = g3[ b11 + bz0 ] ; v = at3(rx1,ry1,rz0);
  191. b = Mathf::lerp(t, u, v);
  192. c = Mathf::lerp(sy, a, b);
  193. q = g3[ b00 + bz1 ] ; u = at3(rx0,ry0,rz1);
  194. q = g3[ b10 + bz1 ] ; v = at3(rx1,ry0,rz1);
  195. a = Mathf::lerp(t, u, v);
  196. q = g3[ b01 + bz1 ] ; u = at3(rx0,ry1,rz1);
  197. q = g3[ b11 + bz1 ] ; v = at3(rx1,ry1,rz1);
  198. b = Mathf::lerp(t, u, v);
  199. d = Mathf::lerp(sy, a, b);
  200. return Mathf::lerp(sz, c, d);
  201. }
  202. static void normalize2(float v[2])
  203. {
  204.     float s = (float) sqrt(v[0] * v[0] + v[1] * v[1]);
  205.     v[0] = v[0] / s;
  206.     v[1] = v[1] / s;
  207. }
  208. static void normalize3(float v[3])
  209. {
  210.     float s = (float) sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
  211.     v[0] = v[0] / s;
  212.     v[1] = v[1] / s;
  213.     v[2] = v[2] / s;
  214. }
  215. static void init()
  216. {
  217.     int i, j, k;
  218.     for (i = 0; i < B; i++)
  219.     {
  220.         g1[i]    = Mathf::sfrand();
  221.         g2[i][0] = Mathf::sfrand();
  222.         g2[i][1] = Mathf::sfrand();
  223.         normalize2(g2[i]);
  224.         g3[i][0] = Mathf::sfrand();
  225.         g3[i][1] = Mathf::sfrand();
  226.         g3[i][2] = Mathf::sfrand();
  227.         normalize3(g3[i]);
  228.     }
  229.     // Fill the permutation array with values . . .
  230.     for (i = 0; i < B; i++)
  231.         p[i] = i;
  232.     // . . . and then shuffle it
  233.     for (i = 0; i < B; i++)
  234.     {
  235.         k = p[i];
  236.         j = rand() % B;
  237.         p[i] = p[j];
  238.         p[j] = k;
  239.     }
  240.     // Duplicate values to accelerate table lookups
  241.     for (i = 0; i < B + 2; i++) 
  242.     {
  243.         p[B + i] = p[i];
  244.         g1[B + i]    = g1[i];
  245.         g2[B + i][0] = g2[i][0];
  246.         g2[B + i][1] = g2[i][1];
  247.         g3[B + i][0] = g3[i][0];
  248.         g3[B + i][1] = g3[i][1];
  249.         g3[B + i][2] = g3[i][2];
  250.     }
  251.     initialized = true;
  252. }