/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 . ĠJetBrains Ġs . r . o . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠMIT Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġjet brains . datal ore . plot . base . geom . util Ċ Ċ import Ġjet brains . datal ore . base . g common . collect . Ordering Ċ import Ġjet brains . datal ore . base . geometry . Double Rectangle Ċ import Ġjet brains . datal ore . base . geometry . Double Vector Ċ import Ġjet brains . datal ore . plot . base . Aes Ċ import Ġjet brains . datal ore . plot . base . DataPoint A est het ics Ċ import Ġjet brains . datal ore . plot . base . Geom Context Ċ import Ġjet brains . datal ore . plot . common . data . Series Util Ċ import Ġkotlin . math . max ĊĊ Ċ object ĠGe om Util Ġ{ ĊĠĠĠ Ġval ĠTO _ LOCATION _ X _ Y Ġ= Ġ{ Ġp : ĠData Point A est het ics Ġ-> ĊĠĠĠĠĠĠĠ Ġto Location OrNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . x (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . y () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval ĠTO _ LOCATION _ X _ Y MIN Ġ= Ġ{ Ġp : ĠData Point A est het ics Ġ-> ĊĠĠĠĠĠĠĠ Ġto Location OrNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . x (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . ymin () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval ĠTO _ LOCATION _ X _ Y MAX Ġ= Ġ{ Ġp : ĠData Point A est het ics Ġ-> ĊĠĠĠĠĠĠĠ Ġto Location OrNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . x (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . ymax () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval ĠTO _ LOCATION _ X _ ZERO Ġ= Ġ{ Ġp : ĠData Point A est het ics Ġ-> ĊĠĠĠĠĠĠĠ Ġto Location OrNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . x (), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval ĠTO _ RECT ANGLE Ġ= Ġ{ Ġp : ĠData Point A est het ics Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( Series Util . all Finite ( p . xmin (), Ġp . ymin (), Ġp . xmax (), Ġp . ymax ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect To Geometry ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . xmin () !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . ymin () !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . xmax () !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . ymax () !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval ĠORDER ING _ X Ġ= ĠOrdering . from ( object Ġ: ĠComparator < DataPoint A est het ics ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompare ( a : ĠData Point A est het ics ?, Ġb : ĠData Point A est het ics ?): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx 1 Ġ= Ġa ?. x () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx 2 Ġ= Ġb ?. x () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x 1 Ġ== Ġnull Ġ|| Ġx 2 Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġx 1 . compareTo ( x 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĠĠĠ Ġprivate Ġval ĠORDER ING _ Y Ġ= ĠOrdering . from ( object Ġ: ĠComparator < DataPoint A est het ics ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompare ( a : ĠData Point A est het ics ?, Ġb : ĠData Point A est het ics ?): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy 1 Ġ= Ġa ?. y () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy 2 Ġ= Ġb ?. y () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( y 1 Ġ== Ġnull Ġ|| Ġy 2 Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġy 1 . compareTo ( y 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĠĠĠ Ġprivate Ġval ĠWITH _ X _ Y Ġ= Ġ{ Ġpoint Aes : ĠData Point A est het ics Ġ-> ĠSeries Util . all Finite ( point Aes . x (), Ġpoint Aes . y ()) Ġ} ĊĠĠĠ Ġprivate Ġval ĠWITH _ X Ġ= Ġ{ Ġpoint Aes : ĠData Point A est het ics Ġ-> ĠSeries Util . is Finite ( point Aes . x ()) Ġ} ĊĠĠĠ Ġprivate Ġval ĠWITH _ Y Ġ= Ġ{ Ġpoint Aes : ĠData Point A est het ics Ġ-> ĠSeries Util . is Finite ( point Aes . y ()) Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġto Location OrNull ( x : ĠDouble ?, Ġy : ĠDouble ?): ĠDouble Vector ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Series Util . is Finite ( x ) Ġ&& ĠSeries Util . is Finite ( y )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDouble Vector ( x !! , Ġy !! ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" FunctionName ") ĊĠĠĠ Ġfun Ġwith _ X _ Y ( data Points : ĠIterable < DataPoint A est het ics >): ĠIterable < DataPoint A est het ics > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdata Points . filter Ġ{ Ġp Ġ-> ĠWITH _ X _ Y . invoke ( p ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" FunctionName ") ĊĠĠĠ Ġfun Ġwith _ X ( data Points : ĠIterable < DataPoint A est het ics >): ĠIterable < DataPoint A est het ics > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdata Points . filter Ġ{ Ġp Ġ-> ĠWITH _ X . invoke ( p ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" FunctionName ") ĊĠĠĠ Ġfun Ġwith _ Y ( data Points : ĠIterable < DataPoint A est het ics >): ĠIterable < DataPoint A est het ics > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdata Points . filter Ġ{ Ġp Ġ-> ĠWITH _ Y . invoke ( p ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" FunctionName ") ĊĠĠĠ Ġfun Ġordered _ X ( data Points : ĠIterable < DataPoint A est het ics >): ĠIterable < DataPoint A est het ics > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ORDER ING _ X . is Ordered ( data Points )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdata Points ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠORDER ING _ X . sorted Copy ( data Points ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġordered _ Y ( data Points : ĠIterable < DataPoint A est het ics >, Ġreversed : ĠBoolean ): ĠIterable < DataPoint A est het ics > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġordering Ġ= Ġif Ġ( reversed ) ĠORDER ING _ Y . reverse () Ġelse ĠORDER ING _ Y ĊĠĠĠĠĠĠĠ Ġif Ġ( ordering . is Ordered ( data Points )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdata Points ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġordering . sorted Copy ( data Points ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwidth Px ( p : ĠData Point A est het ics , Ġctx : ĠGe om Context , ĠminWidth : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġw Ġ= Ġp . width () ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġw !! Ġ* Ġctx . get Resolution ( Aes . X ) ĊĠĠĠĠĠĠĠ Ġreturn Ġmax ( width , ĠminWidth ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwith Defined ( data Points : ĠIterable < DataPoint A est het ics >, Ġaes : ĠA es < *> ): ĠIterable < DataPoint A est het ics > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdata Points . filter Ġ{ Ġp Ġ-> Ġp . defined ( aes ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwith Defined ( ĊĠĠĠĠĠĠĠ Ġdata Points : ĠIterable < DataPoint A est het ics >, ĊĠĠĠĠĠĠĠ Ġaes 0 : ĠA es <* >, ĊĠĠĠĠĠĠĠ Ġaes 1 : ĠA es < *> ĊĠĠĠ Ġ): ĠIterable < DataPoint A est het ics > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdata Points . filter Ġ{ Ġp Ġ-> Ġp . defined ( aes 0 ) Ġ&& Ġp . defined ( aes 1 ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwith Defined ( ĊĠĠĠĠĠĠĠ Ġdata Points : ĠIterable < DataPoint A est het ics >, ĊĠĠĠĠĠĠĠ Ġaes 0 : ĠA es <* >, ĊĠĠĠĠĠĠĠ Ġaes 1 : ĠA es <* >, ĊĠĠĠĠĠĠĠ Ġaes 2 : ĠA es < *> ĊĠĠĠ Ġ): ĠIterable < DataPoint A est het ics > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdata Points . filter Ġ{ Ġp Ġ-> Ġp . defined ( aes 0 ) Ġ&& Ġp . defined ( aes 1 ) Ġ&& Ġp . defined ( aes 2 ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwith Defined ( ĊĠĠĠĠĠĠĠ Ġdata Points : ĠIterable < DataPoint A est het ics >, ĊĠĠĠĠĠĠĠ Ġaes 0 : ĠA es <* >, ĊĠĠĠĠĠĠĠ Ġaes 1 : ĠA es <* >, ĊĠĠĠĠĠĠĠ Ġaes 2 : ĠA es <* >, ĊĠĠĠĠĠĠĠ Ġaes 3 : ĠA es < *> ĊĠĠĠ Ġ): ĠIterable < DataPoint A est het ics > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdata Points . filter Ġ{ Ġp Ġ-> Ġp . defined ( aes 0 ) Ġ&& Ġp . defined ( aes 1 ) Ġ&& Ġp . defined ( aes 2 ) Ġ&& Ġp . defined ( aes 3 ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrectangle By DataPoint ( p : ĠData Point A est het ics , Ġctx : ĠGe om Context ): ĠDouble Rectangle Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġp . x () !! ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġp . y () !! ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġwidth Px ( p , Ġctx , Ġ 2 . 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġorigin : ĠDouble Vector ĊĠĠĠĠĠĠĠ Ġval Ġdimensions : ĠDouble Vector ĊĠĠĠĠĠĠĠ Ġif Ġ( y Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= ĠDouble Vector ( x Ġ- Ġwidth Ġ/ Ġ 2 , Ġ 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdimensions Ġ= ĠDouble Vector ( width , Ġy ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= ĠDouble Vector ( x Ġ- Ġwidth Ġ/ Ġ 2 , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdimensions Ġ= ĠDouble Vector ( width , Ġ- y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠDouble Rectangle ( origin , Ġdimensions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Groups ( data Points : ĠIterable < DataPoint A est het ics >): ĠMap < Int , ĠList < DataPoint A est het ics >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpoints By Group Ġ= ĠHashMap < Int , ĠMutable List < DataPoint A est het ics >>() ĊĠĠĠĠĠĠĠ Ġfor Ġ( p Ġin Ġdata Points ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Ġ= Ġp . group () !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! points By Group . containsKey ( group )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints By Group [ group ] Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpoints By Group [ group ] !!. add ( p ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġpoints By Group ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrect To Geometry ( min X : ĠDouble , Ġmin Y : ĠDouble , Ġmax X : ĠDouble , Ġmax Y : ĠDouble ): ĠList < Double Vector > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDouble Vector ( min X , Ġmin Y ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDouble Vector ( min X , Ġmax Y ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDouble Vector ( max X , Ġmax Y ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDouble Vector ( max X , Ġmin Y ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDouble Vector ( min X , Ġmin Y ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ }