/** Ċ Ġ* ĠSh ame less Ġclone Ġof Ġhttp :// ro ber thod gin . com / project / me ander Ċ Ġ* ĠExt ensive Ġnotes Ġon Ġimplementation Ġin Ġthe ĠMe and ering R iver Ġclass Ċ Ġ* Ġsrc / main / kotlin / shape / Me and ering R iver . kt Ċ Ġ*/ Ċ package Ġsketch Ċ Ċ import Ġnoise . per lin Curl Ċ import Ġnoise . simp lex Curl Ċ import Ġorg . open rnd r . application Ċ import Ġorg . open rnd r . color . Color RGB a Ċ import Ġorg . open rnd r . draw . is olated Ċ import Ġorg . open rnd r . extensions . Screenshots Ċ import Ġorg . open rnd r . extra . noise . random Ċ import Ġorg . open rnd r . extra . noise . simp lex Ċ import Ġorg . open rnd r . extra . shade styles . Linear Gradient Ċ import Ġorg . open rnd r . extra . shade styles . Rad ial Gradient Ċ import Ġorg . open rnd r . extras . color . presets . LIGHT _ SL ATE _ GRAY Ċ import Ġorg . open rnd r . extras . color . presets . WHITE _ S MO KE Ċ import Ġorg . open rnd r . math . Vector 2 Ċ import Ġorg . open rnd r . math . map Ċ import Ġorg . open rnd r . shape . Rectangle Ċ import Ġorg . open rnd r . shape . Shape Contour Ċ import Ġshape . Fr act al ized Line Ċ import Ġshape . me ander R iver Ċ import Ġutil . Mix Noise Ċ import Ġutil . Mix able Noise Ċ import Ġutil . timestamp Ċ import Ġkotlin . math . PI Ċ import Ġkotlin . math . atan 2 Ċ import Ġkotlin . math . h ypot Ċ import Ġkotlin . random . Random Ċ Ċ fun Ġmain () Ġ= Ġapplication Ġ{ ĊĠ Ġconfigure Ġ{ ĊĠĠĠ Ġwidth Ġ= Ġ 5 0 0 ĊĠĠĠ Ġheight Ġ= Ġ 8 0 0 ĊĠ Ġ} ĊĊĠ Ġprogram Ġ{ ĊĠĠĠ Ġval Ġprog Name Ġ= Ġthis . name . if Blank Ġ{ Ġthis . window . title . if Blank Ġ{ Ġ" my - amaz ing - drawing " Ġ} Ġ} ĊĠĠĠ Ġ// ĠSeed Ġis Ġthe Ġbasis Ġfor Ġall Ġour Ġrandom ization , Ġbecause Ġit Ġis Ġused Ġto Ġcreate Ġa Ġsee ded ĠR NG Ġ( Random ( seed )) ĊĠĠĠ Ġvar Ġseed Ġ= Ġrandom ( 0 . 0 , ĠInt . MAX _ VALUE . toDouble ()). toInt () ĊĠĠĠ Ġ// Ġseed Ġ= Ġ 3 5 9 5 6 1 7 6 3 ĊĠĠĠ Ġ// Ġseed Ġ= Ġ 1 2 8 8 8 1 8 0 4 1 ĊĠĠĠ Ġprintln (" seed Ġ= Ġ$ seed ") ĊĠĠĠ Ġval Ġrng Ġ= ĠRandom ( seed ) ĊĊĠĠĠ Ġval Ġbg Gradient Ġ= ĠRad ial Gradient ( Color RGB a . WHITE _ S MO KE , ĠColor RGB a . WHITE _ S MO KE . mix ( Color RGB a . LIGHT _ SL ATE _ GRAY , Ġ 0 . 2 ), ĠVector 2 . ZERO ) ĊĠĠĠ Ġval Ġpur ple Ġ= ĠColor RGB a . from Hex (" 8 A 4 DC B ") ĊĠĠĠ Ġval Ġblue Ġ= ĠColor RGB a . from Hex (" 4 F 8 CE 8 ") ĊĠĠĠ Ġval Ġopacity Ġ= Ġ 0 . 0 5 ĊĠĠĠ Ġval Ġfg Gradient Ġ= ĠLinear Gradient ( purple . op ac ify ( opacity ), Ġblue . op ac ify ( opacity ), Ġrotation Ġ= ĠPI Ġ/ Ġ 2 . 0 ) ĊĊĠĠĠ Ġval Ġscreenshots Ġ= Ġextend ( Screenshots ()) Ġ{ ĊĠĠĠĠĠ Ġquit After Screenshot Ġ= Ġfalse ĊĠĠĠĠĠ Ġscale Ġ= Ġ 4 . 0 ĊĠĠĠĠĠ Ġname Ġ= Ġ" screenshots /$ prog Name /${ timestamp ()} - seed -$ seed . png " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġnoise Scale Ġ= Ġh ypot ( width Ġ* Ġ 0 . 5 , Ġheight Ġ* Ġ 0 . 5 ) Ġ* Ġ 0 . 5 ĊĊĠĠĠ Ġval Ġnoise 1 Ġ= ĠMix able Noise ( noise Scale Ġ* Ġ 0 . 7 , Ġ 0 . 1 Ġto Ġ 0 . 5 , Ġ{ Ġpt Ġ-> Ġper lin Curl ( seed , Ġpt ) Ġ}, Ġ{ Ġpt Ġ-> Ġsimp lex ( seed , Ġpt Ġ/ Ġnoise Scale Ġ* Ġ 0 . 1 5 ) Ġ}, Ġ- 1 . 0 Ġto Ġ 1 . 0 ) ĊĠĠĠ Ġval Ġnoise 2 Ġ= ĠMix able Noise ( noise Scale Ġ* Ġ 1 . 5 , Ġ 0 . 5 Ġto Ġ 1 . 0 , Ġ{ Ġpt Ġ-> Ġsimp lex Curl ( seed , Ġpt ) Ġ}, Ġ{ Ġpt Ġ-> Ġsimp lex ( seed , Ġpt Ġ/ Ġnoise Scale Ġ* Ġ 0 . 7 5 ) Ġ}, Ġ- 1 . 0 Ġto Ġ 1 . 0 ) ĊĠĠĠ Ġval Ġmix able Ġ= ĠMix Noise ( listOf ( noise 1 , Ġnoise 2 )) ĊĊĠĠĠ Ġ// Ġtaking Ġthe Ġlog 1 0 Ġof Ġthe Ġsimp lex Ġnoise Ġ( adjusted Ġto Ġrange Ġ 0 . 1 Ġto Ġ 1 . 0 ) Ġgives Ġus Ġa Ġdistribution Ġweighted Ġtowards Ġthe Ġlarger Ġmagnitude s ĊĠĠĠ Ġval Ġscaled Param Ġ= Ġ{ Ġstart : ĠDouble , Ġend : ĠDouble Ġ-> ĊĠĠĠĠĠ Ġ{ Ġpt : ĠVector 2 Ġ-> ĊĠĠĠĠĠĠĠ Ġ// Ġmap (- 1 . 0 , Ġ 0 . 0 , Ġstart , Ġend , Ġlog 1 0 ( simp lex ( seed , Ġpt Ġ/ Ġnoise Scale ) Ġ* Ġ 0 . 4 5 Ġ+ Ġ 0 . 5 5 )) Ġ// Ġalternative , Ġnon - mixed Ġnoise ĊĠĠĠĠĠĠĠ Ġval Ġnoise Ġ= Ġmix able . mix ( pt ) ĊĠĠĠĠĠĠĠ Ġmap (- PI , ĠPI , Ġstart , Ġend , Ġatan 2 ( noise . y , Ġnoise . x )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġriver Ġ= Ġme ander R iver Ġ{ ĊĠĠĠĠĠ Ġthis . points Ġ= ĠFr act al ized Line ( listOf ( Vector 2 ( width Ġ* Ġ 0 . 5 , Ġheight Ġ* Ġ- 0 . 1 ), ĠVector 2 ( width Ġ* Ġ 0 . 5 , Ġheight Ġ* Ġ 1 . 1 )), Ġrng ). per pend icular Sub divide ( 1 1 , Ġ 0 . 4 5 ). points ĊĠĠĠĠĠ Ġ// Ġdefinitely Ġsome Ġfine - tuning Ġthat Ġcould Ġhappen Ġwith Ġthese Ġparams ... ĊĠĠĠĠĠ Ġthis . me ander Strength Ġ= Ġscaled Param ( 5 . 0 , Ġ 6 . 5 ) ĊĠĠĠĠĠ Ġ// Ġthis . cur v ature Scale Ġ= Ġ{ Ġpt : ĠVector 2 Ġ-> ĊĠĠĠĠĠ Ġ// ĠĠ Ġval Ġnoise Scale Map Ġ= Ġmap (- 1 . 0 , Ġ 1 . 0 , Ġnoise Scale Ġ* Ġ 0 . 7 5 , Ġnoise Scale Ġ* Ġ 1 . 5 , Ġsimp lex ( seed , Ġnoise Scale )) ĊĠĠĠĠĠ Ġ// ĠĠ Ġmap (- 1 . 0 , Ġ 0 . 0 , Ġ 1 . 0 , Ġ 1 7 5 . 0 , Ġlog 1 0 ( simp lex ( seed , Ġpt Ġ/ Ġnoise Scale Map ) Ġ* Ġ 0 . 4 5 Ġ+ Ġ 0 . 5 5 )). toInt () ĊĠĠĠĠĠ Ġ// Ġ} ĊĠĠĠĠĠ Ġthis . cur v ature Scale Ġ= Ġ{ Ġpt : ĠVector 2 Ġ-> ĊĠĠĠĠĠĠĠ Ġ// Ġmap (- 1 . 0 , Ġ 0 . 0 , Ġstart , Ġend , Ġlog 1 0 ( simp lex ( seed , Ġpt Ġ/ Ġnoise Scale ) Ġ* Ġ 0 . 4 5 Ġ+ Ġ 0 . 5 5 )) ĊĠĠĠĠĠĠĠ Ġval Ġnoise Ġ= Ġmix able . mix ( pt ) ĊĠĠĠĠĠĠĠ Ġmap (- PI , ĠPI , Ġ 1 . 0 , Ġ 1 7 5 . 0 , Ġatan 2 ( noise . y , Ġnoise . x )). toInt () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġthis . tang ent Bit ang ent Ratio Ġ= Ġscaled Param ( 0 . 1 , Ġ 0 . 9 ) ĊĠĠĠĠĠ Ġ// Ġthis . should Smooth Ġ= Ġfalse ĊĠĠĠĠĠ Ġthis . smooth ness Ġ= Ġ 1 ĊĠĠĠĠĠ Ġthis . ox bow Shrink Rate Ġ= Ġ 1 0 . 0 ĊĠĠĠĠĠ Ġthis . point Target Distance Ġ= Ġscaled Param ( 1 . 0 , Ġ 2 . 0 ) ĊĠĠĠĠĠ Ġthis . first Fixed Point Pct Ġ= Ġ 0 . 0 1 ĊĠĠĠĠĠ Ġthis . last Fixed Point Pct Ġ= Ġ 0 . 9 9 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġlayer Size Ġ= Ġ 1 2 ĊĠĠĠ Ġval Ġhistorical Record Ġ= Ġmutable ListOf < Shape Contour >() ĊĠĠĠ Ġvar Ġchannels Ġ= Ġmutable ListOf < Shape Contour >() ĊĊĠĠĠ Ġval Ġdraw Every N th Ġ= Ġ 3 ĊĠĠĠ Ġvar Ġdraw Index Ġ= Ġ 1 ĊĊĠĠĠ Ġfun Ġchannels To Contour ( channels : ĠList < Shape Contour >): ĠShape Contour Ġ{ ĊĠĠĠĠĠ Ġval Ġfirst Ġ= Ġchannels . first (). clock wise . segments ĊĠĠĠĠĠ Ġval Ġlast Ġ= Ġchannels . last (). counter Clock wise . segments ĊĠĠĠĠĠ Ġ// ĠSometimes Ġthe Ġfirst Ġand Ġlast Ġcont ours Ġdon 't Ġmatch Ġup Ġcorrectly . ĊĠĠĠĠĠ Ġ// ĠShape Contour Ġdoesn 't Ġallow Ġthis , Ġbut Ġwe Ġdon 't Ġreally Ġcare Ġfor Ġour Ġpurposes , ĊĠĠĠĠĠ Ġ// Ġso Ġwe Ġcan Ġjust Ġdraw Ġan Ġopen ĠShape Contour Ġof Ġthe Ġfirst Ġline . ĠIt Ġwill Ġjust Ġlook Ġlike Ġone Ġedge Ġof Ġthe Ġshape ĊĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠ ĠShape Contour ( first Ġ+ Ġlast , Ġclosed Ġ= Ġtrue ) ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠ ĠShape Contour ( first , Ġclosed Ġ= Ġfalse ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġextend Ġ{ ĊĠĠĠĠĠ Ġdrawer . is olated Ġ{ Ġ// Ġbg Ġgradient ĊĠĠĠĠĠĠĠ Ġstroke Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġsh ade Style Ġ= Ġbg Gradient ĊĠĠĠĠĠĠĠ Ġrectangle ( Rectangle ( Vector 2 . ZERO , Ġwidth . toDouble (), Ġheight . toDouble ())) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġriver . run () ĊĠĠĠĠĠ Ġchannels . add ( river . channel ) ĊĊĠĠĠĠĠ Ġif Ġ( channels . size Ġ> Ġ 0 Ġ&& Ġchannels . size Ġ% Ġlayer Size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( draw Index Ġ== Ġdraw Every N th ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġhistorical Record . add ( channels To Contour ( channels )) ĊĠĠĠĠĠĠĠĠĠ Ġchannels Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠ Ġdraw Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdraw Index ++ ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġdrawer . stroke Weight Ġ= Ġ 0 . 5 ĊĊĠĠĠĠĠ Ġdrawer . is olated Ġ{ Ġ// Ġ" h istorical Ġrecord " ĊĠĠĠĠĠĠĠ Ġstroke Ġ= Ġpur ple . mix ( blue , Ġ 0 . 5 ). op ac ify ( opacity Ġ* Ġ 0 . 5 ) ĊĠĠĠĠĠĠĠ Ġsh ade Style Ġ= Ġfg Gradient ĊĠĠĠĠĠĠĠ Ġcont ours ( h istorical Record ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġdrawer . is olated Ġ{ Ġ// Ġactive Ġchannel ĊĠĠĠĠĠĠĠ Ġif Ġ( channels . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġfill Ġ= Ġblue . mix ( Color RGB a . WHITE , Ġ 0 . 5 ). op ac ify ( opacity Ġ* Ġ 2 . 0 ) ĊĠĠĠĠĠĠĠĠĠ Ġsh ade Style Ġ= Ġfg Gradient ĊĠĠĠĠĠĠĠĠĠ Ġstroke Ġ= Ġpur ple . mix ( blue , Ġ 0 . 5 ). op ac ify ( opacity Ġ* Ġ 3 . 0 ) ĊĠĠĠĠĠĠĠĠĠ Ġcontour ( channels To Contour ( channels )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( true Ġ&& Ġframe Count Ġ% Ġ 1 0 0 0 Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscreenshots . name Ġ= Ġ" screenshots /$ prog Name /${ timestamp ()} - seed -$ seed . png " ĊĠĠĠĠĠĠĠ Ġscreenshots . trigger () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ