package Ġgroup net . euler Ċ Ċ import Ġgroup net . algorithm . Poly label Ċ import Ġgroup net . euler . cur ves . Circle Curve Ċ import Ġgroup net . gui . Settings Controller Ċ import Ġgroup net . util .* Ċ import Ġjavafx . beans . property . Double Property Ċ import Ġjavafx . beans . property . Simple Double Property Ċ import Ġjavafx . geometry . Point 2 D Ċ import Ġjavafx . geometry . Rectangle 2 D Ċ import Ġjavafx . scene . shape . Shape Ċ import Ġmath . geom 2 d . polygon . Multi Polygon 2 D Ċ import Ġmath . geom 2 d . polygon . Polygon 2 D Ċ import Ġmath . geom 2 d . polygon . Poly gons 2 D Ċ import Ġjava . util .* Ċ import Ġkotlin . math . sqrt Ċ Ċ /** Ċ Ġ* Ġ@ author ĠAl mas ĠB aim ag amb et ov Ġ( al mas lvl @ gmail . com ) Ċ Ġ*/ Ċ Ċ /** Ċ Ġ* ĠA Ġclosed Ġcurve , Ġc Ġ( element Ġof ĠC ). Ċ Ġ*/ Ċ abstract Ġclass ĠCurve ( val Ġlabel : ĠLabel ) Ġ: ĠComparable < Curve > Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlabel Position X Ġ= ĠSimple Double Property () ĊĠĠĠ Ġprivate Ġval Ġlabel Position Y Ġ= ĠSimple Double Property () ĊĊĠĠĠ Ġfun Ġlabel Position X Property (): ĠDouble Property Ġ= Ġlabel Position X ĊĠĠĠ Ġfun Ġlabel Position Y Property (): ĠDouble Property Ġ= Ġlabel Position Y ĊĊĠĠĠ Ġfun Ġget Label Position X (): ĠDouble Ġ= Ġlabel Position X . value ĊĠĠĠ Ġfun Ġget Label Position Y (): ĠDouble Ġ= Ġlabel Position Y . value ĊĊĠĠĠ Ġfun Ġset Label Position X ( value : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlabel Position X . value Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Label Position Y ( value : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlabel Position Y . value Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcached Polygon Ġby Ġlazy Ġ{ Ġcompute Polygon () Ġ} ĊĊĠĠĠ Ġval Ġcached Shape Ġby Ġlazy Ġ{ Ġcompute Shape () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġcurve Ġmodel Ġfor Ġcomputational Ġgeometry ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Polygon () Ġ= Ġcompute Polygon () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġbitmap Ġview Ġfor Ġrendering ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Shape () Ġ= Ġcompute Shape () ĊĊĠĠĠ Ġabstract Ġfun Ġcompute Polygon (): ĠPolygon 2 D ĊĊĠĠĠ Ġabstract Ġfun Ġcompute Shape (): ĠShape ĊĊĠĠĠ Ġabstract Ġfun Ġcopy With New Label ( new Label : ĠString ): ĠCurve ĊĊĠĠĠ Ġabstract Ġfun Ġtranslate ( translate : ĠPoint 2 D ): ĠCurve ĊĊĠĠĠ Ġabstract Ġfun Ġscale ( scale : ĠDouble , Ġpivot : ĠPoint 2 D ): ĠCurve ĊĊĠĠĠ Ġabstract Ġfun Ġto Debug String (): ĠString ĊĊĠĠĠ Ġoverride Ġfun Ġcompare To ( other : ĠCurve ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlabel . compareTo ( other . label ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġlabel Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġzone , Ġz Ġ( element Ġof ĠZ ), Ġin Ġan ĠE uler Ġdiagram . Ċ Ġ*/ Ċ class ĠZone ( ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAbstract Ġrepresentation Ġof Ġthis Ġzone . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġaz : ĠAbstract Zone , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAll Ġcurves Ġpresent Ġin Ġthe ĠE uler Ġdiagram Ġ( to Ġwhich Ġthis Ġzone Ġbelongs ). ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġdiagram Cur ves : ĠSet < Curve >) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCur ves Ġinside Ġthis Ġzone . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġcontaining Cur ves Ġ= Ġdiagram Cur ves . filter Ġ{ Ġit . label Ġin Ġaz Ġ}. toSet () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCur ves Ġoutside Ġof Ġthis Ġzone . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġexcluding Cur ves Ġ= Ġdiagram Cur ves Ġ- Ġcontaining Cur ves ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( containing Cur ves . size Ġ!= Ġaz . num Labels ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBug (" Abstract : Ġ$ az Ġdoes Ġnot Ġmatch Ġconcrete : Ġ$ containing Cur ves ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Shape (): ĠShape Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġshape : ĠShape Ġ= ĠSettings Controller . fx B Box ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( curve Ġin Ġcontaining Cur ves ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshape Ġ= ĠShape . intersect ( shape , Ġcurve . get Shape ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( curve Ġin Ġexcluding Cur ves ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshape Ġ= ĠShape . subtract ( shape , Ġcurve . get Shape ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġshape ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġvisual Center Ġby Ġlazy Ġ{ Ġcompute Visual Centre () Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcompute Visual Centre (): ĠPoint 2 D Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( az Ġ== ĠAbstract Zone . OUT SIDE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmin Curve X Ġ= Ġexcluding Cur ves . map Ġ{ Ġit . get Polygon (). bounding Box (). min X Ġ}. min () !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Curve X Ġ= Ġexcluding Cur ves . map Ġ{ Ġit . get Polygon (). bounding Box (). max X Ġ}. max () !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmin Curve Y Ġ= Ġexcluding Cur ves . map Ġ{ Ġit . get Polygon (). bounding Box (). min Y Ġ}. min () !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPoint 2 D (( min Curve X Ġ+ Ġmax Curve X ) Ġ/ Ġ 2 , Ġ( Settings Controller . geom B Box . bounding Box (). min Y Ġ* Ġ 0 . 1 Ġ+ Ġmin Curve Y Ġ* Ġ 0 . 9 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPoly label . find Center ( polygon Shape ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġpolygon Shape Ġby Ġlazy Ġ{ Ġcompute Polygon Shape () Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcompute Polygon Shape (): ĠPolygon 2 D Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġp Shape Ġ= ĠSettings Controller . geom B Box ĊĊĠĠĠĠĠĠĠ Ġcontaining Cur ves . map Ġ{ Ġc Ġ-> Ġc . get Polygon () Ġ}. forEach Ġ{ Ġp Ġ-> Ġp Shape Ġ= ĠPoly gons 2 D . intersection ( p Shape , Ġp ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġexcluding Cur ves . map Ġ{ Ġc Ġ-> Ġc . get Polygon () Ġ}. forEach Ġ{ Ġp Ġ-> Ġp Shape Ġ= ĠPoly gons 2 D . difference ( p Shape , Ġp ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġp Shape ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Top o logic ally Adjacent ( other : ĠZone ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! az . is Ne ighbour ( other . az )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( v 1 Ġin Ġpolygon Shape . vertices ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( v 2 Ġin Ġother . polygon Shape . vertices ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v 1 . as Int Ġ== Ġv 2 . as Int ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsepar ating Curve ( other : ĠZone ): ĠCurve ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdiff Ġ= Ġcontaining Cur ves . symmetric Difference ( other . containing Cur ves ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( diff . size Ġ== Ġ 1 ) Ġdiff . first () Ġelse Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshortest Distance To Other Zone ( point : ĠPoint 2 D ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( polygon Shape Ġis ĠMulti Polygon 2 D ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMath . abs ( polygon Shape . complement (). boundary (). signed Distance ( point . x , Ġpoint . y )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMath . abs (- polygon Shape . boundary (). signed Distance ( point . x , Ġpoint . y )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠZone ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġaz Ġ== Ġother . az Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontaining Cur ves . size Ġ== Ġother . containing Cur ves . size Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexcluding Cur ves . size Ġ== Ġother . ex cluding Cur ves . size Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontaining Cur ves . contains All ( other . containing Cur ves ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexcluding Cur ves . contains All ( other . ex cluding Cur ves ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġhash 1 Ġ= Ġcontaining Cur ves . sum By Ġ{ Ġit . hashCode () Ġ} ĊĠĠĠ Ġprivate Ġval Ġhash 2 Ġ= Ġexcluding Cur ves . sum By Ġ{ Ġit . hashCode () Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠObjects . hash ( az , Ġhash 1 , Ġhash 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġaz . toString () Ċ } Ċ Ċ /** Ċ Ġ* ĠAn ĠE uler Ġdiagram , Ġd Ġ= Ġ( C , Ġl ). Ċ Ġ*/ Ċ class ĠE uler Diagram ( val Ġoriginal Description : ĠDescription , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Description : ĠDescription , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurves Internal : ĠSet < Curve >) Ġ: ĠLog able Ġ{ ĊĊĠĠĠ Ġval Ġprops Ġ= Ġhash Map Of < Any , ĠAny >() ĊĊĠĠĠ Ġval Ġcurves Ġ= ĠCollections . unmodifiable Set ( cur ves Internal ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAll Ġzones Ġof Ġthis ĠE uler Ġdiagram , Ġincluding Ġsh aded Ġzones . ĊĠĠĠĠ Ġ* ĠDoes Ġnot Ġinclude Ġthe Ġoutside Ġzone . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġzones Ġ= Ġactual Description . abstract Zones . minus ( Abstract Zone . OUT SIDE ). map Ġ{ ĠZone ( it , Ġcurves ) Ġ}. toSet () ĊĊĠĠĠ Ġval Ġsh aded Zones Ġ= Ġzones . filter Ġ{ Ġit . az Ġ! in ĠZ ( original Description ) Ġ} ĊĊĠĠĠ Ġval Ġoutside Zone Ġ= ĠZone ( Abstract Zone . OUT SIDE , Ġcurves ) ĊĊĠĠĠ Ġval Ġnum Non Circ les Ġ= ĠC ( this ). size Ġ- ĠC ( this ). filter Ġ{ Ġit Ġis ĠCircle Curve Ġ}. size ĊĊĠĠĠ Ġfun Ġget Zone ( az : ĠAbstract Zone ): ĠZone Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( az Ġ== Ġaz Empty ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġoutside Zone ĊĊĠĠĠĠĠĠĠ Ġreturn Ġzones . find Ġ{ Ġit . az Ġ== Ġaz Ġ} Ġ?: Ġthrow ĠBug (" No Ġzone Ġexists Ġwith Ġabstraction Ġ$ az ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdraw Into Zone ( az : ĠAbstract Zone , Ġdiagram : ĠE uler Diagram , Ġzone Score : ĠInt Ġ= Ġ 1 ): ĠE uler Diagram Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d (" Drawing Ġinto Ġ$ az ", Ġdiagram ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ[ diagram ] Ġwill Ġbe Ġembedded Ġ" to " Ġthis Ġcenter Ġpoint ĊĠĠĠĠĠĠĠ Ġval Ġnew Center : ĠPoint 2 D ĊĊĠĠĠĠĠĠĠ Ġval Ġscale Ratio : ĠDouble ĊĠĠĠĠĠĠĠ Ġval Ġnew _ d : ĠE uler Diagram ĊĊĠĠĠĠĠĠĠ Ġif Ġ( az Ġ== Ġaz Empty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbbox 1 Ġ= Ġthis . bbox () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbbox 2 Ġ= Ġdiagram . bbox () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdiagram Center Ġ= Ġbbox 2 . center () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Center Ġ= Ġdiagram Center . add ( bbox 1 . max X Ġ+ Ġ 4 0 0 0 . 0 , Ġ 0 . 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġscale Ratio Ġ= Ġ 1 . 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscaled Cur ves Ġ= Ġdiagram . cur ves . map Ġ{ Ġit . scale ( scale Ratio , Ġdiagram Center ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Cur ves Ġ= Ġcurves . plus ( scaled Cur ves . map Ġ{ Ġit . translate ( new Center . subtract ( diagram Center )) Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew _ d Ġ= ĠE uler Diagram ( original Description Ġ+ Ġdiagram . original Description , Ġactual Description Ġ+ Ġdiagram . actual Description , Ġnew Cur ves ) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġzone Ġ= Ġzones . find Ġ{ Ġit . az Ġ== Ġaz Ġ} Ġ?: Ġthrow ĠBug (" No Ġzone Ġ$ az Ġfound Ġin Ġ$ this ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Center Ġ= Ġzone . visual Center ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmin Radius : ĠDouble Ġ= Ġzone . short est Distance To Other Zone ( new Center ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbbox Ġ= Ġdiagram . bbox () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdiagram Center Ġ= Ġbbox . center () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Radius Ġ= Ġmax Of ( bbox . width , Ġbbox . height ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġare Ġembedding Ġinto Ġaz , Ġso Ġscore Ġof Ġaz Ġcan Ġnever Ġbe Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscale Ratio Ġ= Ġmin Radius Ġ/ Ġactual Radius Ġ/ Ġmax Of ( sqrt ( zone Score . toDouble ()) Ġ* Ġ 0 . 5 , Ġ 0 . 7 5 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscaled Cur ves Ġ= Ġdiagram . cur ves . map Ġ{ Ġit . scale ( scale Ratio , Ġdiagram Center ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Cur ves Ġ= Ġcurves . plus ( scaled Cur ves . map Ġ{ Ġit . translate ( new Center . subtract ( diagram Center )) Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew _ d Ġ= ĠE uler Diagram ( original Description Ġ+ Ġdiagram . original Description , Ġactual Description Ġ+ Ġdiagram . actual Description , Ġnew Cur ves ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( az Ġ!= Ġaz Empty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew _ d . cur ves . filter Ġ{ Ġit . label Ġin Ġdiagram . cur ves . map Ġ{ Ġit . label Ġ} Ġ}. forEach Ġ{ Ġnew _ d . update Label Position ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnew _ d . props [" embed Center "] Ġ= Ġnew Center ĊĠĠĠĠĠĠĠ Ġnew _ d . props [" scale Ratio "] Ġ= Ġscale Ratio ĊĠĠĠĠĠĠĠ Ġreturn Ġnew _ d ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Label Position ( curve : ĠCurve ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġother Cur ves Ġ= ĠC ( this ). minus ( curve ) ĊĠĠĠĠĠĠĠ Ġval Ġpolygon Ġ= Ġcurve . cached Polygon ĊĠĠĠĠĠĠĠ Ġval Ġcenter Ġ= Ġpolygon . centroid () ĊĊĠĠĠĠĠĠĠ Ġval Ġlabel Pos Ġ= Ġpolygon . vertices () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠPoint 2 D ( it . x (), Ġit . y ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmagnitude Ġ= Ġcap Magnitude ( if Ġ( curve Ġis ĠCircle Curve ) Ġcurve . radius Ġ/ Ġ 3 Ġelse Ġ 1 5 0 . 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġif Ġ( curve Ġis ĠCircle Curve ) Ġcurve . radius Ġelse Ġ 0 . 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcompute Ġvector Ġout wards ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . add ( it . subtract ( center . x (), Ġcenter . y ()). normalize (). multiply ( magnitude )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmin Distance Ġ= Ġmin Distance To Other Cur ves ( it , Ġother Cur ves ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum Cur ves Ġ= Ġnum Cur ves That Contain Point ( it , Ġother Cur ves ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnumber Ġof Ġcurves Ġhas Ġa Ġmore Ġsignificant Ġimpact ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 0 0 0 Ġ* Ġnum Cur ves Ġ- Ġmin Distance ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first () !! ĊĊĠĠĠĠĠĠĠ Ġcurve . setLabel Position X ( label Pos . x ) ĊĠĠĠĠĠĠĠ Ġcurve . setLabel Position Y ( label Pos . y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcap Magnitude ( mag : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( mag Ġ> Ġ 3 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 3 0 0 . 0 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( mag Ġ< Ġ 1 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 1 5 0 . 0 ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmag ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnum Cur ves That Contain Point ( point : ĠPoint 2 D , Ġcurves : ĠSet < Curve >) Ġ= Ġcurves . count Ġ{ Ġit . cached Shape . contains ( point ) Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmin Distance To Other Cur ves ( point : ĠPoint 2 D , Ġcurves : ĠSet < Curve >): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcurves . map Ġ{ Ġit . cached Polygon . boundary (). signed Distance ( point . x , Ġpoint . y ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ- 2 0 Ġis Ġthreshold Ġon Ġhow Ġ" close " Ġwe Ġthink Ġit Ġis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbecause Ġof Ġpolygon Ġ< -> Ġsmooth Ġrepresentations Ġwe Ġmight Ġlose Ġprecision ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ>= Ġ- 2 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. min () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ 0 . 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbbox (): ĠRectangle 2 D Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpoly gons Ġ= Ġcurves . map Ġ{ Ġit . get Polygon () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġvertices Ġ= Ġpoly gons . flatMap Ġ{ Ġit . vertices () Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmin X Ġ= Ġvertices . min By Ġ{ Ġit . x () Ġ} !!. x () ĊĠĠĠĠĠĠĠ Ġval Ġmin Y Ġ= Ġvertices . min By Ġ{ Ġit . y () Ġ} !!. y () ĊĠĠĠĠĠĠĠ Ġval Ġmax X Ġ= Ġvertices . max By Ġ{ Ġit . x () Ġ} !!. x () ĊĠĠĠĠĠĠĠ Ġval Ġmax Y Ġ= Ġvertices . max By Ġ{ Ġit . y () Ġ} !!. y () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠRectangle 2 D ( min X , Ġmin Y , Ġmax X Ġ- Ġmin X , Ġmax Y Ġ- Ġmin Y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsize (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbbox Ġ= Ġbbox () ĊĠĠĠĠĠĠĠ Ġreturn Ġmax Of ( bbox . width , Ġbbox . height ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcenter (): ĠPoint 2 D Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbbox Ġ= Ġbbox () ĊĠĠĠĠĠĠĠ Ġreturn ĠPoint 2 D ( bbox . min X Ġ+ Ġbbox . max X Ġ/ Ġ 2 , Ġbbox . min Y Ġ+ Ġbbox . max Y Ġ/ Ġ 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtranslate ( vector : ĠPoint 2 D ): ĠE uler Diagram Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠE uler Diagram ( original Description , Ġactual Description , Ġcurves . map Ġ{ Ġit . translate ( vector ) Ġ}. toSet ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġscale ( pivot : ĠPoint 2 D , Ġratio : ĠDouble ): ĠE uler Diagram Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠE uler Diagram ( original Description , Ġactual Description , Ġcurves . map Ġ{ Ġit . scale ( ratio , Ġpivot ) Ġ}. toSet ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġto Log (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" ED [ o =$ original Description , Ġactual =$ actual Description , Ġcurves =$ cur ves , Ġzones =$ zones ]" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠObjects . hash ( original Description , Ġactual Description , Ġcurves , Ġzones , Ġsh aded Zones , Ġoutside Zone ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠE uler Diagram ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġoriginal Description Ġ== Ġother . original Description Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Description Ġ== Ġother . actual Description Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurves Ġ== Ġother . cur ves Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzones Ġ== Ġother . zones Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsh aded Zones Ġ== Ġother . sh aded Zones Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutside Zone Ġ== Ġother . outside Zone ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" ED [ D =$ actual Description ]" ĊĠĠĠ Ġ} Ċ }