About Monkey 2 › Forums › Monkey 2 Projects › today i haz bin perlin
This topic contains 2 replies, has 2 voices, and was last updated by
cocon 2 years, 2 months ago.
Viewing 3 posts - 1 through 3 (of 3 total)
-
AuthorPosts
-
January 22, 2017 at 6:27 pm #6737
Probably the least efficient way to render it, doesn’t pan properly when it zooms, shore logarithm is just a radius but you can rip the naff bits out and use the noise functions for yourself…
[/crayon]Monkey123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261[crayon-5cba8437843fd717606728 inline="true" ]#Remas Ken Perlin has asserted his copyright but not specified a licence I don't knowthe legality of using this...// JAVA REFERENCE IMPLEMENTATION OF IMPROVED NOISE - COPYRIGHT 2002 KEN PERLIN.public final class ImprovedNoise {static public double noise(double x, double y, double z) {int X = (int)Math.floor(x) & 255, // FIND UNIT CUBE THATY = (int)Math.floor(y) & 255, // CONTAINS POINT.Z = (int)Math.floor(z) & 255;x -= Math.floor(x); // FIND RELATIVE X,Y,Zy -= Math.floor(y); // OF POINT IN CUBE.z -= Math.floor(z);double u = fade(x), // COMPUTE FADE CURVESv = fade(y), // FOR EACH OF X,Y,Z.w = fade(z);int A = p[X ]+Y, AA = p[A]+Z, AB = p[A+1]+Z, // HASH COORDINATES OFB = p[X+1]+Y, BA = p[B]+Z, BB = p[B+1]+Z; // THE 8 CUBE CORNERS,return lerp(w, lerp(v, lerp(u, grad(p[AA ], x , y , z ), // AND ADDgrad(p[BA ], x-1, y , z )), // BLENDEDlerp(u, grad(p[AB ], x , y-1, z ), // RESULTSgrad(p[BB ], x-1, y-1, z ))),// FROM 8lerp(v, lerp(u, grad(p[AA+1], x , y , z-1 ), // CORNERSgrad(p[BA+1], x-1, y , z-1 )), // OF CUBElerp(u, grad(p[AB+1], x , y-1, z-1 ),grad(p[BB+1], x-1, y-1, z-1 ))));}static double fade(double t) { return t * t * t * (t * (t * 6 - 15) + 10); }static double lerp(double t, double a, double b) { return a + t * (b - a); }static double grad(int hash, double x, double y, double z) {int h = hash & 15; // CONVERT LO 4 BITS OF HASH CODEdouble u = h<8 ? x : y, // INTO 12 GRADIENT DIRECTIONS.v = h<4 ? y : h==12||h==14 ? x : z;return ((h&1) == 0 ? u : -u) + ((h&2) == 0 ? v : -v);}static final int p[] = new int[512], permutation[] = { 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};static { for (int i=0; i < 256 ; i++) p[256+i] = p[i] = permutation[i]; }}#end rem#Import "<std>"#Import "<mojo>"Using std..Using mojo..Global permutation:Int[] = New Int[](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)Global p:Int[] = new int[512]Global zoom:Float=1Global offx:Float=0Global offy:Float=0Global map:Float[] = New Float[256*256]Global ap:AppInstanceClass awindow Extends WindowMethod New()ClearColor=Color.BlackupdateMap()End MethodMethod OnRender( canvas:Canvas ) OverrideApp.RequestRender()For Local y:int = 0 To 255For Local x:int = 0 To 255Local v:Float=map[x+(y*256)]If v<.2 Thencanvas.Color=New Color(0,0,v+.5)elseIf v<.4 Thencanvas.Color=New Color(v,v,0)elseIf v<.7 Thencanvas.Color=New Color(0,v,0)elsecanvas.Color=New Color(v,v,v)Endifcanvas.DrawPoint(x+100,y+100)NextNextLocal update:Bool = FalseIf Keyboard.KeyDown(Key.Comma) Thenzoom=zoom-1If zoom<1 Thenzoom=1Elseoffx-=64offy-=64update = TrueEndifEnd IfIf Keyboard.KeyDown(Key.Period) Thenzoom=zoom+1offx+=64offy+=64update = trueEnd IfIf Keyboard.KeyDown(Key.Left) Thenoffx-=8update = trueEnd IfIf Keyboard.KeyDown(Key.Right) Thenoffx+=8update = trueEnd IfIf Keyboard.KeyDown(Key.Up) Thenoffy-=8update = trueEnd IfIf Keyboard.KeyDown(Key.Down) Thenoffy+=8update = trueEnd IfIf update Then updateMap()End MethodEnd ClassFunction Main()For Local i:int=0 To 255 ' no static code blocks :( so do it herep[256+i] = permutation[i]p[i] = permutation[i]NextNew AppInstanceNew awindowApp.Run()End FunctionFunction updateMap()Local min:Double=1000000Local max:Double=-1000000Local o:doubleFor Local y:Int = 0 To 255For Local x:int = 0 To 255Local o1:Double = (noise(((x+offx)/15.0)/zoom,((y+offy)/15.0)/zoom,1)+.6)/3.3Local o2:Double = (noise(((x+offx)/7.0)/zoom,((y+offy)/7.0)/zoom,1)+.6)/3.3Local o3:Double = (noise(((x+offx)/2.0)/zoom,((y+offy)/2.0)/zoom,1)+.6)/3.3Local d:DoubleLocal xd:double = Abs(((x+offx)/zoom)-128)Local yd:Double = Abs(((y+offy)/zoom)-128)d = Sqrt( xd*xd + yd*yd )If d>100 Thend = 1.0 - ( (d-100) / 40 )If d<0 Then d=0Elsed = 1Endifo = (o1 + o2 + o3) * dIf o>1 then o=1map[x+(y*256)] = oIf o<min Then min = oIf o>max Then max = oNextNextPrint zoom+" "+offx+","+offyEnd FunctionFunction grad:double(hash:Int, x:double, y:double, z:double)local h:Int = hash & 15 ' CONVERT LO 4 BITS OF HASH CODElocal u:double = h<8 ? x Else y ' INTO 12 GRADIENT DIRECTIONS.local v:double = h<4 ? y Else ((h=12 Or h=14) ? x else z)return ((h&1) = 0 ? u Else -u) + ((h&2) = 0 ? v Else -v)End FunctionFunction lerp:double(t:double , a:double, b:double)return a + t * (b - a)End FunctionFunction fade:double(t:Double)return t * t * t * (t * (t * 6 - 15) + 10)End FunctionFunction noise:double(x:double, y:double, z:double)'YUK Perlin what were you thinking X & x terrible practice.....Local t:Int = Floor(x) '// FIND UNIT CUBE THATLocal X:Int = t & 255t = Floor(y)local Y:int = t & 255 '// CONTAINS POINT.t = Floor(z)Local Z:int = t & 255x -= Floor(x) '// FIND RELATIVE X,Y,Zy -= Floor(y) '// OF POINT IN CUBE.z -= Floor(z)local u:double = fade(x) '// COMPUTE FADE CURVESlocal v:double = fade(y) '// FOR EACH OF X,Y,Z.Local w:double = fade(z)local A:int = p[X ]+YLocal AA:Int = p[A]+ZLocal AB:int = p[A+1]+Z '// HASH COORDINATES OFLocal B:int = p[X+1]+YLocal BA:Int = p[B]+ZLocal BB:int = p[B+1]+Z '// THE 8 CUBE CORNERS,return lerp(w, lerp(v, lerp(u, grad(p[AA ], x , y , z ), '// AND ADDgrad(p[BA ], x-1, y , z )), '// BLENDEDlerp(u, grad(p[AB ], x , y-1, z ), '// RESULTSgrad(p[BB ], x-1, y-1, z ))),'// FROM 8lerp(v, lerp(u, grad(p[AA+1], x , y , z-1 ), '// CORNERSgrad(p[BA+1], x-1, y , z-1 )), '// OF CUBElerp(u, grad(p[AB+1], x , y-1, z-1 ),grad(p[BB+1], x-1, y-1, z-1 ))))End FunctionJanuary 23, 2017 at 10:19 am #6750see some rather better implementations http://monkey2.monkey-x.com/forums/topic/perlin-noise/
January 23, 2017 at 6:31 pm #6757Nice one.
-
AuthorPosts
Viewing 3 posts - 1 through 3 (of 3 total)
You must be logged in to reply to this topic.