/** Title: Perlin noise Version: 1.2 Author: Ron Valstar Author URI: http://www.sjeiti.com/ Original code port from http://mrl.nyu.edu/~perlin/noise/ and some help from http://freespace.virgin.net/hugo.elias/models/m_perlin.htm AS3 optimizations by Mario Klingemann http://www.quasimondo.com */ package nl.ronvalstar.math { import flash.display.BitmapData; final public class OptimizedPerlin { private static const p:Array = [ 151,160,137,91,90,15,131,13,201,95, 96,53,194,233,7,225,140,36,103,30,69, 142,8,99,37,240,21,10,23,190,6,148, 247,120,234,75,0,26,197,62,94,252, 219,203,117,35,11,32,57,177,33,88, 237,149,56,87,174,20,125,136,171, 168,68,175,74,165,71,134,139,48,27, 166,77,146,158,231,83,111,229,122, 60,211,133,230,220,105,92,41,55,46, 245,40,244,102,143,54,65,25,63,161, 1,216,80,73,209,76,132,187,208,89, 18,169,200,196,135,130,116,188,159, 86,164,100,109,198,173,186,3,64,52, 217,226,250,124,123,5,202,38,147,118, 126,255,82,85,212,207,206,59,227,47, 16,58,17,182,189,28,42,223,183,170, 213,119,248,152,2,44,154,163,70,221, 153,101,155,167,43,172,9,129,22,39, 253,19,98,108,110,79,113,224,232, 178,185,112,104,218,246,97,228,251, 34,242,193,238,210,144,12,191,179, 162,241,81,51,145,235,249,14,239, 107,49,192,214,31,181,199,106,157, 184,84,204,176,115,121,50,45,127,4, 150,254,138,236,205,93,222,114,67,29, 24,72,243,141,128,195,78,66,215,61, 156,180,151,160,137,91,90,15,131,13, 201,95,96,53,194,233,7,225,140,36, 103,30,69,142,8,99,37,240,21,10,23, 190,6,148,247,120,234,75,0,26,197, 62,94,252,219,203,117,35,11,32,57, 177,33,88,237,149,56,87,174,20,125, 136,171,168,68,175,74,165,71,134,139, 48,27,166,77,146,158,231,83,111,229, 122,60,211,133,230,220,105,92,41,55, 46,245,40,244,102,143,54,65,25,63, 161,1,216,80,73,209,76,132,187,208, 89,18,169,200,196,135,130,116,188, 159,86,164,100,109,198,173,186,3,64, 52,217,226,250,124,123,5,202,38,147, 118,126,255,82,85,212,207,206,59, 227,47,16,58,17,182,189,28,42,223, 183,170,213,119,248,152,2,44,154, 163,70,221,153,101,155,167,43,172,9, 129,22,39,253,19,98,108,110,79,113, 224,232,178,185,112,104,218,246,97, 228,251,34,242,193,238,210,144,12, 191,179,162,241,81,51,145,235,249, 14,239,107,49,192,214,31,181,199, 106,157,184,84,204,176,115,121,50, 45,127,4,150,254,138,236,205,93, 222,114,67,29,24,72,243,141,128, 195,78,66,215,61,156,180]; private static var iOctaves:int = 4; private static var fPersistence:Number = .5; // private static var aOctFreq:Array; // frequency per octave private static var aOctPers:Array; // persistence per octave private static var fPersMax:Number;// 1 / max persistence // private static var iSeed:int = 123; private static var iXoffset:Number; private static var iYoffset:Number; private static var iZoffset:Number; private static const baseFactor:Number = 1 / 64; private static var initialized:Boolean = false // // PUBLIC public static function noise( $x:Number, $y:Number=1, $z:Number=1 ):Number { if ( !initialized ) init(); var s:Number = 0; var fFreq:Number, fPers:Number, x:Number, y:Number, z:Number; var xf:Number, yf:Number, zf:Number, u:Number, v:Number, w:Number; var x1:Number, y1:Number, z1:Number; var X:int, Y:int, Z:int, A:int, B:int, AA:int, AB:int, BA:int, BB:int, hash:int; var g1:Number, g2:Number, g3:Number, g4:Number, g5:Number, g6:Number, g7:Number, g8:Number; $x += iXoffset; $y += iYoffset; $z += iZoffset; for (var i:int;i