Advertisement
Guest User

PerlinNoise Dart

a guest
Sep 30th, 2013
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.74 KB | None | 0 0
  1. import 'dart:math' as Math;
  2.  
  3. class PerlinNoise {
  4.   int _seed;
  5.   int _octaves;
  6.   double _persistence;
  7.  
  8.  
  9.   PerlinNoise ({seed:null,octaves: 1,persistence:1.0}) {
  10.     if (seed == null) {
  11.       Math.Random rand = new Math.Random();
  12.       _seed = rand.nextInt(999999999);
  13.     } else
  14.       _seed = seed;
  15.     _octaves = octaves;
  16.     _persistence = persistence;
  17.   }
  18.  
  19.   double _noise(int x, int y) {
  20.     Math.Random rand = new Math.Random(x+y+_seed);
  21.     return ((rand.nextDouble()*2)-1);
  22.   }
  23.  
  24.   double _smoothNoise (int x, int y) {
  25.     double corners = (_noise(x-1,y-1)+_noise(x+1,y-1)+_noise(x-1,y+1)+_noise(x+1,y+1))/16;
  26.     double sides  =(_noise(x-1,y)+_noise(x+1,y)+_noise(x,y-1)+_noise(x,y+1))/8;
  27.     double center = _noise(x,y)/4;
  28.     return corners+sides+center;
  29.   }
  30.  
  31.   double _interpolate (double a,double b,double x) {
  32.     double ft = x * Math.PI;
  33.     double f = (1-Math.cos(ft))*.5;
  34.     return (a*(1-f) + b*f);
  35.   }
  36.  
  37.   double _interpolatedNoise (double x, double y) {
  38.     int intX = x.floor();
  39.     int intY = y.floor();
  40.    
  41.     double fracX = x-intX;
  42.     double fracY = x-intY;
  43.    
  44.     double v1 = _smoothNoise(intX, intY);
  45.     double v2 = _smoothNoise(intX+1, intY);
  46.     double v3 = _smoothNoise(intX, intY+1);
  47.     double v4 = _smoothNoise(intX+1, intY+1);
  48.    
  49.     double i1 = _interpolate(v1,v2,fracX);
  50.     double i2 = _interpolate(v3,v4,fracX);
  51.    
  52.     return _interpolate(i1,i2,fracY);
  53.   }
  54.  
  55.   double perlinNoise(double x, double y) {
  56.     var total = 0;
  57.    
  58.     for (var i=0; i<_octaves; i++) {
  59.       int frequency = Math.pow(2, i);
  60.       double amplitude = Math.pow(_persistence, i);
  61.      
  62.       total +=_interpolatedNoise(x*frequency, y*frequency)*amplitude;
  63.     }
  64.     return total;
  65.   }
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement