package Ġapp let Extensions Ċ Ċ import ĠBase Sketch Ċ import Ġapp let Extensions . draw . line Ċ import Ġarrow . core . memo ize Ċ import Ġcontrols . props . types . Cross H atch Prop Ċ import Ġcoordinate . Bound Rect Ċ import Ġcoordinate . Deg Ċ import Ġcoordinate . Line Ċ import Ġcoordinate . Point Ċ import Ġcoordinate . Segment Ċ import Ġutil . Double Range Ċ import Ġutil . at Amount Al ong Ċ import Ġutil . reversed Ċ import Ġjava . awt . Color Ċ Ċ type alias ĠSk etch Ġ= ĠBase Sketch Ċ Ċ private Ġfun Ġget Tangent Corner B ise ctor ( bound : ĠBound Rect , Ġdeg : ĠDe g ): ĠLine Ġ{ ĊĠ Ġval Ġis Up ward Ġ= Ġ( deg . value Ġ% Ġ 1 8 0 ) Ġin Ġ 0 . 0 .. 9 0 . 0 ĊĊĠ Ġval Ġleft Corner B ise ctor Ġ= ĠLine ( bound . top Left , ĠDe g (- 4 5 )) ĊĠ Ġval Ġright Corner B ise ctor Ġ= ĠLine ( bound . top Right , ĠDe g (- 1 3 5 )) ĊĊĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠ Ġdeg . is Vertical () Ġ|| Ġdeg . is Horizontal () Ġ|| Ġis Up ward Ġ-> ĊĠĠĠĠĠ Ġleft Corner B ise ctor ĊĠĠĠ Ġelse Ġ-> Ġright Corner B ise ctor ĊĠ Ġ} Ċ } Ċ Ċ // Ġreturn Ġtrue Ġif Ġsegment Ġwas Ġin Ġbounds Ċ fun ĠSk etch . draw Line Segment ( bound : ĠBound Rect , Ġline : ĠLine ): ĠBoolean Ġ{ ĊĠ Ġval Ġline Segment Ġ= Ġbound . get Bound Segment ( line ) ĊĠ Ġif Ġ( line Segment Ġ!= Ġnull ) Ġ{ ĊĠĠĠ Ġline ( line Segment ) ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġreturn Ġfalse Ċ } Ċ Ċ private Ġfun Ġget Normal ( corner B ise ctor : ĠLine , Ġlines To Draw S lope : ĠDe g ): ĠLine Ġ{ ĊĠ Ġval Ġtangent Line Ġ= ĠLine ( corner B ise ctor . origin , Ġlines To Draw S lope ) ĊĠ Ġval Ġtangent Normal Clock wise Ġ= Ġtangent Line . normal ( true ) ĊĠ Ġval Ġtangent Normal Counter Clock wise Ġ= Ġtangent Line . normal ( false ) ĊĊĠ Ġreturn Ġif Ġ( corner B ise ctor . angle Between ( tang ent Normal Clock wise ) Ġ< ĊĠĠĠ Ġcorner B ise ctor . angle Between ( tang ent Normal Counter Clock wise ) ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġtangent Normal Clock wise ĊĠ Ġ} Ġelse Ġ{ ĊĠĠĠ Ġtangent Normal Counter Clock wise ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġis Moving Away From All C orners ( ĊĠ Ġbound : ĠBound Rect , Ġlast Position : ĠPoint , Ġcurrent Position : ĠPoint , Ċ ): ĠBoolean Ġ{ ĊĠ Ġfun Ġmoving Away From Corner ( corner : ĠPoint ) Ġ= ĊĠĠĠ Ġcorner . dist ( last Position ) Ġ<= Ġcorner . dist ( current Position ) ĊĠ Ġreturn Ġmoving Away From Corner ( bound . top Left ) Ġ&& ĊĠĠĠ Ġmoving Away From Corner ( bound . top Right ) Ġ&& ĊĠĠĠ Ġmoving Away From Corner ( bound . bottom Left ) Ġ&& ĊĠĠĠ Ġmoving Away From Corner ( bound . bottom Right ) Ċ } Ċ Ċ private Ġval Ġget Parallel Lines In Bound Base Ġ= Ġ{ Ġbound : ĠBound Rect , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeg : ĠDe g , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdistance Between : ĠNumber , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset : ĠNumber Ġ-> ĊĠ Ġval Ġcorner And Direction Ġ= Ġget Tangent Corner B ise ctor ( bound , Ġdeg ) ĊĠ Ġval Ġwalk Direction Ġ= Ġget Normal ( corner And Direction , Ġdeg ) ĊĠ Ġvar Ġcurr Dist Ġ= Ġoffset . toDouble () ĊĠ Ġval Ġsegments Ġ= Ġmutable ListOf < Segment >() ĊĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠ Ġval Ġnew Origin Ġ= Ġwalk Direction . get Point At Dist ( curr Dist ) ĊĊĠĠĠ Ġval Ġnullable Segment Ġ= Ġbound . get Bound Segment ( Line ( new Origin , Ġdeg )) ĊĠĠĠ Ġnullable Segment ?. let Ġ{ Ġsegment Ġ-> ĊĠĠĠĠĠ Ġsegments . add ( segment ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġwas In Bound Ġ= Ġnullable Segment Ġ!= Ġnull ĊĊĠĠĠ Ġif Ġ( ĊĠĠĠĠĠ Ġ! was In Bound Ġ&& ĊĠĠĠĠĠ Ġis Moving Away From All C orners ( ĊĠĠĠĠĠĠĠ Ġbound , ĊĠĠĠĠĠĠĠ Ġwalk Direction . get Point At Dist ( ĊĠĠĠĠĠĠĠĠĠ Ġcurr Dist Ġ- Ġdistance Between . toDouble (), ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġnew Origin , ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġ// Ġif Ġyou 're Ġnot Ġcurrently Ġin Ġbounds Ġbut Ġyou Ġwere Ġbefore Ġthat Ġmeans Ġyou 've Ġleft ĊĠĠĠĠĠ Ġ// Ġthe Ġshape . ĊĠĠĠĠĠ Ġbreak ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcurr Dist Ġ+= Ġdistance Between . toDouble () ĊĠ Ġ} ĊĊĠ Ġsegments Ċ } Ċ Ċ val Ġget Parallel Lines In Bound Base Memo ized Ġ= Ġ{ Ġbound : ĠBound Rect , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeg : ĠDe g , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdistance Between : ĠNumber , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset : ĠNumber Ġ-> ĊĠ Ġget Parallel Lines In Bound Base ( bound , Ġdeg , Ġdistance Between , Ġoffset ) Ċ }. memo ize () Ċ Ċ fun ĠBound Rect . parallel Lines In Bound ( deg : ĠDe g , Ġdistance Between : ĠNumber , Ġoffset : ĠNumber Ġ= Ġ 0 . 0 ) Ġ= ĊĠ Ġget Parallel Lines In Bound Memo ( this , Ġdeg , Ġdistance Between , Ġoffset ) Ċ Ċ fun Ġget Parallel Lines In Bound ( ĊĠ Ġbound : ĠBound Rect , ĊĠ Ġdeg : ĠDe g , ĊĠ Ġdistance Between : ĠNumber , ĊĠ Ġoffset : ĠNumber Ġ= Ġ 0 . 0 , Ċ ): ĠList < Segment > Ġ= Ġget Parallel Lines In Bound Base ( bound , Ġdeg , Ġdistance Between , Ġoffset ) Ċ Ċ fun Ġget Parallel Lines In Bound Memo ( ĊĠ Ġbound : ĠBound Rect , ĊĠ Ġdeg : ĠDe g , ĊĠ Ġdistance Between : ĠNumber , ĊĠ Ġoffset : ĠNumber Ġ= Ġ 0 . 0 , Ċ ): ĠList < Segment > Ġ= Ġget Parallel Lines In Bound Base Memo ized ( bound , Ġdeg , Ġdistance Between , Ġoffset ) Ċ Ċ fun Ġget Parallel Lines In Bound Memo ( ĊĠ Ġbound : ĠBound Rect , ĊĠ Ġcross H atch : ĠCross H atch Prop , ĊĠ Ġmin Max Distance : ĠDouble Range , Ċ ): ĠList < Segment > Ġ= Ġget Parallel Lines In Bound Base Memo ized ( ĊĠ Ġbound , ĊĠ Ġcross H atch . line Angle , ĊĠ Ġmin Max Distance . reversed (). at Amount Al ong ( cross H atch . line Density ), ĊĠ Ġmin Max Distance . at Amount Al ong ( cross H atch . line Offset ), Ċ ) Ċ Ċ fun ĠSk etch . draw Parallel Lines In Bound ( ĊĠ Ġbound : ĠBound Rect , ĊĠ Ġdeg : ĠDe g , ĊĠ Ġdistance Between : ĠNumber , ĊĠ Ġoffset : ĠNumber Ġ= Ġ 0 . 0 , ĊĠ Ġstroke Color : ĠColor Ġ= ĠColor . BLACK , Ċ ) Ġ{ ĊĠ Ġval Ġcorner And Direction Ġ= Ġget Tangent Corner B ise ctor ( bound , Ġdeg ) ĊĠ Ġval Ġwalk Direction Ġ= Ġget Normal ( corner And Direction , Ġdeg ) ĊĊĠ Ġif Ġ( isDebug Mode ) Ġ{ ĊĠĠĠ Ġstroke ( Color . RED . rgb ) ĊĠĠĠ Ġline ( walk Direction , Ġ 1 0 , Ġfalse ) ĊĠĠĠ Ġstroke ( stroke Color . rgb ) ĊĠ Ġ} ĊĊĠ Ġvar Ġcurr Dist Ġ= Ġoffset . toDouble () ĊĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠ Ġval Ġnew Origin Ġ= Ġwalk Direction . get Point At Dist ( curr Dist ) ĊĊĠĠĠ Ġval Ġwas In Bound Ġ= Ġdraw Line Segment ( bound , ĠLine ( new Origin , Ġdeg )) ĊĠĠĠ Ġif Ġ( isDebug Mode ) Ġ{ ĊĊĠĠĠĠĠ Ġstroke ( Color . RED . rgb ) ĊĠĠĠĠĠ Ġline ( Line ( new Origin , Ġdeg ), Ġ 5 ) ĊĠĠĠĠĠ Ġstroke ( stroke Color . rgb ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ(! was In Bound Ġ&& Ġis Moving Away From All C orners ( ĊĠĠĠĠĠĠĠ Ġbound , ĊĠĠĠĠĠĠĠ Ġwalk Direction . get Point At Dist ( curr Dist Ġ- Ġdistance Between . toDouble ()), Ġnew Origin , ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġ// Ġif Ġyou 're Ġnot Ġcurrently Ġin Ġbounds Ġbut Ġyou Ġwere Ġbefore Ġthat Ġmeans Ġyou 've Ġleft ĊĠĠĠĠĠ Ġ// Ġthe Ġshape . ĊĠĠĠĠĠ Ġbreak ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcurr Dist Ġ+= Ġdistance Between . toDouble () ĊĠ Ġ} Ċ } Ċ