/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠIT MO ĠUniversity Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġru . it mo . idu . tile _ renderer Ċ Ċ import Ġorg . location tech . jts . geom . Coordinate Ċ import Ġjava . awt . Basic Stroke Ċ import Ġjava . awt . Shape Ċ import Ġjava . awt . Stroke Ċ import Ġjava . awt . geom .* Ċ Ċ /** Ċ Ġ* ĠSt roke Ġthat Ġrenders Ġarbitrary Ġshapes Ġalong Ġthe Ġmain Ġline . ĠCan Ġbe Ġused Ġto Ġrender Ġsomething Ġmore Ġcomplicated Ċ Ġ* Ġthan Ġa Ġsimple Ġdas hed Ġline Ċ Ġ* Ġ@ param Ġstep ĠStep Ġbetween Ġshapes Ġin Ġpixels Ċ Ġ* Ġ@ param Ġmain Stroke ĠSt roke Ġto Ġdraw Ġthe Ġline Ċ Ġ* Ġ@ param Ġshape To Place ĠShape Ġto Ġbe Ġplaced Ġalong Ġthe Ġline Ġeach Ġstep Ġpixels . Ċ Ġ* ĠLine Ġorientation Ġis Ġtowards Ġa Ġpositive Ġdirection Ġof ĠX Ġaxis . ĠSo Ġif Ġyou Ġwant Ġto Ġdraw Ġa Ġshort Ġstroke Ġ 1 0 Ġpx Ġlong Ġper pend icular Ġto Ġthe Ġmain Ġline Ċ Ġ* Ġyou Ġmay Ġuse ĠLine 2 D . Double ( 0 . 0 , Ġ 5 . 0 , Ġ 0 . 0 . Ġ- 5 . 0 ) Ċ Ġ* Ġ@ param Ġshape To Place Width Ġshape To Place Ġis Ġdrawn Ġusing Ġa ĠBasic Stroke Ġwith Ġgiven Ġwidth Ċ Ġ*/ Ċ class ĠShape Stroke Ġ( val Ġstep : ĠInt , Ġprivate Ġval Ġmain Stroke : ĠSt roke , Ġprivate Ġval Ġshape To Place : ĠShape , Ġval Ġshape To Place Width : ĠFloat Ġ= Ġ 2 . 0 f ): ĠSt roke Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġside Stroke Ġ= ĠBasic Stroke ( shape To Place Width ) ĊĊĠĠĠ Ġprivate Ġfun ĠgetLast Point ( line : ĠPath 2 D . Double ): ĠCoordinate ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġit : ĠPath Iterator Ġ= Ġline . getPath Iterator ( null ) ĊĠĠĠĠĠĠĠ Ġvar Ġr z : ĠCoordinate ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! it . is Done ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠDouble Array ( 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . current Segment ( values ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr z Ġ= ĠCoordinate ( values [ 0 ], Ġvalues [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . next () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġr z ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate Shape For Insertion ( line : ĠLine 2 D . Double , Ġlast Point : ĠCoordinate ): ĠShape ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġside Line Transform : ĠAff ine Transform Ġ= ĠAff ine Transform . get Translate Instance ( last Point . x , Ġlast Point . y ) ĊĠĠĠĠĠĠĠ Ġside Line Transform . rotate ( Math . atan 2 ( line . y 2 Ġ- Ġline . y 1 , Ġline . x 2 Ġ- Ġline . x 1 )) ĊĠĠĠĠĠĠĠ Ġreturn Ġside Line Transform . create Trans formed Shape ( shape To Place ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate St rok ed Shape ( shape : ĠShape ): ĠShape Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew shape Ġ= ĠGeneral Path () Ġ// ĠStart Ġwith Ġan Ġempty Ġshape ĊĊĠĠĠĠĠĠĠ Ġval Ġinner Shape Ġ= ĠGeneral Path () ĊĊĠĠĠĠĠĠĠ Ġval Ġi : ĠPath Iterator Ġ= Ġshape . getPath Iterator ( null ) ĊĠĠĠĠĠĠĠ Ġval Ġcoords Ġ= ĠFloat Array ( 6 ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġpixels Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! i . is Done ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype : ĠInt Ġ= Ġi . current Segment ( coords ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPath Iterator . SEG _ MOV ETO Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew shape . moveTo ( coords . get ( 0 ), Ġcoords . get ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPath Iterator . SEG _ LIN ETO Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart X Ġ= Ġnew shape . current Point . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Y Ġ= Ġnew shape . current Point . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend X Ġ= Ġcoords . get ( 0 ). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Y Ġ= Ġcoords . get ( 1 ). toDouble () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= ĠLine 2 D . Double ( start X , Ġstart Y , Ġend X , Ġend Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsegment Length Ġ= ĠMath . sqrt ( Math . pow ( end X Ġ- Ġstart X , Ġ 2 . 0 ) Ġ+ ĠMath . pow ( end Y Ġ- Ġstart Y , Ġ 2 . 0 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pixels Ġ+ Ġsegment Length Ġ< Ġstep ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpixels Ġ+= Ġsegment Length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoffset Ġ= ĠMath . max ( 0 . 0 , Ġstep Ġ- Ġpixels ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( offset Ġ< Ġsegment Length ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstep Scale Ġ= Ġoffset Ġ/ Ġsegment Length ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstep Transform 2 Ġ= ĠAff ine Transform . get Translate Instance ( start X , Ġstart Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep Transform 2 . scale ( step Scale , Ġstep Scale ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep Transform 2 . translate (- start X , Ġ- start Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstep Line Ġ= Ġstep Transform 2 . create Trans formed Shape ( line ) Ġas ĠPath 2 D . Double ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Point Ġ= ĠgetLast Point ( step Line ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransformed Ġ= Ġgenerate Shape For Insertion ( line , Ġlast Point !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Shape . append ( transformed , Ġfalse ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ+= Ġstep ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpixels Ġ= Ġsegment Length Ġ- Ġoffset Ġ+ Ġstep ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew shape . lineTo ( coords . get ( 0 ), Ġcoords . get ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPath Iterator . SEG _ QUAD TO Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew shape . quad To ( coords . get ( 0 ), Ġcoords . get ( 1 ), Ġcoords . get ( 2 ), Ġcoords . get ( 3 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPath Iterator . SEG _ C UB ICT O Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew shape . curve To ( coords . get ( 0 ), Ġcoords . get ( 1 ), Ġcoords . get ( 2 ), Ġcoords . get ( 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoords . get ( 4 ), Ġcoords . get ( 5 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPath Iterator . SEG _ CLOSE Ġ-> Ġnew shape . close Path () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi . next () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġval Ġr z Ġ= ĠArea ( main Stroke . create St rok ed Shape ( new shape )) ĊĠĠĠĠĠĠĠ Ġr z . add ( Area ( side Stroke . create St rok ed Shape ( inner Shape ))) ĊĠĠĠĠĠĠĠ Ġreturn Ġr z ĊĠĠĠ Ġ} Ċ } ĊĊ