package Ġorg . river . ex ert ion . k ob old C ave . node . node Mesh Ċ Ċ import Ġorg . river . ex ert ion . k ob old Queue . condition . Probability Ċ import Ġorg . river . ex ert ion . Point Ċ import Ġorg . river . ex ert ion . k ob old C ave . Line Ċ import Ġorg . river . ex ert ion . k ob old C ave . Line . Companion . is Q 1 Ċ import Ġorg . river . ex ert ion . k ob old C ave . Line . Companion . is Q 2 Ċ import Ġorg . river . ex ert ion . k ob old C ave . Line . Companion . is Q 3 Ċ import Ġorg . river . ex ert ion . k ob old C ave . Line . Companion . is Q 4 Ċ import Ġorg . river . ex ert ion . k ob old C ave . node . Node Ċ import Ġorg . river . ex ert ion . k ob old C ave . node . Node . Companion . add Node Ċ import Ġorg . river . ex ert ion . k ob old C ave . node . Node Link Ċ import Ġorg . river . ex ert ion . k ob old C ave . node . Node Link . Companion . add Node Link Ċ import Ġorg . river . ex ert ion . k ob old C ave . node . Node Link . Companion . remove Or phan Links Ċ import Ġorg . river . ex ert ion . radians Ċ import Ġjava . util .* Ċ import Ġkotlin . math . atan Ċ import Ġkotlin . math . cos Ċ import Ġkotlin . math . h ypot Ċ import Ġkotlin . math . sin Ċ import Ġkotlin . random . Random Ċ Ċ class ĠNode Line ( override Ġval Ġuuid : ĠUUID Ġ= ĠUUID . randomUUID (), Ġoverride Ġval Ġdescription : ĠString Ġ= Ġ" node Line ${ Random . nextInt ( 2 5 6 )}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġoverride Ġvar Ġnodes Ġ: ĠMutable List < Node > Ġ= Ġmutable ListOf (), Ġoverride Ġvar Ġnode Links Ġ: ĠMutable List < Node Link > Ġ= Ġmutable ListOf ()) Ġ: ĊĠĠĠ ĠI Node Mesh Ġ{ ĊĊĠĠĠ Ġvar Ġline Noise Ġ: ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ// build Ġconstructor ĊĠĠĠ Ġconstructor ( description : ĠString Ġ= Ġ" node Line ${ Random . nextInt ( 2 5 6 )}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġfirst Node Ġ: ĠNode , Ġlast Node Ġ: ĠNode , Ġline Noise Ġ: ĠInt ) Ġ: Ġthis Ġ( ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwork Node Line Ġ= ĠPair ( first Node , Ġlast Node ). build Node Line ( line Noise , Ġdescription ) ĊĊĠĠĠĠĠĠĠ Ġnodes Ġ= Ġwork Node Line . nodes ĊĠĠĠĠĠĠĠ Ġnode Links Ġ= Ġwork Node Line . node Links ĊĠĠĠĠĠĠĠ Ġthis . line Noise Ġ= Ġline Noise ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// copy Ġconstructor ĊĠĠĠ Ġconstructor ( copy Node Line Ġ: ĠNode Line ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġup d Uuid : ĠUUID Ġ= Ġcopy Node Line . uuid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġup d Description : ĠString Ġ= Ġcopy Node Line . description ) Ġ: Ġthis Ġ( ĊĠĠĠĠĠĠĠ Ġuuid Ġ= Ġup d Uuid ĊĠĠĠĠĠĠĠ Ġ, Ġdescription Ġ= Ġup d Description ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnodes Ġ= Ġmutable ListOf < Node >(). apply Ġ{ Ġadd All ( copy Node Line . nodes ) Ġ} ĊĠĠĠĠĠĠĠ Ġnode Links Ġ= Ġmutable ListOf < Node Link >(). apply Ġ{ Ġadd All ( copy Node Line . node Links ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Line Length () Ġ= Ġnodes . getLine Length () ĊĊĠĠĠ Ġoperator Ġfun Ġplus ( second Line Ġ: ĠNode Line ) Ġ: ĠNode Line Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwork Node Line Ġ= Ġthis ĊĊĠĠĠĠĠĠĠ Ġval Ġwork Nodes Ġ= Ġmutable ListOf < Node >(). apply Ġ{ Ġadd All ( work Node Line . nodes ); Ġadd All ( second Line . nodes ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġwork Node Links Ġ= Ġmutable ListOf < Node Link >(). apply Ġ{ Ġadd All ( work Node Line . node Links ); Ġadd All ( second Line . node Links ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠNode Line ( description Ġ=" ${ work Node Line . description } Ġ+ Ġ${ second Line . description }", Ġnodes Ġ= Ġwork Nodes , Ġnode Links Ġ= Ġwork Node Links ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġminus ( second Line Ġ: ĠNode Line ) Ġ: ĠNode Line Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwork Node Line Ġ= Ġthis ĊĊĠĠĠĠĠĠĠ Ġval Ġwork Nodes Ġ= Ġmutable ListOf < Node >(). apply Ġ{ Ġadd All ( work Node Line . nodes ); Ġremove All ( second Line . nodes ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġwork Node Links Ġ= Ġmutable ListOf < Node Link >(). apply Ġ{ Ġadd All ( work Node Line . node Links ); Ġthis . remove Or phan Links ( work Nodes ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠNode Line ( description Ġ=" ${ work Node Line . description } Ġ+ Ġ${ second Line . description }", Ġnodes Ġ= Ġwork Nodes , Ġnode Links Ġ= Ġwork Node Links ). apply Ġ{ Ġcon solid ate Stack ed Nodes () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"${ Node Line :: class . simple Name } (${ uuid }) Ġ: Ġ$ description , Ġ$ nodes , Ġ$ node Links " ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun ĠMutable List < Node >. getLine Length () Ġ: ĠFloat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Min Ġ= Ġthis . min Of Ġ{ Ġit . position . x Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Max Ġ= Ġthis . max Of Ġ{ Ġit . position . x Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Min Ġ= Ġthis . min Of Ġ{ Ġit . position . y Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Max Ġ= Ġthis . max Of Ġ{ Ġit . position . y Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġh ypot ( x Max Ġ- Ġx Min , Ġy Max Ġ- Ġy Min ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// noise Ġgoes Ġfrom Ġ 0 Ġto Ġ 1 0 0 ĊĠĠĠĠĠĠĠ Ġ// does Ġnode Ġ/ Ġnode Ġneed Ġto Ġbe Ġ" ?" Ġ? ĊĠĠĠĠĠĠĠ Ġfun ĠPair < Node , ĠNode >. build Node Line ( noise Ġ: ĠInt Ġ= Ġ 0 , Ġnode Line Description Ġ: ĠString Ġ= Ġthis . first . description , Ġlink Distance Ġ: ĠFloat Ġ= ĠNode Link . con solid ate Node Distance Ġ+ Ġ 1 ) Ġ: ĠNode Line Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . first . position Ġ== Ġthis . second . position ) Ġreturn ĠNode Line ( description Ġ= Ġnode Line Description , Ġnodes Ġ= Ġmutable ListOf ( this . first )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Line List Ġ= Ġmutable ListOf < Node >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Line Link List Ġ= Ġmutable ListOf < Node Link >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Node Ġ= Ġthis . first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Node Ġ= Ġthis . second ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Length Ġ= Ġmutable ListOf ( this . first , Ġthis . second ). getLine Length () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc apped Noise Ġ= Ġif Ġ( noise Ġ< Ġ 0 ) Ġ 0 Ġelse Ġif Ġ( noise Ġ> Ġ 1 0 0 ) Ġ 1 0 0 Ġelse Ġnoise Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġprintln Ġ(" node Line Ġstart : Ġ$ start Node Ġstep Ġ$ link Distance ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Line List . add Node ( ĠNode ( copy Node Ġ= Ġstart Node , Ġup d Description Ġ= Ġnode Line Description ) Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprevious Node Ġ= Ġstart Node ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠcurrentNode Ġ= Ġstart Node ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Position Ġ: ĠPoint Ġ= ĠcurrentNode . position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Noise Position Ġ: ĠPoint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Position Offset Distance Ġ: ĠFloat Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" noise : Ġ$ noise , Ġnode 1 Pos :${ start Node . position }, Ġnode 2 Pos :${ end Node . position }, Ġline Length : Ġ$ line Length ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLine ( start Node . position , Ġend Node . position ). is Q 4 () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġangle Ġ= Ġatan (( start Node . position . y Ġ- Ġend Node . position . y ) Ġ/ Ġ( end Node . position . x Ġ- Ġstart Node . position . x )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// current Ġposition Ġin Ġmiddle Ġof Ġline ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Position Ġ= ĠPoint ( current Position . x Ġ+ Ġlink Distance Ġ* Ġcos ( angle ), Ġcurrent Position . y Ġ- Ġlink Distance Ġ* Ġsin ( angle )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// get Ġoffset Ġdistance Ġdue Ġto Ġnoise ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Position Offset Distance Ġ= ĠProb ability ( 0 F , Ġ( c apped Noise Ġ/ Ġ 1 0 0 Ġ* Ġlink Distance ) Ġ). getValue () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// find Ġnoise Ġposition Ġat Ġright Ġangle Ġof Ġline Ġangle ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Noise Position Ġ= ĠPoint Ġ( Ġcurrent Position . x Ġ- Ġcurrent Position Offset Distance Ġ* Ġcos ( 9 0 F . radians () Ġ- Ġangle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġcurrent Position . y Ġ- Ġcurrent Position Offset Distance Ġ* Ġsin ( 9 0 F . radians () Ġ- Ġangle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentNode Ġ= ĠNode ( position Ġ= Ġcurrent Noise Position ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" 1 ) Ġnode Ġat Ġ${ currentNode }, Ġangle Ġ${ angle . degrees }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Line Length Ġ= Ġmutable ListOf ( this . first , ĠcurrentNode ). getLine Length () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" current Line Length Ġ= Ġ$ current Line Length ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( Ġcurrent Line Length Ġ< Ġline Length Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Line List . add Node ( ĠNode ( copy Node Ġ= ĠcurrentNode , Ġup d Description Ġ= Ġnode Line Description ) Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Line Link List . add Node Link ( node Line List , Ġprevious Node . uuid , ĠcurrentNode . uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Node Ġ= ĠcurrentNode ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// current Ġposition Ġin Ġmiddle Ġof Ġline ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Position Ġ= ĠPoint ( current Position . x Ġ+ Ġlink Distance Ġ* Ġcos ( angle ), Ġcurrent Position . y Ġ- Ġlink Distance Ġ* Ġsin ( angle )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// get Ġoffset Ġdistance Ġdue Ġto Ġnoise ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Position Offset Distance Ġ= ĠProb ability ( 0 , Ġ( c apped Noise . toDouble () Ġ/ Ġ 1 0 0 Ġ* Ġlink Distance ). toInt () Ġ). getValue () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// find Ġc apped Noise Ġposition Ġat Ġright Ġangle Ġof Ġline Ġangle ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Noise Position Ġ= ĠPoint Ġ( Ġcurrent Position . x Ġ- Ġcurrent Position Offset Distance Ġ* Ġcos ( 9 0 F . radians () Ġ- Ġangle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġcurrent Position . y Ġ- Ġcurrent Position Offset Distance Ġ* Ġsin ( 9 0 F . radians () Ġ- Ġangle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentNode Ġ= ĠNode ( position Ġ= Ġcurrent Noise Position ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" 1 ) Ġnode Ġat Ġ${ currentNode }, Ġangle Ġ${ angle . degrees }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Line Length Ġ= Ġmutable ListOf ( this . first , ĠcurrentNode ). getLine Length () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" current Line Length Ġ= Ġ$ current Line Length ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLine ( start Node . position , Ġend Node . position ). is Q 3 () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġangle Ġ= Ġatan (( start Node . position . y Ġ- Ġend Node . position . y ) Ġ/ Ġ( start Node . position . x Ġ- Ġend Node . position . x )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// current Ġposition Ġin Ġmiddle Ġof Ġline ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Position Ġ= ĠPoint ( current Position . x Ġ- Ġlink Distance Ġ* Ġcos ( angle ), Ġcurrent Position . y Ġ- Ġlink Distance Ġ* Ġsin ( angle )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// get Ġoffset Ġdistance Ġdue Ġto Ġnoise ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Position Offset Distance Ġ= ĠProb ability ( 0 , Ġ( c apped Noise . toDouble () Ġ/ Ġ 1 0 0 Ġ* Ġlink Distance ). toInt () Ġ). getValue () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// find Ġnoise Ġposition Ġat Ġright Ġangle Ġof Ġline Ġangle ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Noise Position Ġ= ĠPoint Ġ( Ġcurrent Position . x Ġ- Ġcurrent Position Offset Distance Ġ* Ġcos ( 9 0 F . radians () Ġ- Ġangle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġcurrent Position . y Ġ+ Ġcurrent Position Offset Distance Ġ* Ġsin ( 9 0 F . radians () Ġ- Ġangle ) Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentNode Ġ= ĠNode ( Ġposition Ġ= Ġcurrent Noise Position Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" 2 ) Ġnode Ġat Ġ${ currentNode }, Ġangle Ġ${ angle . degrees }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Line Length Ġ= Ġmutable ListOf ( this . first , ĠcurrentNode ). getLine Length () Ċ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" current Line Length Ġ= Ġ$ current Line Length ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( Ġcurrent Line Length Ġ< Ġline Length Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Line List . add Node ( ĠNode ( copy Node Ġ= ĠcurrentNode , Ġup d Description Ġ= Ġnode Line Description )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Line Link List . add Node Link ( node Line List , Ġprevious Node . uuid , ĠcurrentNode . uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Node Ġ= ĠcurrentNode ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// current Ġposition Ġin Ġmiddle Ġof Ġline ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Position Ġ= ĠPoint ( current Position . x Ġ- Ġlink Distance Ġ* Ġcos ( angle ), Ġcurrent Position . y Ġ- Ġlink Distance Ġ* Ġsin ( angle )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// get Ġoffset Ġdistance Ġdue Ġto Ġnoise ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Position Offset Distance Ġ= ĠProb ability ( 0 , Ġ( c apped Noise . toDouble () Ġ/ Ġ 1 0 0 Ġ* Ġlink Distance ). toInt () Ġ). getValue () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// find Ġnoise Ġposition Ġat Ġright Ġangle Ġof Ġline Ġangle ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Noise Position Ġ= ĠPoint Ġ( Ġcurrent Position . x Ġ- Ġcurrent Position Offset Distance Ġ* Ġcos ( 9 0 F . radians () Ġ- Ġangle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġcurrent Position . y Ġ+ Ġcurrent Position Offset Distance Ġ* Ġsin ( 9 0 F . radians () Ġ- Ġangle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentNode Ġ= ĠNode ( Ġposition Ġ= Ġcurrent Noise Position Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" 2 ) Ġnode Ġat Ġ${ currentNode }, Ġangle Ġ${ angle . degrees }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Line Length Ġ= Ġmutable ListOf ( this . first , ĠcurrentNode ). getLine Length () Ċ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" current Line Length Ġ= Ġ$ current Line Length ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLine ( start Node . position , Ġend Node . position ). is Q 2 () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġangle Ġ= Ġatan (( end Node . position . y Ġ- Ġstart Node . position . y ) Ġ/ Ġ( start Node . position . x Ġ- Ġend Node . position . x )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// current Ġposition Ġin Ġmiddle Ġof Ġline ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Position Ġ= ĠPoint ( current Position . x Ġ- Ġlink Distance Ġ* Ġcos ( angle ), Ġcurrent Position . y Ġ+ Ġlink Distance Ġ* Ġsin ( angle )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// get Ġoffset Ġdistance Ġdue Ġto Ġnoise ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Position Offset Distance Ġ= ĠProb ability ( 0 , Ġ( c apped Noise . toDouble () Ġ/ Ġ 1 0 0 Ġ* Ġlink Distance ). toInt () Ġ). getValue () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// find Ġnoise Ġposition Ġat Ġright Ġangle Ġof Ġline Ġangle ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Noise Position Ġ= ĠPoint Ġ( Ġcurrent Position . x Ġ+ Ġcurrent Position Offset Distance Ġ* Ġcos ( 9 0 F . radians () Ġ- Ġangle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġcurrent Position . y Ġ+ Ġcurrent Position Offset Distance Ġ* Ġsin ( 9 0 F . radians () Ġ- Ġangle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentNode Ġ= ĠNode ( Ġposition Ġ= Ġcurrent Noise Position Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" 3 ) Ġnode Ġat Ġ${ currentNode }, Ġangle Ġ${ angle . degrees }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Line Length Ġ= Ġmutable ListOf ( this . first , ĠcurrentNode ). getLine Length () Ċ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" current Line Length Ġ= Ġ$ current Line Length ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( Ġcurrent Line Length Ġ< Ġline Length Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Line List . add Node ( ĠNode ( copy Node Ġ= ĠcurrentNode , Ġup d Description Ġ= Ġnode Line Description ) Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Line Link List . add Node Link ( node Line List , Ġprevious Node . uuid , ĠcurrentNode . uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Node Ġ= ĠcurrentNode ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// current Ġposition Ġin Ġmiddle Ġof Ġline ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Position Ġ= ĠPoint ( current Position . x Ġ- Ġlink Distance Ġ* Ġcos ( angle ), Ġcurrent Position . y Ġ+ Ġlink Distance Ġ* Ġsin ( angle )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// get Ġoffset Ġdistance Ġdue Ġto Ġnoise ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Position Offset Distance Ġ= ĠProb ability ( 0 , Ġ( c apped Noise . toDouble () Ġ/ Ġ 1 0 0 Ġ* Ġlink Distance ). toInt () Ġ). getValue () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// find Ġnoise Ġposition Ġat Ġright Ġangle Ġof Ġline Ġangle ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Noise Position Ġ= ĠPoint Ġ( Ġcurrent Position . x Ġ+ Ġcurrent Position Offset Distance Ġ* Ġcos ( 9 0 F . radians () Ġ- Ġangle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġcurrent Position . y Ġ+ Ġcurrent Position Offset Distance Ġ* Ġsin ( 9 0 F . radians () Ġ- Ġangle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentNode Ġ= ĠNode ( position Ġ= Ġcurrent Noise Position Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" 3 ) Ġnode Ġat Ġ${ currentNode }, Ġangle Ġ${ angle . degrees }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Line Length Ġ= Ġmutable ListOf ( this . first , ĠcurrentNode ). getLine Length () Ċ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" current Line Length Ġ= Ġ$ current Line Length ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLine ( start Node . position , Ġend Node . position ). is Q 1 () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġangle Ġ= Ġatan (( end Node . position . y Ġ- Ġstart Node . position . y ) Ġ/ Ġ( end Node . position . x Ġ- Ġstart Node . position . x )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// current Ġposition Ġin Ġmiddle Ġof Ġline ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Position Ġ= ĠPoint ( current Position . x Ġ+ Ġlink Distance Ġ* Ġcos ( angle ), Ġcurrent Position . y Ġ+ Ġlink Distance Ġ* Ġsin ( angle )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// get Ġoffset Ġdistance Ġdue Ġto Ġnoise ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Position Offset Distance Ġ= ĠProb ability ( 0 , Ġ( c apped Noise . toDouble () Ġ/ Ġ 1 0 0 Ġ* Ġlink Distance ). toInt () Ġ). getValue () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// find Ġnoise Ġposition Ġat Ġright Ġangle Ġof Ġline Ġangle ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Noise Position Ġ= ĠPoint Ġ( Ġcurrent Position . x Ġ+ Ġcurrent Position Offset Distance Ġ* Ġcos ( 9 0 F . radians () Ġ- Ġangle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġcurrent Position . y Ġ- Ġcurrent Position Offset Distance Ġ* Ġsin ( 9 0 F . radians () Ġ- Ġangle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentNode Ġ= ĠNode ( position Ġ= Ġcurrent Noise Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" 4 ) Ġnode Ġat Ġ${ currentNode }, Ġangle Ġ${ angle . degrees }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Line Length Ġ= Ġmutable ListOf ( this . first , ĠcurrentNode ). getLine Length () Ċ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" current Line Length Ġ= Ġ$ current Line Length ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( Ġcurrent Line Length Ġ< Ġline Length Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Line List . add Node ( ĠNode ( copy Node Ġ= ĠcurrentNode , Ġup d Description Ġ= Ġnode Line Description ) Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Line Link List . add Node Link ( node Line List , Ġprevious Node . uuid , ĠcurrentNode . uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Node Ġ= ĠcurrentNode ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// current Ġposition Ġin Ġmiddle Ġof Ġline ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Position Ġ= ĠPoint ( current Position . x Ġ+ Ġlink Distance Ġ* Ġcos ( angle ), Ġcurrent Position . y Ġ+ Ġlink Distance Ġ* Ġsin ( angle )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// get Ġoffset Ġdistance Ġdue Ġto Ġnoise ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Position Offset Distance Ġ= ĠProb ability ( 0 , Ġ( c apped Noise . toDouble () Ġ/ Ġ 1 0 0 Ġ* Ġlink Distance ). toInt () Ġ). getValue () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// find Ġnoise Ġposition Ġat Ġright Ġangle Ġof Ġline Ġangle ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Noise Position Ġ= ĠPoint Ġ( Ġcurrent Position . x Ġ+ Ġcurrent Position Offset Distance Ġ* Ġcos ( 9 0 F . radians () Ġ- Ġangle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġcurrent Position . y Ġ- Ġcurrent Position Offset Distance Ġ* Ġsin ( 9 0 F . radians () Ġ- Ġangle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentNode Ġ= ĠNode ( position Ġ= Ġcurrent Noise Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" 4 ) Ġnode Ġat Ġ${ currentNode }, Ġangle Ġ${ angle . degrees }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Line Length Ġ= Ġmutable ListOf ( this . first , ĠcurrentNode ). getLine Length () ĊĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" current Line Length Ġ= Ġ$ current Line Length ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Line List . add Node ( ĠNode ( copy Node Ġ= Ġend Node , Ġup d Description Ġ= Ġnode Line Description ) Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Line Link List . add Node Link ( node Line List , Ġprevious Node . uuid , Ġend Node . uuid ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠ Ġprintln Ġ(" node Line Ġend : Ġ$ end Node , Ġ${ node Line List . size } Ġnodes ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠ Ġnode Line Link List . forEach { Ġprintln (" node Line Ġlink : Ġ$ it ") Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNode Line ( description Ġ= Ġ" path ${ Random . nextInt ( 2 5 6 )} ", Ġnodes Ġ= Ġnode Line List , Ġnode Links Ġ= Ġnode Line Link List ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ }