Advertisement
Guest User

Untitled

a guest
Jun 1st, 2013
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 5.16 KB | None | 0 0
  1. Unit PerlinNoiseUnit;
  2.  
  3. Interface
  4.  
  5. {$R-}
  6. {$Q-}
  7.  
  8. Const
  9.   _B = $100;
  10.   BM = $ff;
  11.  
  12.   N = $1000;
  13.  
  14. Type
  15.     TPerlinNoise = Class
  16.     Private
  17.         P : Array[0..(_B+_B+2)-1] Of Integer;
  18.         G1: Array[0..(_B+_B+2)-1] Of Double;
  19.     Public
  20.         Constructor Create(Seed: Integer);
  21.  
  22.         Procedure InitNoise(Seed: Integer);
  23.         Function Noise1d(x: Double): Double;
  24.         Function Noise2d(x,y: Double): Double;
  25.         Function Noise3d(x,y,z: Double): Double;
  26.  
  27.         Function PerlinNoise1d(x: Double;
  28.                                Persistence: Single = 0.25;
  29.                                Frequency: Single = 1;
  30.                                Octaves: Integer = 4): Double;
  31.         Function PerlinNoise2d(x,y: Double;
  32.                                Persistence: Single = 0.25;
  33.                                Frequency: Single = 1;
  34.                                Octaves: Integer = 4): Double;
  35.         Function PerlinNoise3d(x,y,z: Double;
  36.                                Persistence: Single = 0.25;
  37.                                Frequency: Single = 1;
  38.                                Octaves: Integer = 4): Double;
  39.     End;
  40.  
  41. Implementation
  42.  
  43. Uses
  44.     SysUtils;
  45.  
  46. Function TPerlinNoise.Noise1d(x: Double): Double;
  47. Var
  48.   bx0,bx1: Integer;
  49.   rx0,sx,t,u,v: Double;
  50. Begin
  51.   t := x+N;
  52.   bx0 := Trunc(t) And BM;
  53.   bx1 := (bx0+1) And BM;
  54.   rx0 := t-Trunc(t);
  55.  
  56.   sx := (rx0*rx0*(3.0-2.0*rx0));
  57.  
  58.   u := G1[P[bx0]];
  59.   v := G1[P[bx1]];
  60.  
  61.   Result := u+sx*(v-u);
  62. End;
  63.  
  64. Function TPerlinNoise.Noise2d(x,y: Double): Double;
  65. Var
  66.   bx0,bx1,by0,by1: Integer;
  67.   i,j: Integer;
  68.   rx0,ry0: Double;
  69.   sx,sy: Double;
  70.   a,b,t,u,v: Double;
  71. Begin
  72.   t := x+N;
  73.   bx0 := Trunc(t) And BM;
  74.   bx1 := (bx0+1) And BM;
  75.   rx0 := t-Trunc(t);
  76.  
  77.   t := y+N;
  78.   by0 := Trunc(t) And BM;
  79.   by1 := (by0+1) And BM;
  80.   ry0 := t-Trunc(t);
  81.  
  82.   i := P[bx0];
  83.   j := P[bx1];
  84.  
  85.   sx := (rx0*rx0*(3.0-2.0*rx0));
  86.   sy := (ry0*ry0*(3.0-2.0*ry0));
  87.  
  88.   u := G1[P[i+by0]];
  89.   v := G1[P[j+by0]];
  90.   a := u+sx*(v-u);
  91.  
  92.   u := G1[P[i+by1]];
  93.   v := G1[P[j+by1]];
  94.   b := u+sx*(v-u);
  95.  
  96.   Result := a+sy*(b-a);
  97. End;
  98.  
  99. Function TPerlinNoise.Noise3d(x,y,z: Double): Double;
  100. Var
  101.   bx0,bx1,by0,by1,bz0,bz1: Integer;
  102.   i,j,k,l: Integer;
  103.   rx0,ry0,rz0: Double;
  104.   sx,sy,sz: Double;
  105.   a,b,c,d,t,u,v: Double;
  106. Begin
  107.   t := x+N;
  108.   bx0 := Trunc(t) And BM;
  109.   bx1 := (bx0+1) And BM;
  110.   rx0 := t-Trunc(t);
  111.  
  112.   t := y+N;
  113.   by0 := Trunc(t) And BM;
  114.   by1 := (by0+1) And BM;
  115.   ry0 := t-Trunc(t);
  116.  
  117.   t := z+N;
  118.   bz0 := Trunc(t) And BM;
  119.   bz1 := (bz0+1) And BM;
  120.   rz0 := t-Trunc(t);
  121.  
  122.   i := P[bx0];
  123.   j := P[bx1];
  124.  
  125.   k := P[i+by0];
  126.   l := P[j+by0];
  127.   i := P[i+by1];
  128.   j := P[j+by1];
  129.  
  130.   sx := (rx0*rx0*(3.0-2.0*rx0));
  131.   sy := (ry0*ry0*(3.0-2.0*ry0));
  132.   sz := (rz0*rz0*(3.0-2.0*rz0));
  133.  
  134.   u := G1[P[k+bz0]];
  135.   v := G1[P[l+bz0]];
  136.   a := u+sx*(v-u);
  137.  
  138.   u := G1[P[i+bz0]];
  139.   v := G1[P[j+bz0]];
  140.   b := u+sx*(v-u);
  141.  
  142.   c := a+sy*(b-a);
  143.  
  144.   u := G1[P[k+bz1]];
  145.   v := G1[P[l+bz1]];
  146.   a := u+sx*(v-u);
  147.  
  148.   u := G1[P[i+bz1]];
  149.   v := G1[P[j+bz1]];
  150.   b := u+sx*(v-u);
  151.  
  152.   d := a+sy*(b-a);
  153.  
  154.   Result := c+sz*(d-c);
  155. End;
  156.  
  157. constructor TPerlinNoise.Create(Seed: Integer);
  158. Begin
  159.   inherited Create;
  160.  
  161.   InitNoise(Seed);
  162. End;
  163.  
  164. procedure TPerlinNoise.InitNoise(Seed: Integer);
  165. Var
  166.   i,j: Integer;
  167. Begin
  168.   RandSeed := Seed;
  169.  
  170.   For i := 0 to _B - 1 Do
  171.   Begin
  172.     P[i] := i;
  173.     G1[i] := 2*Random-1;
  174.   End;
  175.  
  176.   For i := 0 to _B - 1 Do
  177.   Begin
  178.     j := Random(_B);
  179.     P[i] := P[i] xor P[j];
  180.     P[j] := P[j] xor P[i];
  181.     P[i] := P[i] xor P[j];
  182.   End;
  183.  
  184.   For i := 0 to _B+2 - 1 Do
  185.   Begin
  186.     P[_B+i] := P[i];
  187.     G1[_B+i] := G1[i];
  188.   End
  189. End;
  190.  
  191. Function TPerlinNoise.PerlinNoise1d(x: Double;
  192.                                     Persistence: Single = 0.25;
  193.                                     Frequency: Single = 1;
  194.                                     Octaves: Integer = 4): Double;
  195. Var
  196.     i: Integer;
  197.     _p,_s: Double;
  198. Begin
  199.     Result := 0;
  200.     _s := Frequency;
  201.     _p := 1;
  202.     For i := 0 to Octaves - 1 Do
  203.     Begin
  204.         Result := Result + _p * Noise1d(x * _s);
  205.         _s := _s * 2;
  206.         _p := _p * Persistence;
  207.     End;
  208. End;
  209.  
  210. Function TPerlinNoise.PerlinNoise2d(x,y: Double;
  211.                                     Persistence: Single = 0.25;
  212.                                     Frequency: Single = 1;
  213.                                     Octaves: Integer = 4): Double;
  214. Var
  215.     i: Integer;
  216.     _p,_s: Double;
  217. Begin
  218.     Result := 0;
  219.     _s := Frequency;
  220.     _p := 1;
  221.     For i := 0 to Octaves - 1 Do
  222.     Begin
  223.         Result := Result + _p * Noise2d(x * _s,y * _s);
  224.         _s := _s * 2;
  225.         _p := _p * Persistence;
  226.     End;
  227. End;
  228.  
  229. Function TPerlinNoise.PerlinNoise3d(x,y,z: Double;
  230.                                     Persistence: Single = 0.25;
  231.                                     Frequency: Single = 1;
  232.                                     Octaves: Integer = 4): Double;
  233. Var
  234.     i: Integer;
  235.     _p,_s: Double;
  236. Begin
  237.     Result := 0;
  238.     _s := Frequency;
  239.     _p := 1;
  240.     For i := 0 to Octaves - 1 Do
  241.     Begin
  242.         Result := Result + _p * Noise3d(x * _s,y * _s,z * _s);
  243.         _s := _s * 2;
  244.         _p := _p * Persistence;
  245.     End;
  246. End;
  247.  
  248. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement