-module(noise_simplex). -define(LutMask, 127). -define(F2, 0.5). -define(G2, 0.25). -define(Grad2D, { {0.465254262011416, -0.885177084927198}, {0.999814701091156, -0.0192500255065206}, {0.562013227349949, 0.827128244157878}, {0.540531763173497, -0.841323607775599}, {-0.97869393624958, 0.20532457024989}, {-0.022259068317433, 0.999752236245381}, {-0.763453105361241, -0.645863264100288}, {-0.877652307360767, 0.479297848299283}, {-0.429945697678765, 0.902854748587789}, {-0.880336026899474, 0.474350587374832}, {-0.999734062007074, 0.0230609033395389}, {0.961877124516138, -0.273481987217745}, {0.485111864938318, 0.874452101887844}, {-0.307899752943979, 0.951418804805243}, {-0.991765219175154, 0.128069317303008}, {0.937814305853532, -0.347137332674633}, {-0.398552509901734, -0.917145515635893}, {0.701222178891205, -0.712942813857514}, {0.873193936119955, 0.487372906431349}, {-0.514304676201594, -0.857607544298191}, {0.0428414754286589, 0.999081882521696}, {-0.88038067821201, 0.474267710719338}, {0.14177264550869, 0.989899245875795}, {-0.887664663265946, -0.46049044027966}, {0.999983713358517, -0.00570727760945115}, {-0.623600504016441, -0.781743187620104}, {0.888019464508127, -0.459805861918592}, {0.600087177175954, -0.79993460969569}, {-0.560441030370991, 0.828194331951567}, {0.958552181052623, -0.284917033887514}, {0.6683586377581, 0.743839183785136}, {0.709718808827001, 0.704485068966819}, {0.695776987881928, 0.718257880662615}, {0.154316110318401, -0.988021527142096}, {-0.725364342269412, -0.688365143629501}, {-0.999918869545931, 0.0127379090116007}, {0.805508244111792, 0.592584566680519}, {-0.996506623245929, 0.0835137702836865}, {-0.73969279786535, -0.67294469667732}, {0.695504007775371, -0.718522216196824}, {-0.999983227160896, 0.00579183881678425}, {-0.714924640549655, 0.699201514825981}, {-0.835103934916504, -0.550092190352645}, {0.84959050330652, 0.527442865807639}, {-0.171610706906682, 0.985164841676249}, {0.3561994988697, 0.934409929851441}, {-0.409182557485348, -0.912452538299801}, {0.463529807851185, 0.886081326534672}, {-0.962925769084928, -0.269766497608949}, {0.744285209959416, 0.66786190656128}, {-0.691027420259623, 0.722828544296177}, {0.981612661017864, 0.190883691627725}, {0.928340009081787, 0.371732198683444}, {-0.120562843572988, 0.992705696946278}, {0.789437446513116, -0.61383101749818}, {0.999774655712189, -0.0212282310985648}, {-0.902267580211854, 0.431176545858708}, {-0.912180652347305, -0.4097883081339}, {-0.770294485489921, -0.637688329533965}, {0.20063205075057, 0.979666667908846}, {-0.982785937329741, -0.184747940142514}, {0.857295252061123, -0.514825068147866}, {-0.6880675701609, -0.725646621223357}, {0.703885918434739, -0.710313039320893}, {0.80736694412922, -0.590049673779628}, {0.501306939228223, -0.865269526033149}, {0.994382489412099, -0.105846420584718}, {0.496494368044017, -0.868039942917705}, {0.077642279257408, -0.996981281906393}, {0.951970808735996, -0.30618879684687}, {-0.761381916275718, -0.648303615267041}, {0.925704511866975, 0.378247480770363}, {0.307462004306155, 0.951560358520699}, {-0.722833511616144, -0.6910222243059}, {0.365487416741135, -0.930816280585966}, {-0.452581511359919, 0.891723037481466}, {-0.696052038963733, -0.717991336336609}, {-0.731589205376628, -0.681745725748533}, {-0.584030912612065, 0.811731416857521}, {-0.622817071437575, -0.782367493909303}, {-0.250124556053565, -0.968213667771224}, {-0.972374793807189, -0.233425063710878}, {-0.970811073944879, 0.239845489234194}, {0.972096169972212, -0.234582685476477}, {-0.56398693111627, -0.825783713529185}, {-0.697050386134155, 0.717022146931478}, {-0.0346220968223854, -0.999400475490992}, {-0.218763172462792, -0.975777984161364}, {-0.526228595935678, 0.850343145335791}, {0.878475471267297, 0.477787448957902}, {-0.543258510315468, 0.839565477476188}, {-0.424638392098636, 0.905363040970795}, {-0.511241626148254, -0.859437024855975}, {0.310536598007565, -0.950561424263518}, {0.647207900842245, 0.762313539881967}, {-0.998374197564832, 0.0569996634795082}, {-0.384499699032222, 0.923125116895933}, {0.793017652527103, -0.609198656252953}, {-0.108016962369769, 0.994149051118799}, {-0.931126682943364, 0.364695901143526}, {-0.801286360381044, -0.598281011454734}, {0.875902620980454, -0.482487925817394}, {-0.731473336626206, 0.681870044660216}, {-0.315759562725525, -0.948839237461956}, {-0.0770741115938651, -0.997025366438596}, {-0.822418334736048, 0.568883188967635}, {-0.998852401248829, -0.0478944727442276}, {0.996841343178929, -0.0794187416749304}, {-0.632437179039341, 0.774611654036241}, {0.719989390873874, 0.693985069745068}, {0.99256596306396, -0.121707883750037}, {0.851153933233715, -0.524916166583558}, {0.952866133004913, 0.303391055524489}, {0.983070281370671, 0.183228878416556}, {0.751614346163695, 0.659602815822462}, {0.549915829679874, 0.83522007894177}, {0.529779603383605, 0.8481353499523}, {-0.738299650910558, -0.67447285005799}, {-0.888225309084572, -0.459408097775406}, {0.69138401830353, 0.722487466489534}, {0.895582660271765, -0.4448951546382}, {-0.823764839572624, -0.566931644101728}, {0.481527438369519, 0.876431016165727}, {-0.393245292146023, 0.9194335974963}, {0.511430719572624, 0.859324513252955}, {0.709782009015835, 0.704421393540433}, {-0.123429256704187, -0.992353373848979}, {-0.796333188996483, -0.60485820826264} }). -define(F3, 1 / 3). -define(G3, 1 / 6). -define(Grad3D, { {0.969192790963703, -0.204588387787502, -0.137145636191962}, {0.0105050866706296, 0.869235070511719, -0.494287401565657}, {-0.00713466534361336, -0.0561560433951495, -0.998396512083569}, {-0.99998707996014, 0.00085789886042815, 0.00501038145637507}, {-0.729044421579981, -0.0724223391156089, 0.680624151907743}, {-0.769477416524206, 0.638612501748049, 0.00886442724220208}, {-0.148489274637499, -0.733777362959066, 0.662964340614538}, {0.00192647521945516, -0.688227670545063, 0.725492220626345}, {0.307853961011481, -0.888296843306306, 0.340814695782903}, {-0.136873983993337, 0.99058218544213, 0.0035279442294635}, {0.981422965662359, 0.0873011939299262, -0.170843390299155}, {0.977985182924792, 0.0274298762917452, 0.206863684261352}, {-4.10904184278805E-08, -0.984715746607902, -0.174169165992265}, {-0.00576047279073815, -0.00207046110763061, 0.999981264896512}, {0.385796494451913, -0.382885124111844, 0.839380751865608}, {0.196898025871543, -0.533803208609833, 0.822365674068256}, {-0.953574229510659, -0.197141111727736, -0.227665480211439}, {0.958192898763756, -0.00565943080050262, 0.286067019423289}, {-0.000021414243574488, 0.308183457620683, 0.951326944846192}, {-0.00156590253858546, -0.936777289401244, -0.349922645753741}, {0.010162930999189, 0.907036729301754, 0.420928837846829}, {-0.0468274165634939, 0.74026530347444, -0.670682095727837}, {-0.958782958606567, 0.0676203469753538, -0.275975953591197}, {0.000771226398681087, -0.963152702156633, 0.268954043543163}, {-0.939601847652347, 0.341933173840782, -0.0151681414637957}, {0.0836248033533964, 0.431468628956066, 0.898243683245743}, {-0.97637082132863, 0.118948680332271, 0.180419596234078}, {0.103518422502263, 0.000465187240855595, -0.994627427634827}, {-0.141353740004181, 0.0778654829014707, -0.98689213532146}, {0.0700630230682292, 0.912644877864809, -0.402703985212052}, {0.991874945122624, -0.0502217417385342, 0.116884001876814}, {-0.707119760481927, 0.700142261026601, -0.0989063125414175}, {0.0976913606831578, 0.99518571412564, -0.00786081726752686}, {0.865756754070504, 0.268594575188625, 0.422282129577546}, {0.0124864728918991, -0.922679395826772, -0.385365826859963}, {-0.0174011080646746, -0.984212730893662, 0.176132057800279}, {0.983085383617433, 0.183144250425653, 0.00114544916535278}, {0.84177325324929, -0.000849099388075524, 0.539830593005191}, {-0.773202768542597, 0.634158480426922, -0.000707404184135718}, {-0.399463762408861, 0.520122522942901, -0.754918050949683}, {-0.0543404007696243, 0.853240000077495, -0.51867969221086}, {0.0787561128671418, -0.0445112338899157, -0.995899706167069}, {-0.149110911377271, -0.855893524471146, -0.495189065788614}, {0.128579845943545, 0.95447163354276, 0.26916746456314}, {-6.48712081276198E-06, -0.417292224145094, 0.908772358528778}, {-0.18395289837094, 0.967255425062472, 0.174866445804071}, {-0.0956465003848313, -0.995413983868259, -0.00165761384418054}, {-0.493402767926647, 0.252656257103973, 0.83229713705415}, {0.941743815026262, -0.00313821941824732, 0.336316426061328}, {-0.406002839825049, -0.660621950516609, -0.631458892208849}, {-0.0151930656231186, 0.000118750826499392, 0.999884571665756}, {0.681786958463344, -0.719431781259153, 0.132606392695014}, {0.973323591185432, -0.228922756390528, 0.0153479134887209}, {-0.810634856852843, -0.585551171144037, 0.000977152504195713}, {-0.181398855060402, -0.831693356111209, 0.524767202465292}, {-0.733900500867695, 0.679256981569713, 8.84021970721802E-05}, {0.271727663466327, -0.889119678670303, -0.368280156821335}, {0.298233653375395, -0.0312311598898426, -0.953981814630813}, {-0.752318728102205, -0.00392703305301813, 0.658787605953604}, {0.00665991896444102, -0.893539727653096, 0.448934739784101}, {-0.17274029679022, 0.981849574845414, 0.0783083791219516}, {0.740984319707759, -1.24163939998686E-09, 0.671522328703395}, {-0.91345982474963, 0.00101800775270491, 0.40692764986984}, {0.166118424599226, -0.966950978532905, -0.193417874362556}, {-0.371630916510155, 0.92837704130171, -0.00255559732836468}, {0.114876798169617, 0.991537470331245, 0.0604712011738797}, {0.42509283827761, -0.861877415693766, -0.276520160498508}, {0.0914177278602429, 0.937282941514681, 0.336368081985282}, {-0.138897098096673, 0.574329772420649, -0.806754552916541}, {4.20730659972853E-05, -0.973522779481066, 0.228590017413966}, {-0.19883302527571, -0.769560727972852, -0.606829229702725}, {0.0747279815185906, 0.375429090417211, 0.92383371168553}, {0.0360592551928224, 0.999349653582228, 1.40580077597545E-07}, {-0.630789398266975, 0.775912761477526, 0.00800759703705387}, {0.999468273136104, 0.0122075383077114, -0.0302348640281232}, {0.0234858830298487, 0.722121551769761, -0.691367397096465}, {0.044647769484317, -0.998966611124733, -0.00850214902496602}, {-0.155624581702642, 0.0567240593672596, -0.98618627584183}, {-0.564856042306962, 0.825189463979779, 2.46592673497201E-06}, {-0.00280893077197093, -0.849678682544325, 0.527293320968186}, {0.85760478967376, 0.0912484314080345, -0.506149926893406}, {-0.983676972673489, -0.138789081908023, -0.11453036355067}, {-0.995791780173427, 0.0916344946719056, 0.00136011957614869}, {0.0705163298667096, 0.9883873876068, -0.134602448870495}, {0.151288867759186, -0.946777269461834, -0.28412053871999}, {-0.479182164834798, 2.28582795501955E-06, 0.877715473772117}, {-0.920617168247744, -0.0874211800038508, -0.380554288918466}, {0.647008224881357, -0.0116892424293656, -0.76239341454875}, {0.00348600295131339, 0.00264876419739902, 0.999990415869897}, {0.293662611616922, 0.774229458412962, -0.560652313170918}, {-0.0230822002633608, -0.133701316157593, -0.99075282996756}, {0.0891587773276397, -0.70303221860981, -0.705546888606285}, {-0.716380181025389, -0.675240051032385, 0.175642562369752}, {-0.110229513550145, -0.0380431704478986, 0.993177814655951}, {0.901899360101853, -0.423583957873496, -0.0845823556073773}, {-0.188144760211676, 0.981876973408649, 0.0227850454193412}, {-0.992971049488398, -0.00105311622549315, -0.118352802350111}, {0.974825103742426, -0.22297088847484, 2.51166485428216E-06}, {0.917736330268161, 0.253456586759036, -0.305810050087285}, {0.754361752313554, 0.655909079393725, -0.0268631013715986}, {-0.00493426945610691, 0.999852337890823, -0.0164607229243032}, {0.172163344055272, 0.977404359568319, -0.122639719750783}, {0.20654798485596, 0.00802290795582379, 0.978403578744413}, {-0.0189935909416278, -0.956252765802595, -0.291924461801387}, {-0.298030174309119, -0.101625749247146, -0.949131298762838}, {-0.525057139557522, -0.851050276233871, 0.00533174661105069}, {0.00362214069523366, 0.401488407244411, -0.915856942401558}, {0.7517944143271, 0.19472711592481, 0.629989292694866}, {0.501284099317453, -0.0225214021165674, 0.864989617404853}, {-0.985033512468648, 0.1680612553394, -0.0382673982316817}, {0.00137633273570574, -0.0442369494900767, -0.999020118920542}, {-0.724166817672979, -0.688818418185576, 0.033340770082758}, {-0.0128146550963728, -0.0397993929245446, 0.99912551410601}, {0.802033957950016, 0.595775400910827, -0.0423462154693413}, {-0.902335114745471, -0.411652900762455, -0.127801525777801}, {7.40750655087705E-05, -0.890177016591854, 0.455614830360591}, {-0.0563694832642116, 0.998393830705426, -0.00567804243293261}, {0.804825783463094, 0.0873894235068948, -0.587042202002675}, {0.902405167679558, 0.0887442050097385, -0.421650778989461}, {0.0138828478418606, -0.26021714739708, 0.965450310858268}, {-0.0235002961872274, -0.1428517727679, -0.989465061079056}, {0.543378228613975, 0.00830368325812741, 0.839446930730399}, {-0.956960500295924, 0.0113747804839107, 0.289995198653906}, {-0.00858337504492301, -0.949962410388146, -0.312246288244364}, {-0.731827611403257, 0.00140870300297461, -0.681488343806152}, {0.844453636307317, 0.498643416559842, -0.195583228444764}, {-0.997648624781726, 0.000128342870118087, -0.0685361583343983}, {0.00700544496566235, -0.020878882722484, 0.999757468587804} }). -define(F4, (math:sqrt(5.0) - 1.0) / 4.0). -define(G4, (5.0 - math:sqrt(5.0)) / 20.0). -define(Grad4D, { {0.0179285344989033,0.0677944464204167, 0.900387877028038,0.429399757319696}, {0.151459767976519,0.41940331430838, 0.025942750707592,-0.894699822464143}, {0.979529859361997,0.130367466451577, -0.00937681736873056,-0.153093610595927}, {0.0188035720634411,0.957989228554963, -0.269676405489343,0.0958003130092474}, {-0.0012369876892,-7.87528807201163E-05, 0.000149907955282427,-0.999999220593219}, {-0.0515998001407824,-0.944373511413844, 0.324801510463498,0.000332213707707317}, {0.0625583127110917,0.368853467530968, 0.927379950072298,7.21458539681357E-05}, {-0.0332301888025581,0.00487951365898265, -0.999435388671684,0.000921286751161818}, {0.254162385940239,-0.00247502010266267, 0.000438725101563024,0.967158292819196}, {-0.759302539566954,-0.650633735433763, -0.0116359665914368,2.04111122123566E-06}, {-4.48759951174869E-08,0.358287711147997, -0.933611212169481,0.000143358851029576}, {-0.834876133401752,-0.194359576306317, -0.0344898444893627,-0.513825503066234}, {0.992418907081551,4.57210674843702E-06, -1.83490711870738E-06,0.122901232063752}, {-0.42938540950326,0.513195588850885, -0.743126271370401,-0.00466931352956133}, {0.570845731350832,1.65553932296542E-05, 0.0011349034293071,0.821056552692115}, {2.31617888342864E-05,0.994847097173254, -0.0961577881592109,-0.0321392670390731}, {0.0285107567449309,-0.0502599346018885, -0.998329141978559,2.92045363529652E-10}, {0.693061667730217,0.081528197183571, -0.606560258101509,0.380924311483053}, {-0.471772182045896,-0.105811692623359, 0.875348441445287,3.33769803143138E-06}, {0.362766768879719,0.923039277394957, -0.128057658031582,-1.49328116922925E-06}, {0.062046368142898,-0.815075843570167, 0.576022235980786,-3.29295020122024E-05}, {-0.921787687217261,0.28869133264405, 0.0732935586853114,-0.248179024911652}, {-5.47319853185622E-06,0.973767617716296, 0.225257152279963,-0.0321844994352065}, {0.232218374389583,-0.08472237319722, -0.137241903519584,0.95919831421558}, {-0.0167570140621457,0.358790865544362, 0.933267510677344,0.000266074731502954}, {0.0107254303176227,-0.737658920753904, 1.52650004111161E-06,-0.675088351087735}, {-3.71325911057143E-06,-0.448149367809768, 0.893952928186452,0.00321034340618395}, {-0.0163066755437812,-0.0444639669567192, -0.998877894427004,-5.06860474025719E-07}, {0.085934337625112,-8.88863502634554E-05, 0.996300798791311,6.62916977146475E-06}, {0.018848679157187,-0.168704308520019, 0.583111361978302,0.794458761115151}, {-0.14092365680382,-0.0262056616259223, 0.00425806403039333,-0.989664415416913}, {0.000019585584043321,0.0708482693257697, 0.094787939700978,0.992973196434421}, {-3.61195284939247E-07,0.573786610288797, -0.00565371182001549,-0.818985324285984}, {0.555482972457819,-0.831524637330389, 0.00233255322693632,6.33832316941843E-05}, {0.800371000342067,0.168341324992158, 8.13736079413595E-08,-0.575384619286367}, {-0.151943784159287,-3.17003100215728E-06, -0.973809705113584,0.169138241305451}, {-3.28617107642979E-10,-2.51664008452886E-05, -0.999999889743206,0.000468913880721174}, {0.144708070244843,-0.392246876333683, -0.14750809340107,0.896350001279446}, {-0.499891693213082,0.000469340668710032, -0.0432191264563471,0.865008775611117}, {-0.74530243187983,-0.0130445109718722, 0.0435702095816092,0.665173483088833}, {-0.796157099668477,0.000124118278989671, -0.00217167212139707,-0.605086060889134}, {0.947484791701284,0.0724121319093247, 3.87510235633725E-05,-0.311494865359736}, {0.999997268027888,-0.00183696890994059, 0.00144542293102575,0.000015314536027456}, {0.246103794412299,0.967730041656212, 0.05414322404818,-1.18997457774053E-05}, {4.28260722805506E-05,-0.999999938144512, -0.00024875421527231,-0.000244945380014729}, {0.345932094721763,-0.00182445228148537, -2.01050360940934E-07,0.938257777593794}, {0.232629530802398,-0.0123421039259699, -0.000333195046776704,-0.972487050222468}, {-0.0413343034477463,-0.845558019383741, -0.532041468453896,0.0159683142427982}, {4.876953380543E-11,-0.509395810571092, -0.760866765012863,-0.401992131852703}, {0.01457871782159,0.00352273519283274, 2.46006626805202E-08,0.999887519335769}, {-0.2197566484112,-0.269663250455668, 0.936190779005179,-0.0503544649304871}, {-0.0865455281910523,0.0990053597028644, -2.66646365439371E-05,0.991316200608683}, {-0.989058271919771,-0.130356511156493, -0.0535910970499983,-0.0435764737348075}, {0.900013078389142,-0.00043287841542218, -2.83509325586139E-08,-0.435862674869937}, {-0.771015568252326,-4.76900694356318E-05, -0.0219363831312084,0.636438360199416}, {-0.078643371273305,0.996901923608738, -6.16073674743889E-06,0.00133222446022512}, {5.20470758906282E-05,0.997256243992129, 0.0740268623204818,6.90275154123082E-05}, {-0.115896931950432,-0.300911764975683, 0.431409257232567,-0.842559234497932}, {-1.05936323695781E-10,-0.0143409648185513, -0.999897162703251,2.73141203266667E-05}, {7.36602805763734E-06,0.0490840386576873, -0.187410880606716,0.981054493351418}, {-0.149217229776082,0.096219097342591, 0.984104045608208,-0.00391549001869267}, {0.0301779956805262,-2.03984355987402E-05, -0.999544181133284,-0.00084742150235282}, {0.101389753295397,0.00105726742868962, 0.994846219323528,3.15683454673068E-06}, {-0.0132313717977117,0.159525525289995, 0.593084588401323,-0.789067302948319}, {-0.999950751279126,-2.28154321862005E-06, -3.35621991002035E-07,0.00992446527495385}, {-0.446140024906362,-0.89496104730281, -0.000949959838625011,-0.00170281047488805}, {-0.25830870420065,-5.99271603499866E-11, -0.962897969373127,-0.0781288289384209}, {-0.0141578535996954,-0.590108238154547, 0.772903767582682,-0.232790868592566}, {-0.0408946388040428,-0.487869969082088, -2.38283754617856E-06,-0.871957866974805}, {0.993390567418713,0.114783068234581, 0.000166763855068009,-7.22479963187292E-13}, {-0.150270957910884,0.98861713652712, 0.00724343322227505,0.00152618760893165}, {-0.0292187624948691,0.984282454781429, -2.54315254401317E-06,-0.174167485832589}, {0.605498435491149,0.0295366828327539, -0.261172160527168,0.75119127494306}, {-0.00453574210785455,0.0164722766698647, -0.00759597400463439,-0.99982518088102}, {-0.161906996023123,-0.968938255461586, 0.00479280806368259,0.186873782892868}, {0.0718297493332595,-0.15117444225596, -0.95710224645937,0.236520749495151}, {1.55364291766971E-08,0.751515349174519, -0.513260578427611,-0.414473471512055}, {-0.0832231266679871,-0.016036973751982, -0.150197717417989,0.985016432524305}, {-0.0499060179903397,0.113056945464528, 0.760889993198006,0.637003873380466}, {-0.912217939109183,-0.000236556733323175, 0.409698193304452,-0.00240125204303045}, {-0.0201341577237124,0.822200561754789, -0.0353638581788924,-0.567741357906546}, {0.981833737365851,-0.189743278357464, 1.93574210616191E-05,1.06610391592544E-05}, {-3.1713467661518E-06,-0.999998467923194, -3.10580174237511E-07,-0.00175046882587876}, {0.999785072721677,0.00661572799000603, -0.000560396757787285,-0.0196399201003463}, {0.947369318875243,0.10413625625988, 0.014573335884325,0.302381599419074}, {0.000539050555161111,0.363169172188698, -0.0860769990608411,0.927738439447755}, {0.0218600193860152,0.0136508664574171, -0.957380820600311,0.287676481040908}, {0.0452753695684423,-3.62412965753121E-05, 0.412640274130687,-0.909768181331025}, {-6.91937018588465E-08,0.000924049891480408, -0.998173949198153,0.0603979575313267}, {0.0524759516860929,0.0348710315338021, -0.997989141515491,-0.00692524884613554}, {-0.000620065691267785,-0.297909553995998, -0.954593871695887,-0.000230818326052339}, {-6.96674135940915E-05,-0.867754661790055, 0.496992798829057,3.74443548432658E-07}, {-0.0482481401493802,0.00489619615662811, -0.995799001490995,0.0776691242699415}, {-0.151673443794422,-0.974774864011805, -0.000484445743305936,-0.163734224432859}, {-0.049803009786826,0.0811460037036778, -0.0626532599996605,-0.993483545566061}, {-0.0609700565049769,0.169557563496092, 0.340322391745786,0.922883283274476}, {-0.907810279284789,-9.09566645872125E-05, -6.82944907490262E-07,-0.419381077960479}, {-0.0974613227620325,0.995239313157134, 5.15261588579082E-11,-1.05825987794001E-05}, {-0.0186861500087666,0.00438118107716855, 0.992023504204221,-0.124583306091132}, {-0.930838673636572,-0.0110467691436416, -0.00188202425659556,0.365258525620815}, {-0.0567494686643164,-2.42763994429726E-09, 0.975143948519116,-0.214181645975711}, {0.0304023604642125,-0.632969000014441, 0.773579295645911,0.00100739609776072}, {0.000108520483850958,0.0583209179359306, -0.00851497409325953,-0.998261565908758}, {-0.02385578591046,-0.129946314819517, 0.0562422070557562,-0.989637141021354}, {-0.00504915323521923,-0.0089236566539032, -0.000176312774898594,0.999947420276354}, {9.54792136888334E-10,0.95741607332861, -0.000200174641238177,0.288711659726688}, {0.994168345296552,0.107836831627415, 0.000720385221359334,1.00702166459814E-07}, {-0.442903722280488,0.0490533033131452, -0.286717020869704,0.848070407553381}, {-0.579123085419419,0.000412386634095739, 0.000548850089152674,-0.81523983013291}, {-0.99748331906203,-0.00315622682426633, -0.0314712268933373,-0.0634557192304806}, {-0.999910167988914,0.00277348539595252, -0.0131131747511067,-9.15373542722021E-05}, {0.989849756616008,-0.102100397263962, -0.0925741321036343,-0.0346842654676267}, {-0.0502665295186573,-0.0019502335925594, 0.995313667448867,-0.0825843568030342}, {-0.775008311628356,0.00458914577239442, 0.631802950284916,0.012887538916389}, {-0.917122758231958,3.16141922995542E-09, 0.00144102092010558,-0.398602270178826}, {0.298077607094876,0.0476089996782551, 0.875582290533107,0.377145563149066}, {0.263407146338272,-0.473950966620194, 0.840230003541957,-0.000835251815231092}, {-0.55558964464076,0.00104388539977359, -0.000884120434714965,-0.831455516189702}, {0.857295578944858,-0.0176694994052872, -0.51054240707814,-0.0638633673339165}, {0.0864515147611175,-0.35114135064002, 0.922138824225689,0.137425893927874}, {0.968780126999011,0.203315714499582, -0.141786558529076,-0.00493534089860906}, {-0.0103473943005527,-0.0446849068409796, -0.625161129502578,-0.779146810742919}, {-0.810284066914716,-0.582923322911606, -0.0599165375134594,0.00708089275712812}, {-0.914614581816782,0.366353079295109, 0.00173954895166334,-0.171063035131932}, {-0.0017333110902601,0.0325427046350465, -0.999147497892685,0.0253425622715693}, {0.000847670819166468,0.0188099412466175, 0.999636928304481,0.019273793982079}, {0.100715508011326,0.994914522159042, -0.000565737742910064,0.00107702547448881}, {-0.414687299306508,-0.734201866849646, -0.536852323837964,-0.0277784970462061} }). -define(Simplex4D, { {0,1,2,3}, {0,1,3,2}, {0,0,0,0}, {0,2,3,1}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {1,2,3,0}, {0,2,1,3}, {0,0,0,0}, {0,3,1,2}, {0,3,2,1}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {1,3,2,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {1,2,0,3}, {0,0,0,0}, {1,3,0,2}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {2,3,0,1}, {2,3,1,0}, {1,0,2,3}, {1,0,3,2}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {2,0,3,1}, {0,0,0,0}, {2,1,3,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {2,0,1,3}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {3,0,1,2}, {3,0,2,1}, {0,0,0,0}, {3,1,2,0}, {2,1,0,3}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {3,1,0,2}, {0,0,0,0}, {3,2,0,1}, {3,2,1,0} }). %% API exports -export([raw/2]). %%==================================================================== %% API functions %%==================================================================== raw(Seed, {X, Y}) -> T = (X + Y) * ?F2, {I, J} = {trunc(X + T), trunc(Y + T)}, TT = (I + J) * ?G2, {X0, Y0} = {X - (I - TT), Y - (I - TT)}, {I1, J1} = if X0 > Y0 -> {1, 0}; true -> {0, 1} end, {X1, Y1} = {X0 - I1 + ?G2, Y0 - J1 + ?G2}, {X2, Y2} = {X0 - 1.0 + 2.0 * ?G2, Y0 - 1.0 + 2.0 * ?G2}, T0 = 0.6 - X0 * X0 - Y0 * Y0, N0 = if T0 < 0 -> 0.0; true -> math:pow(T0, 4) * dot(gcoord(Seed, {I, J}), {X0, Y0}) end, T1 = 0.6 - X1 * X1 - Y1 * Y1, N1 = if T1 < 0 -> 0.0; true -> math:pow(T1, 4) * dot(gcoord(Seed, {I + I1, J + J1}), {X1, Y1}) end, T2 = 0.6 - X2 * X2 - Y2 * Y2, N2 = if T2 < 0 -> 0.0; true -> math:pow(T2, 4) * dot(gcoord(Seed, {I + 1, J + 1}), {X2, Y2}) end, 27.7 * (N0 + N1 + N2); raw(Seed, {X, Y, Z}) -> T = (X + Y + Z) * ?F3, {I, J, K} = {trunc(X + T), trunc(Y + T), trunc(Z + T)}, TT = (I + J + K) * ?G3, {X0, Y0, Z0} = {X - (I - TT), Y - (J - TT), Z - (K - TT)}, {I1, J1, K1, I2, J2, K2} = if X0 >= Y0 -> if Y0 >= Z0 -> {1, 0, 0, 1, 1, 0}; X0 >= Z0 -> {1, 0, 0, 1, 0, 1}; true -> {0, 0, 1, 1, 0, 1} end; Y0 < Z0 -> {0, 0, 1, 0, 1, 1}; X0 < Z0 -> {0, 1, 0, 0, 1, 1}; true -> {0, 1, 0, 1, 1, 0} end, {X1, Y1, Z1} = {X0 - I1 + ?G3, Y0 - J1 + ?G3, Z0 - K1 + ?G3}, X2 = X0 - I2 + 2.0 * ?G3, Y2 = Y0 - J2 + 2.0 * ?G3, Z2 = Z0 - K2 + 2.0 * ?G3, X3 = X0 - 1.0 + 3.0 * ?G3, Y3 = Y0 - 1.0 + 3.0 * ?G3, Z3 = Z0 - 1.0 + 3.0 * ?G3, T0 = 0.6 - X0 * X0 - Y0 * Y0 - Z0 * Z0, N0 = if T0 < 0 -> 0.0; true -> math:pow(T0, 4) * dot(gcoord(Seed, {I, J, K}), {X0, Y0, Z0}) end, T1 = 0.6 - X1 * X1 - Y1 * Y1 - Z1 * Z1, N1 = if T1 < 0 -> 0.0; true -> math:pow(T1, 4) * dot( gcoord(Seed, {I + I1, J + J1, K + K1}), {X1, Y1, Z1} ) end, T2 = 0.6 - X2 * X2 - Y2 * Y2 - Z2 * Z2, N2 = if T2 < 0 -> 0.0; true -> math:pow(T2, 4) * dot( gcoord(Seed, {I + I2, J + J2, K + K2}), {X2, Y2, Z2} ) end, T3 = 0.6 - X3 * X3 - Y3 * Y3 - Z3 * Z3, N3 = if T3 < 0 -> 0.0; true -> math:pow(T3, 4) * dot( gcoord(Seed, {I + 1, J + 1, K + 1}), {X3, Y3, Z3} ) end, 40.0 * (N0 + N1 + N2 + N3); raw(Seed, {X, Y, Z, W}) -> T = (X + Y + Z + W) * ?F4, {I, J, K, L} = {trunc(X + T), trunc(Y + T), trunc(Z + T), trunc(W + T)}, TT = (I + J + K + L) * ?G4, {X0, Y0, Z0, W0} = {X - (I - TT), Y - (J - TT), Z - (K - TT), W - (L - TT)}, C = ( (if X0 > Y0 -> 32; true -> 0 end) + (if X0 > Z0 -> 16; true -> 0 end) + (if Y0 > Z0 -> 8; true -> 0 end) + (if X0 > W0 -> 4; true -> 0 end) + (if Y0 > W0 -> 2; true -> 0 end) + (if Z0 > W0 -> 1; true -> 0 end) ), CC = element(C + 1, ?Simplex4D), {C0, C1, C2, C3} = { element(1, CC), element(2, CC), element(3, CC), element(4, CC) }, I1 = if C0 >= 3 -> 1; true -> 0 end, J1 = if C1 >= 3 -> 1; true -> 0 end, K1 = if C2 >= 3 -> 1; true -> 0 end, L1 = if C3 >= 3 -> 1; true -> 0 end, I2 = if C0 >= 2 -> 1; true -> 0 end, J2 = if C1 >= 2 -> 1; true -> 0 end, K2 = if C2 >= 2 -> 1; true -> 0 end, L2 = if C3 >= 2 -> 1; true -> 0 end, I3 = if C0 >= 1 -> 1; true -> 0 end, J3 = if C1 >= 1 -> 1; true -> 0 end, K3 = if C2 >= 1 -> 1; true -> 0 end, L3 = if C3 >= 1 -> 1; true -> 0 end, X1 = X0 - I1 + ?G4, Y1 = Y0 - J1 + ?G4, Z1 = Z0 - K1 + ?G4, W1 = W0 - L1 + ?G4, X2 = X0 - I2 + 2.0 * ?G4, Y2 = Y0 - J2 + 2.0 * ?G4, Z2 = Z0 - K2 + 2.0 * ?G4, W2 = W0 - L2 + 2.0 * ?G4, X3 = X0 - I3 + 3.0 * ?G4, Y3 = Y0 - J3 + 3.0 * ?G4, Z3 = Z0 - K3 + 3.0 * ?G4, W3 = W0 - L3 + 3.0 * ?G4, X4 = X0 - 1.0 + 4.0 * ?G4, Y4 = Y0 - 1.0 + 4.0 * ?G4, Z4 = Z0 - 1.0 + 4.0 * ?G4, W4 = W0 - 1.0 + 4.0 * ?G4, T0 = 0.6 - X0 * X0 - Y0 * Y0 - Z0 * Z0 - W0 * W0, N0 = if T0 < 0 -> 0.0; true -> math:pow(T0, 4) * dot( gcoord(Seed, {I, J, K, L}), {X0, Y0, Z0, W0} ) end, T1 = 0.6 - X1 * X1 - Y1 * Y1 - Z1 * Z1 - W1 * W1, N1 = if T1 < 0 -> 0.0; true -> math:pow(T1, 4) * dot( gcoord(Seed, {I + I1, J + J1, K + K1, L + L1}), {x1, y1, z1, w1} ) end, T2 = 0.6 - X2 * X2 - Y2 * Y2 - Z2 * Z2 - W2 * W2, N2 = if T2 < 0 -> 0.0; true -> math:pow(T2, 4) * dot( gcoord(Seed, {I + I2, J + J2, K + K2, L + L2}), {X2, Y2, Z2, W2} ) end, T3 = 0.6 - X3 * X3 - Y3 * Y3 - Z3 * Z3 - W3 * W3, N3 = if T3 < 0 -> 0.0; true -> math:pow(T3, 4) * dot( gcoord(Seed, {I + I3, J + I3, K + K3, L + L3}), {X3, Y3, Z3, W3} ) end, T4 = 0.6 - X4 * X4 - Y4 * Y4 - Z4 * Z4 - W4 * W4, N4 = if T4 < 0 -> 0.0; true -> math:pow(T4, 4) * dot( gcoord(Seed, {I + 1, J + 1, K + 1, L + 1}), {X4, Y4, Z4, W4} ) end, 44.5 * (N0 + N1 + N2 + N3 + N4). %%==================================================================== %% Internal functions %%==================================================================== coord(Seed, Position) -> Hash = trunc(seed_hash(Seed, Position)), ((Hash bxor (Hash bsr 16)) rem ?LutMask) + 1. dot(G, {X, Y}) -> element(1, G) * X + element(2, G) * Y; dot(G, {X, Y, Z}) -> element(1, G) * X + element(2, G) * Y + element(3, G) * Z; dot(G, {X, Y, Z, W}) -> element(1, G) * X + element(2, G) * Y + element(3, G) * Z + element(4, G) * W. gcoord(Seed, {I, J}) -> element(coord(Seed, {I, J}), ?Grad2D); gcoord(Seed, {I, J, K}) -> element(coord(Seed, {I, J, K}), ?Grad3D); gcoord(Seed, {I, J, K, L}) -> element(coord(Seed, {I, J, K, L}), ?Grad4D). seed_hash(Seed, {X, Y}) -> (((Seed bxor X) * 15485863) bxor Y) * 10057189; seed_hash(Seed, {X, Y, Z}) -> (seed_hash(Seed, {X, Y}) bxor Z) * 987391; seed_hash(Seed, {X, Y, Z, W}) -> (seed_hash(Seed, {X, Y, Z}) bxor W) * 418493.