/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 ĠThe ĠE uk lid ĠAuthors Ċ Ġ* Ċ Ġ* Ġ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 Ġe uk lid . f Ċ Ċ import Ġe uk lid . util . Non invert ible Transform Exception Ċ import Ġkotlin . math .* Ċ Ċ /** Ċ Ġ* ĠImplements Ġan Ġaffine Ġ( 3 x 2 Ġmatrix ) Ġtransform . ĠThe Ġtransformation Ġmatrix Ġhas Ġthe Ġform : Ċ Ġ* Ġ``` Ċ Ġ* Ġ[ Ġm 0 0 , Ġm 1 0 , Ġtx Ġ] Ċ Ġ* Ġ[ Ġm 0 1 , Ġm 1 1 , Ġty Ġ] Ċ Ġ* Ġ[ ĠĠĠ 0 , ĠĠĠ 0 , ĠĠ 1 Ġ] Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ data Ġclass ĠAff ine Transform ( ĊĠĠĠĠĠĠĠ Ġ/** ĠThe Ġscale , Ġrotation Ġand Ġshe ar Ġcomponents Ġof Ġthis Ġtransform . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġm 0 0 : ĠFloat Ġ= Ġ 1 f , ĊĠĠĠĠĠĠĠ Ġvar Ġm 0 1 : ĠFloat Ġ= Ġ 0 f , ĊĠĠĠĠĠĠĠ Ġvar Ġm 1 0 : ĠFloat Ġ= Ġ 0 f , ĊĠĠĠĠĠĠĠ Ġvar Ġm 1 1 : ĠFloat Ġ= Ġ 1 f , ĊĠĠĠĠĠĠĠ Ġ/** ĠThe Ġtranslation Ġcomponents Ġof Ġthis Ġtransform . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoverride Ġvar Ġtx : ĠFloat Ġ= Ġ 0 f , ĊĠĠĠĠĠĠĠ Ġoverride Ġvar Ġty : ĠFloat Ġ= Ġ 0 f Ċ ) Ġ: ĠTransform Ġ{ ĊĊĠĠĠ Ġ/** ĠSets Ġthis Ġaffine Ġtransform Ġmatrix Ġto Ġ` other `. ĊĠĠĠĠ Ġ* Ġ@ return Ġthis Ġinstance , Ġfor Ġchaining . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset ( other : ĠAff ine Transform ): ĠAff ine Transform Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Transform ( other . m 0 0 , Ġother . m 0 1 , Ġother . m 1 0 , Ġother . m 1 1 , Ġother . tx , Ġother . ty ) ĊĊĠĠĠ Ġoverride Ġval Ġuniform Scale : ĠFloat ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġsquare Ġroot Ġof Ġthe Ġsigned Ġarea Ġof Ġthe Ġparalle log ram Ġsp anned Ġby Ġthe Ġaxis Ġvectors ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcp Ġ= Ġm 0 0 Ġ* Ġm 1 1 Ġ- Ġm 0 1 Ġ* Ġm 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( cp Ġ< Ġ 0 f ) Ġ- sqrt (- cp ) Ġelse Ġsqrt ( cp ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġscale X : ĠFloat ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsqrt ( m 0 0 Ġ* Ġm 0 0 Ġ+ Ġm 0 1 Ġ* Ġm 0 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġscale Y : ĠFloat ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsqrt ( m 1 0 Ġ* Ġm 1 0 Ġ+ Ġm 1 1 Ġ* Ġm 1 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġrotation : ĠFloat ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġuse Ġthe Ġiter ative Ġpolar Ġdecomposition Ġalgorithm Ġdescribed Ġby ĠKen ĠSh oem ake : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhttp :// www . cs . w isc . edu / graphics / Courses / 8 3 8 - s 2 0 0 2 / P apers / polar - de comp . pdf ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstart Ġwith Ġthe Ġcontents Ġof Ġthe Ġupper Ġ 2 x 2 Ġportion Ġof Ġthe Ġmatrix ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġn 0 0 Ġ= Ġm 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġn 1 0 Ġ= Ġm 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġn 0 1 Ġ= Ġm 0 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġn 1 1 Ġ= Ġm 1 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( ii Ġin Ġ 0 .. 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstore Ġthe Ġresults Ġof Ġthe Ġprevious Ġiteration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġo 0 0 Ġ= Ġn 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġo 1 0 Ġ= Ġn 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġo 0 1 Ġ= Ġn 0 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġo 1 1 Ġ= Ġn 1 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcompute Ġaverage Ġof Ġthe Ġmatrix Ġwith Ġits Ġinverse Ġtranspose ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdet Ġ= Ġo 0 0 Ġ* Ġo 1 1 Ġ- Ġo 1 0 Ġ* Ġo 0 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abs ( det ) Ġ== Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdetermin ant Ġis Ġzero ; Ġmatrix Ġis Ġnot Ġinvert ible ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNon invert ible Transform Exception ( this . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhr det Ġ= Ġ 0 . 5 f Ġ/ Ġdet ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn 0 0 Ġ= Ġ+ o 1 1 Ġ* Ġhr det Ġ+ Ġo 0 0 Ġ* Ġ 0 . 5 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn 1 0 Ġ= Ġ- o 0 1 Ġ* Ġhr det Ġ+ Ġo 1 0 Ġ* Ġ 0 . 5 f ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn 0 1 Ġ= Ġ- o 1 0 Ġ* Ġhr det Ġ+ Ġo 0 1 Ġ* Ġ 0 . 5 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn 1 1 Ġ= Ġ+ o 0 0 Ġ* Ġhr det Ġ+ Ġo 1 1 Ġ* Ġ 0 . 5 f ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcompute Ġthe Ġdifference ; Ġif Ġit 's Ġsmall Ġenough , Ġwe 're Ġdone ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd 0 0 Ġ= Ġn 0 0 Ġ- Ġo 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd 1 0 Ġ= Ġn 1 0 Ġ- Ġo 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd 0 1 Ġ= Ġn 0 1 Ġ- Ġo 0 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd 1 1 Ġ= Ġn 1 1 Ġ- Ġo 1 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( d 0 0 Ġ* Ġd 0 0 Ġ+ Ġd 1 0 Ġ* Ġd 1 0 Ġ+ Ġd 0 1 Ġ* Ġd 0 1 Ġ+ Ġd 1 1 Ġ* Ġd 1 1 Ġ< ĠMath Util . EPS ILON ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnow Ġthat Ġwe Ġhave Ġa Ġnice Ġor thogonal Ġmatrix , Ġwe Ġcan Ġextract Ġthe Ġrotation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġatan 2 ( n 0 1 , Ġn 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget ( matrix : ĠFloat Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmatrix [ 0 ] Ġ= Ġm 0 0 ĊĠĠĠĠĠĠĠ Ġmatrix [ 1 ] Ġ= Ġm 0 1 ĊĠĠĠĠĠĠĠ Ġmatrix [ 2 ] Ġ= Ġm 1 0 ĊĠĠĠĠĠĠĠ Ġmatrix [ 3 ] Ġ= Ġm 1 1 ĊĠĠĠĠĠĠĠ Ġmatrix [ 4 ] Ġ= Ġtx ĊĠĠĠĠĠĠĠ Ġmatrix [ 5 ] Ġ= Ġty ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Uniform Scale ( scale : ĠFloat ): ĠAff ine Transform Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġset Scale ( scale , Ġscale ) Ġas ĠAff ine Transform ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Scale X ( scale X : ĠFloat ): ĠAff ine Transform Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġnormalize Ġthe Ġscale Ġto Ġ 1 , Ġthen Ġre - apply ĊĠĠĠĠĠĠĠ Ġval Ġmult Ġ= Ġscale X Ġ/ Ġthis . scale X ĊĠĠĠĠĠĠĠ Ġm 0 0 Ġ*= Ġmult ĊĠĠĠĠĠĠĠ Ġm 0 1 Ġ*= Ġmult ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Scale Y ( scale Y : ĠFloat ): ĠAff ine Transform Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġnormalize Ġthe Ġscale Ġto Ġ 1 , Ġthen Ġre - apply ĊĠĠĠĠĠĠĠ Ġval Ġmult Ġ= Ġscale Y Ġ/ Ġthis . scale Y ĊĠĠĠĠĠĠĠ Ġm 1 0 Ġ*= Ġmult ĊĠĠĠĠĠĠĠ Ġm 1 1 Ġ*= Ġmult ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Rotation ( angle : ĠFloat ): ĠAff ine Transform Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġextract Ġthe Ġscale , Ġthen Ġre apply Ġrotation Ġand Ġscale Ġtogether ĊĠĠĠĠĠĠĠ Ġval Ġsx Ġ= Ġscale X ĊĠĠĠĠĠĠĠ Ġval Ġsy Ġ= Ġscale Y ĊĠĠĠĠĠĠĠ Ġval Ġs ina Ġ= Ġsin ( angle ) ĊĠĠĠĠĠĠĠ Ġval Ġcos a Ġ= Ġcos ( angle ) ĊĠĠĠĠĠĠĠ Ġm 0 0 Ġ= Ġcos a Ġ* Ġsx ĊĠĠĠĠĠĠĠ Ġm 0 1 Ġ= Ġs ina Ġ* Ġsx ĊĠĠĠĠĠĠĠ Ġm 1 0 Ġ= Ġ- s ina Ġ* Ġsy ĊĠĠĠĠĠĠĠ Ġm 1 1 Ġ= Ġcos a Ġ* Ġsy ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Translation ( tx : ĠFloat , Ġty : ĠFloat ): ĠAff ine Transform Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . tx Ġ= Ġtx ĊĠĠĠĠĠĠĠ Ġthis . ty Ġ= Ġty ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Tx ( tx : ĠFloat ): ĠAff ine Transform Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . tx Ġ= Ġtx ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Ty ( ty : ĠFloat ): ĠAff ine Transform Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . ty Ġ= Ġty ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Transform ( m 0 0 : ĠFloat , Ġm 0 1 : ĠFloat , Ġm 1 0 : ĠFloat , Ġm 1 1 : ĠFloat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx : ĠFloat , Ġty : ĠFloat ): ĠAff ine Transform Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . m 0 0 Ġ= Ġm 0 0 ĊĠĠĠĠĠĠĠ Ġthis . m 0 1 Ġ= Ġm 0 1 ĊĠĠĠĠĠĠĠ Ġthis . m 1 0 Ġ= Ġm 1 0 ĊĠĠĠĠĠĠĠ Ġthis . m 1 1 Ġ= Ġm 1 1 ĊĠĠĠĠĠĠĠ Ġthis . tx Ġ= Ġtx ĊĠĠĠĠĠĠĠ Ġthis . ty Ġ= Ġty ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġuniform Scale ( scale : ĠFloat ): ĠAff ine Transform Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġscale ( scale , Ġscale ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġscale ( scale X : ĠFloat , Ġscale Y : ĠFloat ): ĠAff ine Transform Ġ{ ĊĠĠĠĠĠĠĠ Ġm 0 0 Ġ*= Ġscale X ĊĠĠĠĠĠĠĠ Ġm 0 1 Ġ*= Ġscale X ĊĠĠĠĠĠĠĠ Ġm 1 0 Ġ*= Ġscale Y ĊĠĠĠĠĠĠĠ Ġm 1 1 Ġ*= Ġscale Y ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġscale X ( scale X : ĠFloat ): ĠAff ine Transform Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTrans forms . multiply ( this , Ġscale X , Ġ 0 f , Ġ 0 f , Ġ 1 f , Ġ 0 f , Ġ 0 f , Ġthis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġscale Y ( scale Y : ĠFloat ): ĠAff ine Transform Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTrans forms . multiply ( this , Ġ 1 f , Ġ 0 f , Ġ 0 f , Ġscale Y , Ġ 0 f , Ġ 0 f , Ġthis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrotate ( angle : ĠFloat ): ĠAff ine Transform Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġs ina Ġ= Ġsin ( angle ) ĊĠĠĠĠĠĠĠ Ġval Ġcos a Ġ= Ġcos ( angle ) ĊĠĠĠĠĠĠĠ Ġreturn ĠTrans forms . multiply ( this , Ġcos a , Ġs ina , Ġ- s ina , Ġcos a , Ġ 0 f , Ġ 0 f , Ġthis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtranslate ( tx : ĠFloat , Ġty : ĠFloat ): ĠAff ine Transform Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . tx Ġ+= Ġm 0 0 Ġ* Ġtx Ġ+ Ġm 1 0 Ġ* Ġty ĊĠĠĠĠĠĠĠ Ġthis . ty Ġ+= Ġm 1 1 Ġ* Ġty Ġ+ Ġm 0 1 Ġ* Ġtx ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtranslateX ( tx : ĠFloat ): ĠAff ine Transform Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTrans forms . multiply ( this , Ġ 1 f , Ġ 0 f , Ġ 0 f , Ġ 1 f , Ġtx , Ġ 0 f , Ġthis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtranslateY ( ty : ĠFloat ): ĠAff ine Transform Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTrans forms . multiply ( this , Ġ 1 f , Ġ 0 f , Ġ 0 f , Ġ 1 f , Ġ 0 f , Ġty , Ġthis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshe ar ( sx : ĠFloat , Ġsy : ĠFloat ): ĠAff ine Transform Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTrans forms . multiply ( this , Ġ 1 f , Ġsy , Ġsx , Ġ 1 f , Ġ 0 f , Ġ 0 f , Ġthis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshe ar X ( sx : ĠFloat ): ĠAff ine Transform Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTrans forms . multiply ( this , Ġ 1 f , Ġ 0 f , Ġsx , Ġ 1 f , Ġ 0 f , Ġ 0 f , Ġthis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshe ar Y ( sy : ĠFloat ): ĠAff ine Transform Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTrans forms . multiply ( this , Ġ 1 f , Ġsy , Ġ 0 f , Ġ 1 f , Ġ 0 f , Ġ 0 f , Ġthis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinvert (): ĠAff ine Transform Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġcompute Ġthe Ġdetermin ant , Ġstoring Ġthe Ġsub determin ants Ġfor Ġlater Ġuse ĊĠĠĠĠĠĠĠ Ġval Ġdet Ġ= Ġm 0 0 Ġ* Ġm 1 1 Ġ- Ġm 1 0 Ġ* Ġm 0 1 ĊĠĠĠĠĠĠĠ Ġif Ġ( abs ( det ) Ġ== Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdetermin ant Ġis Ġzero ; Ġmatrix Ġis Ġnot Ġinvert ible ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNon invert ible Transform Exception ( this . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġr det Ġ= Ġ 1 f Ġ/ Ġdet ĊĠĠĠĠĠĠĠ Ġreturn ĠAff ine Transform ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ m 1 1 Ġ* Ġr det , Ġ- m 1 0 Ġ* Ġr det , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- m 0 1 Ġ* Ġr det , Ġ+ m 0 0 Ġ* Ġr det , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( m 1 0 Ġ* Ġty Ġ- Ġm 1 1 Ġ* Ġtx ) Ġ* Ġr det , Ġ( m 0 1 Ġ* Ġtx Ġ- Ġm 0 0 Ġ* Ġty ) Ġ* Ġr det ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġconcatenate ( other : ĠTransform ): ĠTransform Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( gener ality () Ġ< Ġother . gener ality ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġother . pre Concat enate ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġis ĠAff ine Transform ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTrans forms . multiply ( this , Ġother , ĠAff ine Transform ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġo aff Ġ= ĠAff ine Transform ( other ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTrans forms . multiply ( this , Ġo aff , Ġo aff ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpre Concat enate ( other : ĠTransform ): ĠTransform Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( gener ality () Ġ< Ġother . gener ality ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġother . concatenate ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġis ĠAff ine Transform ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTrans forms . multiply ( other , Ġthis , ĠAff ine Transform ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġo aff Ġ= ĠAff ine Transform ( other ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTrans forms . multiply ( o aff , Ġthis , Ġo aff ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġl erp ( other : ĠTransform , Ġt : ĠFloat ): ĠTransform Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( gener ality () Ġ< Ġother . gener ality ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġother . lerp ( this , Ġ- t ) Ġ// ĠTODO : Ġis Ġthis Ġcorrect ? ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġot Ġ= Ġother Ġas ? ĠAff ine Transform Ġ?: ĠAff ine Transform ( other ) ĊĠĠĠĠĠĠĠ Ġreturn ĠAff ine Transform ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm 0 0 Ġ+ Ġt Ġ* Ġ( ot . m 0 0 Ġ- Ġm 0 0 ), Ġm 0 1 Ġ+ Ġt Ġ* Ġ( ot . m 0 1 Ġ- Ġm 0 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm 1 0 Ġ+ Ġt Ġ* Ġ( ot . m 1 0 Ġ- Ġm 1 0 ), Ġm 1 1 Ġ+ Ġt Ġ* Ġ( ot . m 1 1 Ġ- Ġm 1 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Ġ+ Ġt Ġ* Ġ( ot . tx Ġ- Ġtx ), Ġty Ġ+ Ġt Ġ* Ġ( ot . ty Ġ- Ġty )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform ( p : ĠI Point , Ġinto : ĠPoint ): ĠPoint Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġp . x ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġp . y ĊĠĠĠĠĠĠĠ Ġreturn Ġinto . set ( m 0 0 Ġ* Ġx Ġ+ Ġm 1 0 Ġ* Ġy Ġ+ Ġtx , Ġm 0 1 Ġ* Ġx Ġ+ Ġm 1 1 Ġ* Ġy Ġ+ Ġty ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform ( src : ĠArray < I Point >, Ġsrc Off : ĠInt , Ġdst : ĠArray < Point >, Ġdst Off : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsrc Off 2 Ġ= Ġsrc Off ĊĠĠĠĠĠĠĠ Ġvar Ġdst Off 2 Ġ= Ġdst Off ĊĠĠĠĠĠĠĠ Ġfor Ġ( ii Ġin Ġ 0 .. count Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransform ( src [ src Off 2 ++ ], Ġdst [ dst Off 2 ++ ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform ( src : ĠFloat Array , Ġsrc Off : ĠInt , Ġdst : ĠFloat Array , Ġdst Off : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsrc Off 2 Ġ= Ġsrc Off ĊĠĠĠĠĠĠĠ Ġvar Ġdst Off 2 Ġ= Ġdst Off ĊĠĠĠĠĠĠĠ Ġfor Ġ( ii Ġin Ġ 0 .. count Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġsrc [ src Off 2 ++] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġsrc [ src Off 2 ++] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst [ dst Off 2 ++] Ġ= Ġm 0 0 Ġ* Ġx Ġ+ Ġm 1 0 Ġ* Ġy Ġ+ Ġtx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdst [ dst Off 2 ++] Ġ= Ġm 0 1 Ġ* Ġx Ġ+ Ġm 1 1 Ġ* Ġy Ġ+ Ġty ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinverse Transform ( p : ĠI Point , Ġinto : ĠPoint ): ĠPoint Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġp . x Ġ- Ġtx ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġp . y Ġ- Ġty ĊĠĠĠĠĠĠĠ Ġval Ġdet Ġ= Ġm 0 0 Ġ* Ġm 1 1 Ġ- Ġm 0 1 Ġ* Ġm 1 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( abs ( det ) Ġ== Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdetermin ant Ġis Ġzero ; Ġmatrix Ġis Ġnot Ġinvert ible ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNon invert ible Transform Exception ( this . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġr det Ġ= Ġ 1 Ġ/ Ġdet ĊĠĠĠĠĠĠĠ Ġreturn Ġinto . set (( x Ġ* Ġm 1 1 Ġ- Ġy Ġ* Ġm 1 0 ) Ġ* Ġr det , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( y Ġ* Ġm 0 0 Ġ- Ġx Ġ* Ġm 0 1 ) Ġ* Ġr det ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Point ( v : ĠI Vector , Ġinto : ĠVector ): ĠVector Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġv . x ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġv . y ĊĠĠĠĠĠĠĠ Ġreturn Ġinto . set ( m 0 0 Ġ* Ġx Ġ+ Ġm 1 0 Ġ* Ġy Ġ+ Ġtx , Ġm 0 1 Ġ* Ġx Ġ+ Ġm 1 1 Ġ* Ġy Ġ+ Ġty ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform ( v : ĠI Vector , Ġinto : ĠVector ): ĠVector Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġv . x ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġv . y ĊĠĠĠĠĠĠĠ Ġreturn Ġinto . set ( m 0 0 Ġ* Ġx Ġ+ Ġm 1 0 Ġ* Ġy , Ġm 0 1 Ġ* Ġx Ġ+ Ġm 1 1 Ġ* Ġy ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinverse Transform ( v : ĠI Vector , Ġinto : ĠVector ): ĠVector Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġv . x ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġv . y ĊĠĠĠĠĠĠĠ Ġval Ġdet Ġ= Ġm 0 0 Ġ* Ġm 1 1 Ġ- Ġm 0 1 Ġ* Ġm 1 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( abs ( det ) Ġ== Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdetermin ant Ġis Ġzero ; Ġmatrix Ġis Ġnot Ġinvert ible ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNon invert ible Transform Exception ( this . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġr det Ġ= Ġ 1 Ġ/ Ġdet ĊĠĠĠĠĠĠĠ Ġreturn Ġinto . set (( x Ġ* Ġm 1 1 Ġ- Ġy Ġ* Ġm 1 0 ) Ġ* Ġr det , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( y Ġ* Ġm 0 0 Ġ- Ġx Ġ* Ġm 0 1 ) Ġ* Ġr det ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcopy (): ĠAff ine Transform Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy ( m 0 0 Ġ= Ġm 0 0 , Ġm 0 1 Ġ= Ġm 0 1 , Ġm 1 0 Ġ= Ġm 1 0 , Ġm 1 1 Ġ= Ġm 1 1 , Ġtx Ġ= Ġtx , Ġty Ġ= Ġty ) ĊĊĠĠĠ Ġoverride Ġfun Ġgener ality (): ĠInt Ġ= ĠGENER AL ITY ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġm 0 0 Ġ!= Ġ 1 f Ġ|| Ġm 0 1 Ġ!= Ġ 0 f Ġ|| Ġm 1 0 Ġ!= Ġ 0 f Ġ|| Ġm 1 1 Ġ!= Ġ 1 f Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" affine Ġ[" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMath Util . toString ( m 0 0 ) Ġ+ Ġ" Ġ" Ġ+ ĠMath Util . toString ( m 0 1 ) Ġ+ Ġ" Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMath Util . toString ( m 1 0 ) Ġ+ Ġ" Ġ" Ġ+ ĠMath Util . toString ( m 1 1 ) Ġ+ Ġ" Ġ" Ġ+ Ġtranslation Ġ+ Ġ" ]" ĊĠĠĠĠĠĠĠ Ġtx Ġ!= Ġ 0 f Ġ|| Ġty Ġ!= Ġ 0 f Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" trans Ġ" Ġ+ Ġtranslation ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ident " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġwe Ġdon 't Ġpublic ize Ġthis Ġbecause Ġit Ġmight Ġencourage Ġsomeone Ġto Ġdo Ġsomething Ġst upid Ġlike ĊĠĠĠ Ġ// Ġcreate Ġa Ġnew ĠAff ine Transform Ġfrom Ġanother ĠAff ine Transform Ġusing Ġthis Ġinstead Ġof Ġcopy () ĊĠĠĠ Ġprivate Ġconstructor ( other : ĠTransform ) Ġ: Ġthis ( other . scale X , Ġother . scale Y , Ġother . rotation , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother . tx , Ġother . ty ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĠIdent ifies Ġthe Ġaffine Ġtransform Ġin Ġ[ gener ality ]. Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠGENER AL ITY Ġ= Ġ 4 ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** ĠCreates Ġan Ġaffine Ġtransform Ġfrom Ġthe Ġsupplied Ġscale , Ġrotation Ġand Ġtranslation . Ġ Ġ*/ Ċ fun ĠAff ine Transform ( scale X : ĠFloat , Ġscale Y : ĠFloat , Ġangle : ĠFloat , Ġtx : ĠFloat , Ġty : ĠFloat ): ĠAff ine Transform Ġ{ ĊĠĠĠ Ġval Ġs ina Ġ= Ġsin ( angle ) ĊĠĠĠ Ġval Ġcos a Ġ= Ġcos ( angle ) ĊĠĠĠ Ġreturn ĠAff ine Transform ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcos a Ġ* Ġscale X , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs ina Ġ* Ġscale Y , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ- s ina Ġ* Ġscale X , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcos a Ġ* Ġscale Y , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtx , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġty ) Ċ } Ċ