package Ġmodel Ċ Ċ import Ġkotlin . math . cos Ċ import Ġkotlin . math . sin Ċ import Ġkotlin . math . tan Ċ Ċ sealed Ġclass ĠTransform Ġ{ ĊĠĠĠ Ġabstract Ġfun Ġtransform ( data : ĠArray < Double >) ĊĊĠĠĠ Ġclass ĠMatrix ( val Ġa : ĠDouble , Ġval Ġb : ĠDouble , Ġval Ġc : ĠDouble , Ġval Ġd : ĠDouble , Ġval Ġe : ĠDouble , Ġval Ġf : ĠDouble ) Ġ: ĊĠĠĠĠĠĠĠ ĠTransform () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtransform ( data : ĠArray < Double >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Size Ġ= Ġ 3 , Ġcolumn Size Ġ= Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa , Ġb , Ġc , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd , Ġe , Ġf , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 , Ġ 0 . 0 , Ġ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . pair Ġ{ Ġx , Ġy , Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmatrix Ġ* ĠMatrix ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Size Ġ= Ġ 3 , Ġcolumn Size Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ index ] Ġ= Ġresult [ 0 ][ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ index Ġ+ Ġ 1 ] Ġ= Ġresult [ 1 ][ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠTranslate ( val Ġx : ĠDouble , Ġval Ġy : ĠDouble ) Ġ: ĠTransform () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtransform ( data : ĠArray < Double >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Size Ġ= Ġ 3 , Ġcolumn Size Ġ= Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 , Ġ 0 . 0 , Ġx , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 , Ġ 1 . 0 , Ġy , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 , Ġ 0 . 0 , Ġ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . pair Ġ{ Ġx , Ġy , Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmatrix Ġ* ĠMatrix ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Size Ġ= Ġ 3 , Ġcolumn Size Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ index ] Ġ= Ġresult [ 0 ][ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ index Ġ+ Ġ 1 ] Ġ= Ġresult [ 1 ][ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠScale ( private Ġval Ġscale X : ĠDouble , Ġprivate Ġval Ġscale Y : ĠDouble ) Ġ: ĠTransform () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtransform ( data : ĠArray < Double >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Size Ġ= Ġ 3 , Ġcolumn Size Ġ= Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale X , Ġ 0 . 0 , Ġ 0 . 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 , Ġscale Y , Ġ 0 . 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 , Ġ 0 . 0 , Ġ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . pair Ġ{ Ġx , Ġy , Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmatrix Ġ* ĠMatrix ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Size Ġ= Ġ 3 , Ġcolumn Size Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ index ] Ġ= Ġresult [ 0 ][ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ index Ġ+ Ġ 1 ] Ġ= Ġresult [ 1 ][ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠRotate ( val Ġa : ĠDouble , Ġval Ġx : ĠDouble , Ġval Ġy : ĠDouble ) Ġ: ĠTransform () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtransform ( data : ĠArray < Double >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrad ian Ġ= ĠMath . to Radians ( a ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrollback To Origin Matrix Ġ= ĠMatrix ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Size Ġ= Ġ 3 , Ġcolumn Size Ġ= Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 , Ġ 0 . 0 , Ġx , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 , Ġ 1 . 0 , Ġy , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 , Ġ 0 . 0 , Ġ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrotate Matrix Ġ= ĠMatrix ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Size Ġ= Ġ 3 , Ġcolumn Size Ġ= Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcos ( rad ian ), Ġ- sin ( rad ian ), Ġ 0 . 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsin ( rad ian ), Ġcos ( rad ian ), Ġ 0 . 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 , Ġ 0 . 0 , Ġ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchange Origin Matrix Ġ= ĠMatrix ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Size Ġ= Ġ 3 , Ġcolumn Size Ġ= Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 , Ġ 0 . 0 , Ġ- x , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 , Ġ 1 . 0 , Ġ- y , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 , Ġ 0 . 0 , Ġ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . pair Ġ{ Ġx , Ġy , Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrollback To Origin Matrix Ġ* Ġ( rotate Matrix Ġ* Ġ( change Origin Matrix Ġ* ĠMatrix ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Size Ġ= Ġ 3 , Ġcolumn Size Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ index ] Ġ= Ġresult [ 0 ][ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ index Ġ+ Ġ 1 ] Ġ= Ġresult [ 1 ][ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠSk ew X ( val Ġa : ĠDouble ) Ġ: ĠTransform () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtransform ( data : ĠArray < Double >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrad ian Ġ= ĠMath . to Radians ( a ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Size Ġ= Ġ 3 , Ġcolumn Size Ġ= Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 , Ġtan ( rad ian ), Ġ 0 . 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 , Ġ 1 . 0 , Ġ 0 . 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 , Ġ 0 . 0 , Ġ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . pair Ġ{ Ġx , Ġy , Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmatrix Ġ* ĠMatrix ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Size Ġ= Ġ 3 , Ġcolumn Size Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ index ] Ġ= Ġresult [ 0 ][ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ index Ġ+ Ġ 1 ] Ġ= Ġresult [ 1 ][ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠSk ew Y ( val Ġa : ĠDouble ) Ġ: ĠTransform () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtransform ( data : ĠArray < Double >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrad ian Ġ= ĠMath . to Radians ( a ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Size Ġ= Ġ 3 , Ġcolumn Size Ġ= Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 , Ġ 0 . 0 , Ġ 0 . 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtan ( rad ian ), Ġ 1 . 0 , Ġ 0 . 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 , Ġ 0 . 0 , Ġ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . pair Ġ{ Ġx , Ġy , Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmatrix Ġ* ĠMatrix ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Size Ġ= Ġ 3 , Ġcolumn Size Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ index ] Ġ= Ġresult [ 0 ][ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ index Ġ+ Ġ 1 ] Ġ= Ġresult [ 1 ][ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġ< T > ĠArray < T >. pair ( pair : Ġ( a : ĠT , Ġb : ĠT , Ġindex : ĠInt ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠ Ġthis . filter Indexed Ġ{ Ġindex , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠ Ġindex Ġ% Ġ 2 Ġ== Ġ 0 ĊĠĠĠ Ġ}. zip ( this . filter Indexed Ġ{ Ġindex , Ġ_ Ġ-> Ġindex Ġ% Ġ 2 Ġ!= Ġ 0 Ġ}) Ġ{ Ġa , Ġb Ġ-> ĊĠĠĠĠĠĠĠ Ġpair ( a , Ġb , Ġindex ) ĊĠĠĠĠĠĠĠ Ġindex Ġ+= Ġ 2 ĊĠĠĠ Ġ} Ċ } ĊĊ