package Ġl system Ċ Ċ import Ġorg . w 3 c . dom . Window Ċ import Ġkotlin . math . cos Ċ import Ġkotlin . math . min Ċ import Ġkotlin . math . sin Ċ Ċ data Ġclass ĠPoint ( val Ġx : ĠDouble , Ġval Ġy : ĠDouble ) Ġ{ ĊĠĠĠ Ġfun Ġrotate ( angle : ĠDouble ): ĠPoint Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcos Ġ= Ġcos ( angle ) ĊĠĠĠĠĠĠĠ Ġval Ġsin Ġ= Ġsin ( angle ) ĊĠĠĠĠĠĠĠ Ġreturn ĠPoint ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġx Ġ* Ġcos Ġ- Ġy Ġ* Ġsin , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġx Ġ* Ġsin Ġ+ Ġy Ġ* Ġcos ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshift ( x : ĠDouble , Ġy : ĠDouble ) Ġ= ĠPoint ( this . x Ġ+ Ġx , Ġthis . y Ġ+ Ġy ) ĊĊĠĠĠ Ġfun Ġscale ( value : ĠDouble ) Ġ= ĠPoint ( x Ġ* Ġvalue , Ġy Ġ* Ġvalue ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnone Ġ= ĠPoint ( Double . NaN , ĠDouble . NaN ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠList < Point >. scale ( value : ĠDouble ) Ġ= Ġmap Ġ{ Ġit . scale ( value ) Ġ} Ċ fun ĠList < Point >. shift ( x : ĠDouble , Ġy : ĠDouble ) Ġ= Ġmap Ġ{ Ġit . shift ( x , Ġy ) Ġ} Ċ fun ĠSequence < Point >. shift ( x : ĠDouble , Ġy : ĠDouble ) Ġ= Ġmap Ġ{ Ġit . shift ( x , Ġy ) Ġ} Ċ Ċ fun ĠList < Point >. fit Center ed Into ( x 1 : ĠDouble , Ġy 1 : ĠDouble , Ġx 2 : ĠDouble , Ġy 2 : ĠDouble ): ĠList < Point > Ġ{ ĊĠĠĠ Ġrequire ( x 1 Ġ< Ġx 2 Ġ&& Ġy 1 Ġ< Ġy 2 ) ĊĠĠĠ Ġval Ġwidth Ġ= Ġx 2 Ġ- Ġx 1 ĊĠĠĠ Ġval Ġheight Ġ= Ġy 2 Ġ- Ġy 1 ĊĊĠĠĠ Ġval Ġmin Point Ġ= ĠPoint ( min By { Ġit . x Ġ} !!. x , Ġmin By { Ġit . y Ġ} !!. y ) ĊĠĠĠ Ġval Ġmax Point Ġ= ĠPoint ( max By { Ġit . x Ġ} !!. x , Ġmax By { Ġit . y Ġ} !!. y ) ĊĠĠĠ Ġval Ġpoints Width Ġ= Ġmax Point . x Ġ- Ġmin Point . x ĊĠĠĠ Ġval Ġpoints Height Ġ= Ġmax Point . y Ġ- Ġmin Point . y ĊĠĠĠ Ġval Ġmin Scale Ġ= Ġmin ( width Ġ/ Ġpoints Width , Ġheight Ġ/ Ġpoints Height ) ĊĊĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ. scale ( min Scale ) ĊĠĠĠĠĠĠĠ Ġ. shift ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx 1 Ġ- Ġmin Point . x Ġ* Ġmin Scale Ġ+ Ġ( width Ġ- Ġpoints Width Ġ* Ġmin Scale ) Ġ/ Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy 1 Ġ- Ġmin Point . y Ġ* Ġmin Scale Ġ+ Ġ( height Ġ- Ġpoints Height Ġ* Ġmin Scale ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġ) Ċ } Ċ Ċ fun ĠList < Point >. fit Center ed Into ( window : ĠWindow , Ġmargin Percent : ĠDouble Ġ= Ġ 0 . 1 ): ĠList < Point > Ġ{ ĊĠĠĠ Ġval Ġmargin Ġ= Ġmin ( window . innerWidth Ġ* Ġmargin Percent , Ġwindow . innerHeight Ġ* Ġmargin Percent ) ĊĠĠĠ Ġreturn Ġfit Center ed Into ( ĊĠĠĠĠĠĠĠ Ġx 1 Ġ= Ġmargin , ĊĠĠĠĠĠĠĠ Ġy 1 Ġ= Ġmargin , ĊĠĠĠĠĠĠĠ Ġx 2 Ġ= Ġwindow . innerWidth . toDouble () Ġ- Ġmargin , ĊĠĠĠĠĠĠĠ Ġy 2 Ġ= Ġwindow . innerHeight . toDouble () Ġ- Ġmargin ĊĠĠĠ Ġ) Ċ }