Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import 'dart:math' as Math;
- class PerlinNoise {
- int _seed;
- int _octaves;
- double _persistence;
- PerlinNoise ({seed:null,octaves: 1,persistence:1.0}) {
- if (seed == null) {
- Math.Random rand = new Math.Random();
- _seed = rand.nextInt(999999999);
- } else
- _seed = seed;
- _octaves = octaves;
- _persistence = persistence;
- }
- double _noise(int x, int y) {
- Math.Random rand = new Math.Random(x+y+_seed);
- return ((rand.nextDouble()*2)-1);
- }
- double _smoothNoise (int x, int y) {
- double corners = (_noise(x-1,y-1)+_noise(x+1,y-1)+_noise(x-1,y+1)+_noise(x+1,y+1))/16;
- double sides =(_noise(x-1,y)+_noise(x+1,y)+_noise(x,y-1)+_noise(x,y+1))/8;
- double center = _noise(x,y)/4;
- return corners+sides+center;
- }
- double _interpolate (double a,double b,double x) {
- double ft = x * Math.PI;
- double f = (1-Math.cos(ft))*.5;
- return (a*(1-f) + b*f);
- }
- double _interpolatedNoise (double x, double y) {
- int intX = x.floor();
- int intY = y.floor();
- double fracX = x-intX;
- double fracY = x-intY;
- double v1 = _smoothNoise(intX, intY);
- double v2 = _smoothNoise(intX+1, intY);
- double v3 = _smoothNoise(intX, intY+1);
- double v4 = _smoothNoise(intX+1, intY+1);
- double i1 = _interpolate(v1,v2,fracX);
- double i2 = _interpolate(v3,v4,fracX);
- return _interpolate(i1,i2,fracY);
- }
- double perlinNoise(double x, double y) {
- var total = 0;
- for (var i=0; i<_octaves; i++) {
- int frequency = Math.pow(2, i);
- double amplitude = Math.pow(_persistence, i);
- total +=_interpolatedNoise(x*frequency, y*frequency)*amplitude;
- }
- return total;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement