package Ġcom . ang cy o . u ic ore . demo . draw Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics .* Ċ import Ġandroid . os . Build Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġandroidx . core . graphics . with Matrix Ċ import Ġandroidx . core . graphics . with Translation Ċ import Ġcom . ang cy o . canvas . utils ._ temp Point Ċ import Ġcom . ang cy o . canvas . utils . create Paint Ċ import Ġcom . ang cy o . canvas . utils . map Point Ċ import Ġcom . ang cy o . canvas . utils . map Rect F Ċ import Ġcom . ang cy o . library . ex . ADJ UST _ TYPE _ LT Ċ import Ġcom . ang cy o . library . ex . adjust Size Ċ import Ġcom . ang cy o . library . ex . disable Parent Intercept Touch Event Ċ import Ġcom . ang cy o . library . ex . dp Ċ Ċ /** Ċ Ġ* Ġ@ author Ġ< a Ġhref =" mailto : ang cy o @ 1 2 6 . com "> ang cy o </ a > Ċ Ġ* Ġ@ since Ġ 2 0 2 2 / 0 4 / 1 5 Ċ Ġ*/ Ċ class ĠDraw Path View ( context : ĠContext , Ġattribute Set : ĠAttributeSet ? Ġ= Ġnull ) Ġ: ĊĠĠĠ ĠView ( context , Ġattribute Set ) Ġ{ ĊĊĠĠĠ Ġval Ġpath List Ġ= Ġmutable ListOf < Path >() ĊĠĠĠ Ġval Ġpaint Ġ= Ġcreate Paint (). apply Ġ{ ĊĠĠĠĠĠĠĠ ĠstrokeWidth Ġ= Ġ 1 Ġ* Ġdp ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġdraw Rect Ġ= ĠRect F () ĊĠĠĠ Ġval Ġdraw Rotate Rect Ġ= ĠRect F () ĊĠĠĠ Ġval Ġ_ touch Point Ġ= ĠPoint F () ĊĠĠĠ Ġval Ġ_ move Point Ġ= ĠPoint F () ĊĊĠĠĠ Ġvar Ġtouch Width Ġ= Ġ 0 f ĊĠĠĠ Ġvar Ġtouch Height Ġ= Ġ 0 f ĊĊĠĠĠ Ġvar Ġrotate Ġ= Ġ 4 5 f ĊĊĠĠĠ Ġval Ġtouch Center Point Ġ= ĠPoint F () ĊĠĠĠ Ġval Ġmove Center Point Ġ= ĠPoint F () ĊĊĠĠĠ Ġ// çŁ© å½¢ æĹ ĭ è½¬ åĲİçļĦ å·¦ ä¸Ĭ è§Ĵ åĿĲæłĩ çĤ¹ , Ġ çĶ¨æĿ¥ è®¡ç®Ĺ å®½ é«ĺ ĊĠĠĠ Ġval Ġrect Rotate Left Top Point Ġ= ĠPoint F () ĊĊĠĠĠ Ġ// æĮī ä¸ĭ æĹ¶ , Ġ æīĭ åĬ¿ å¯¹åºĶçļĦ çŁ© å½¢ å®½ é«ĺ ĊĠĠĠ Ġvar Ġtouch Rect Width Ġ= Ġ 0 f ĊĠĠĠ Ġvar Ġtouch Rect Height Ġ= Ġ 0 f ĊĊĠĠĠ Ġ// æīĭ æĮĩ æĮī ä¸ĭ æĹ¶ , Ġ è·Ŀç¦» åı³ ä¸ĭ è§Ĵ çļĦ å®½ é«ĺ å·® è·Ŀ ĊĠĠĠ Ġvar Ġtouch Diff Width Ġ= Ġ 0 f ĊĠĠĠ Ġvar Ġtouch Diff Height Ġ= Ġ 0 f ĊĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( event . action Mask ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ touch Point . set ( event . x , Ġevent . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Width Ġ= Ġdraw Rect . width () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Height Ġ= Ġdraw Rect . height () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix . post Rotate ( rotate , Ġdraw Rect . center X (), Ġdraw Rect . center Y ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect Rotate Left Top Point . set ( draw Rect . left , Ġdraw Rect . top ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix . map Point ( rect Rotate Left Top Point , Ġrect Rotate Left Top Point ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Center Point . set ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ touch Point . x Ġ- Ġrect Rotate Left Top Point . x , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ touch Point . y Ġ- Ġrect Rotate Left Top Point . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Rotate Before Distance ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect Rotate Left Top Point . x , Ġrect Rotate Left Top Point . y , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ touch Point . x , Ġ_ touch Point . y , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(_ touch Point . x Ġ+ Ġrect Rotate Left Top Point . x ) Ġ/ Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(_ touch Point . y Ġ+ Ġrect Rotate Left Top Point . y ) Ġ/ Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ temp Point ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Rect Width Ġ= Ġ_ temp Point . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Rect Height Ġ= Ġ_ temp Point . y ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Diff Width Ġ= Ġtouch Rect Width Ġ- Ġtouch Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Diff Height Ġ= Ġtouch Rect Height Ġ- Ġtouch Height ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisable Parent Intercept Touch Event () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ move Point . set ( event . x , Ġevent . y ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* // 1 : è¿Ļç§į æĸ¹æ³ķ ä¸į è¡Į , Ġå½ĵ çŁ© å½¢ è¶³ å¤Ł å¤§ æĹ¶ , Ġ ç¼© æĶ¾ çļĦ è·Ŀç¦» ä¼ļ è¿ľ å¤§äºİ æīĭ æĮĩ ç§»åĬ¨ çļĦ è·Ŀç¦» ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale X Ġ= Ġ_ move Point . x Ġ/ Ġ_ touch Point . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Y Ġ= Ġ_ move Point . y Ġ/ Ġ_ touch Point . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Ġ= Ġmax ( scale X , Ġscale Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale Rect By ( scale , Ġscale ) */ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* // 2 : è¿Ļç§į æĸ¹æ³ķ ä¹Ł ä¸į è¡Į , Ġåľ¨ çŁ© å½¢ è¶³ å¤Ł å¤§ æĹ¶ , Ġ æĶ¾ å¤§çļĦ è·Ŀç¦» ä¼ļ è¿ľ å¤§äºİ æīĭ æĮĩ ç§»åĬ¨ çļĦ è·Ŀç¦» ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdx Ġ= Ġ_ move Point . x Ġ- Ġ_ touch Point . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdy Ġ= Ġ_ move Point . y Ġ- Ġ_ touch Point . y ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Width Ġ= Ġtouch Width Ġ+ Ġdx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Height Ġ= Ġtouch Height Ġ+ Ġdy ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale X Ġ= Ġnew Width Ġ/ Ġtouch Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Y Ġ= Ġnew Height Ġ/ Ġtouch Height ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Ġ= Ġmin ( scale X , Ġscale Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale Rect By ( scale , Ġscale ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Width Ġ= Ġnew Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Height Ġ= Ġnew Height */ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// 3 : Ġ çĽ´æİ¥ ä¿®æĶ¹ å®½ é«ĺ , Ġ å®Į ç¾İ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdx Ġ= Ġ_ move Point . x Ġ- Ġ_ touch Point . x Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdy Ġ= Ġ_ move Point . y Ġ- Ġ_ touch Point . y Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// æīĭ åĬ¿ ç§»åĬ¨ çļĦ è·Ŀç¦» Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd Ġ= ĠCanvas Touch Handler . spacing (_ move Point , Ġ_ touch Point ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ä¸¤ çĤ¹ çļĦ è§Ĵ åº¦ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= ĠCanvas Touch Handler . spacing (_ move Point , Ġ_ touch Point ) Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdx 2 Ġ= Ġdx Ġ// d Ġ* Ġsin ( 9 0 Ġ- Ġrotate Ġ- Ġa ) Ġ Ġ// dx Ġ/* / Ġsin ( rotate . toDouble ()) */ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdy 2 Ġ= Ġdy Ġ// d Ġ* Ġcos ( 9 0 Ġ- Ġrotate Ġ- Ġa ) Ġ Ġ// dy Ġ/* / Ġsin ( rotate . toDouble ()) */ Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Width Ġ= Ġtouch Width Ġ+ Ġdx 2 Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Height Ġ= Ġtouch Height Ġ+ Ġdy 2 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove Center Point . set ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ move Point . x Ġ- Ġrect Rotate Left Top Point . x , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ move Point . y Ġ- Ġrect Rotate Left Top Point . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Rotate Before Distance ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect Rotate Left Top Point . x , Ġrect Rotate Left Top Point . y , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ move Point . x , Ġ_ move Point . y , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(_ move Point . x Ġ+ Ġrect Rotate Left Top Point . x ) Ġ/ Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(_ move Point . y Ġ+ Ġrect Rotate Left Top Point . y ) Ġ/ Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ temp Point ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmove Rect Width Ġ= Ġ_ temp Point . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmove Rect Height Ġ= Ġ_ temp Point . y ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Width Ġ= Ġmove Rect Width Ġ- Ġtouch Diff Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Height Ġ= Ġmove Rect Height Ġ- Ġtouch Diff Height ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdx Ġ= Ġmove Rect Width Ġ- Ġtouch Rect Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdy Ġ= Ġmove Rect Height Ġ- Ġtouch Rect Height ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* val Ġnew Width Ġ= Ġtouch Width Ġ+ Ġdx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Height Ġ= Ġtouch Height Ġ+ Ġdy */ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix . post Rotate ( rotate , Ġmove Center Point . x , Ġmove Center Point . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix . invert ( matrix ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 1 Ġ= Ġmatrix . map Point ( rect Rotate Left Top Point , ĠPoint F ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp 2 Ġ= Ġmatrix . map Point (_ move Point , ĠPoint F ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* val Ġnew Width Ġ= Ġp 2 . x Ġ- Ġp 1 . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Height Ġ= Ġp 2 . y Ġ- Ġp 1 . y */ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// draw Rect . adjust Size With LT ( new Width , Ġnew Height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// draw Rect . offset ( dx , Ġdy ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* draw Rect . right Ġ= Ġdraw Rect . left Ġ+ Ġnew Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Rect . bottom Ġ= Ġdraw Rect . top Ġ+ Ġnew Height ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Width Ġ= Ġnew Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Height Ġ= Ġnew Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () */ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// æĶ¯æĮģ æĹ ĭ è½¬ çļĦ çŁ© å½¢ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Rect Bounds LT ( draw Rect , Ġnew Width . toFloat (), Ġnew Height . toFloat (), Ġrotate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Rect Width Ġ= Ġmove Rect Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Rect Height Ġ= Ġmove Rect Height ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Width Ġ= Ġdraw Rect . width () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Height Ġ= Ġdraw Rect . height () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Center Point . set ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ move Point . x Ġ- Ġrect Rotate Left Top Point . x , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ move Point . y Ġ- Ġrect Rotate Left Top Point . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ touch Point . set (_ move Point ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrotate Ġ+= Ġ 1 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisable Parent Intercept Touch Event ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ CANCEL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisable Parent Intercept Touch Event ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġscale Rect By ( scale X : ĠFloat Ġ= Ġ 1 f , Ġscale Y : ĠFloat Ġ= Ġ 1 f ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Rect Ġ= ĠRect F ( draw Rect ) ĊĠĠĠĠĠĠĠ Ġval Ġrect 1 Ġ= ĠRect F ( draw Rect ) ĊĊĠĠĠĠĠĠĠ Ġ// å·¦ ä¸Ĭ è§Ĵ ç¼© æĶ¾ ĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġmatrix . post Scale ( scale X , Ġscale Y , Ġdraw Rect . left , Ġdraw Rect . top ) ĊĠĠĠĠĠĠĠ Ġmatrix . map Rect F ( draw Rect , Ġdraw Rect ) ĊĊĠĠĠĠĠĠĠ Ġ// ä¸Ń çĤ¹ ç¼© æĶ¾ ĊĠĠĠĠĠĠĠ Ġmatrix . reset () ĊĠĠĠĠĠĠĠ Ġmatrix . post Scale ( scale X , Ġscale Y , Ġrect 1 . center X (), Ġrect 1 . center Y ()) ĊĠĠĠĠĠĠĠ Ġmatrix . map Rect F ( rect 1 , Ġrect 1 ) ĊĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Size Changed ( w : ĠInt , Ġh : ĠInt , Ġold w : ĠInt , Ġold h : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Size Changed ( w , Ġh , Ġold w , Ġold h ) ĊĠĠĠĠĠĠĠ Ġdraw Rect . set ( w Ġ/ Ġ 3 f , Ġh Ġ/ Ġ 3 f , Ġw Ġ/ Ġ 2 f , Ġh Ġ/ Ġ 2 f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Draw Allocation ") ĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĊĠĠĠĠĠĠĠ Ġpaint . stroke Width Ġ= Ġ 1 Ġ* Ġdp ĊĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġmatrix . post Rotate ( rotate , Ġdraw Rect . center X (), Ġdraw Rect . center Y ()) ĊĠĠĠĠĠĠĠ Ġcanvas . with Matrix ( matrix ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( draw Rect , Ġpaint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcanvas . with Translation ( 1 0 0 f , Ġ 1 0 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath List . forEach Ġ{ Ġpath Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . color Ġ= ĠColor . GRAY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Path ( path , Ġpaint ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Bounds Ġ= ĠRect F () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . compute Bounds ( path Bounds , Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// èİ·åıĸ è·¯å¾Ħ ä¸ĬçļĦ æīĢæľī çĤ¹ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoint Components Ġ= Ġpath . approx imate ( 0 . 5 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum Points Ġ= Ġpoint Components . size Ġ/ Ġ 3 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoint Path Ġ= ĠPath () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcomponent Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġnum Points ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfraction Ġ= Ġpoint Components [ component Index ++] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġx Ġ= Ġpoint Components [ component Index ++] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġy Ġ= Ġpoint Components [ component Index ++] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoint Array Ġ= Ġfloat ArrayOf ( x , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// matrix . set Translate ( meas ured Width Ġ/ Ġ 2 f , Ġmeasured Height Ġ/ Ġ 2 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix . post Scale ( 3 f , Ġ 3 f , Ġpath Bounds . center X (), Ġpath Bounds . center Y ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix . post Rotate ( 4 5 f , Ġpath Bounds . center X (), Ġpath Bounds . center Y ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix . map Points ( point Array ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġpoint Array [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġpoint Array [ 1 ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( component Index Ġ<= Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoint Path . moveTo ( x , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoint Path . lineTo ( x , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . color Ġ= ĠColor . BLUE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Path ( point Path , Ġpaint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// èİ·åıĸ è·¯å¾Ħ ä¸ĬçļĦ æīĢæľī çĤ¹ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoint Path 2 Ġ= ĠPath () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Measure Ġ= ĠPath Measure ( path , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdistance Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpos Array Ġ= Ġfloat ArrayOf ( 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtan Array Ġ= Ġfloat ArrayOf ( 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( distance Ġ< Ġpath Measure . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( path Measure . get Pos Tan ( distance , Ġpos Array , Ġtan Array )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġpos Array [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġpos Array [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( distance Ġ== Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoint Path 2 . moveTo ( x , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoint Path 2 . lineTo ( x , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdistance Ġ+= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( distance Ġ> Ġpath Measure . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( path Measure . get Pos Tan ( path Measure . length , Ġpos Array , Ġtan Array )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġpos Array [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġpos Array [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( distance Ġ== Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoint Path 2 . moveTo ( x , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoint Path 2 . lineTo ( x , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . color Ġ= ĠColor . RED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Path ( point Path 2 , Ġpaint ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// --- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtest 1 ( canvas ) ĊĠĠĠĠĠĠĠ Ġtest 2 ( canvas ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtest 1 ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// æĹ ĭ è½¬ æµĭè¯ķ ĊĠĠĠĠĠĠĠ Ġval Ġpoint Ġ= ĠPoint F () ĊĠĠĠĠĠĠĠ Ġpoint . set ( 3 0 0 f , Ġ 3 0 0 f ) ĊĠĠĠĠĠĠĠ Ġcanvas . draw Circle ( point . x , Ġpoint . y , Ġ 1 0 Ġ* Ġdp , Ġpaint ) ĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġmatrix . post Rotate ( rotate , Ġmeasured Width Ġ/ Ġ 2 f , Ġmeasured Height Ġ/ Ġ 2 f ) ĊĠĠĠĠĠĠĠ Ġmatrix . map Point ( point , Ġpoint ) ĊĠĠĠĠĠĠĠ Ġcanvas . draw Circle ( point . x , Ġpoint . y , Ġ 1 0 Ġ* Ġdp , Ġpaint ) ĊĠĠĠĠĠĠĠ Ġ// åıį åĲĳ æĹ ĭ è½¬ æµĭè¯ķ ĊĠĠĠĠĠĠĠ Ġval Ġinvert Matrix Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġmatrix . invert ( invert Matrix ) ĊĠĠĠĠĠĠĠ Ġinvert Matrix . map Point ( point , Ġpoint ) ĊĠĠĠĠĠĠĠ Ġcanvas . draw Circle ( point . x , Ġpoint . y , Ġ 1 0 Ġ* Ġdp , Ġpaint ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtest 2 ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// çŁ© å½¢ æĹ ĭ è½¬ åĲİ , åĽºå®ļ å·¦ ä¸Ĭ è§Ĵ ç¼© æĶ¾ ĊĊĠĠĠĠĠĠĠ Ġ// ç»ĺ åĪ¶ ä¸Ģä¸ª çŁ© å½¢ ĊĠĠĠĠĠĠĠ Ġpaint . stroke Width Ġ= Ġ 6 Ġ* Ġdp ĊĠĠĠĠĠĠĠ Ġval Ġrect Ġ= ĠRect F () ĊĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġ 4 0 0 f ĊĠĠĠĠĠĠĠ Ġval Ġtop Ġ= Ġ 4 0 0 f ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġ 4 0 0 f ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġ 2 0 0 f ĊĠĠĠĠĠĠĠ Ġpaint . color Ġ= ĠColor . RED ĊĠĠĠĠĠĠĠ Ġrect . set ( left , Ġtop , Ġleft Ġ+ Ġwidth , Ġtop Ġ+ Ġheight ) ĊĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( rect , Ġpaint ) ĊĠĠĠĠĠĠĠ Ġ// ç»ĺ åĪ¶ çŁ© å½¢ æĹ ĭ è½¬ åĲİ ĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġmatrix . post Rotate ( rotate , Ġrect . center X (), Ġrect . center Y ()) ĊĠĠĠĠĠĠĠ Ġcanvas . with Matrix ( matrix ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( rect , Ġpaint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// å°Ĩ çŁ© å½¢ åĽºå®ļ å·¦ ä¸Ĭ è§Ĵ ç¼© æĶ¾ ĊĠĠĠĠĠĠĠ Ġpaint . stroke Width Ġ= Ġ 4 Ġ* Ġdp ĊĠĠĠĠĠĠĠ Ġval Ġnew Width Ġ= Ġ 2 0 0 f ĊĠĠĠĠĠĠĠ Ġval Ġnew Height Ġ= Ġ 1 0 0 f ĊĠĠĠĠĠĠĠ Ġpaint . color Ġ= ĠColor . GREEN ĊĠĠĠĠĠĠĠ Ġrect . adjust Size ( new Width , Ġnew Height , ĠAD JUST _ TYPE _ LT ) ĊĠĠĠĠĠĠĠ Ġ// ç»ĺ åĪ¶ ç¼© æĶ¾ åĲİçļĦ çŁ© å½¢ ĊĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( rect , Ġpaint ) ĊĠĠĠĠĠĠĠ Ġ// ç¼© æĶ¾ åĲİ , Ġ æĹ ĭ è½¬ çļĦ çŁ© å½¢ ĊĠĠĠĠĠĠĠ Ġcanvas . with Matrix ( matrix ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( rect , Ġpaint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// åħ³éĶ® è®¡ç®Ĺ , Ġ åĽºå®ļ å·¦ ä¸Ĭ è§Ĵ ä¹ĭåĲİ , Ġ åİŁå§ĭ çŁ© å½¢ åºĶè¯¥ æīĢ å¤Ħ çļĦ ä½įç½® ĊĠĠĠĠĠĠĠ Ġpaint . stroke Width Ġ= Ġ 2 Ġ* Ġdp ĊĠĠĠĠĠĠĠ Ġval Ġrect Rotate Ġ= ĠRect F () ĊĠĠĠĠĠĠĠ Ġmatrix . map Rect F ( rect , Ġrect Rotate ) ĊĠĠĠĠĠĠĠ Ġ/* paint . color Ġ= ĠColor . BLUE ĊĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( rect Rotate , Ġpaint ) */ ĊĊĠĠĠĠĠĠĠ Ġ/* val Ġmatrix 2 Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġmatrix . reset () ĊĠĠĠĠĠĠĠ Ġmatrix . post Rotate ( rotate , Ġrect Rotate . center X (), Ġrect Rotate . center Y ()) ĊĠĠĠĠĠĠĠ Ġmatrix . invert ( matrix 2 ) ĊĠĠĠĠĠĠĠ Ġmatrix 2 . map Rect F ( rect Rotate , Ġrect ) ĊĠĠĠĠĠĠĠ Ġpaint . color Ġ= ĠColor . YELLOW ĊĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( rect , Ġpaint ) */ ĊĠĠĠĠĠĠĠ Ġrect . offset ( rect Rotate . center X () Ġ- Ġrect . center X (), Ġrect Rotate . center Y () Ġ- Ġrect . center Y ()) ĊĠĠĠĠĠĠĠ Ġpaint . color Ġ= ĠColor . BLUE ĊĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( rect , Ġpaint ) ĊĠĠĠĠĠĠĠ Ġmatrix . reset () ĊĠĠĠĠĠĠĠ Ġmatrix . post Rotate ( rotate , Ġrect . center X (), Ġrect . center Y ()) ĊĠĠĠĠĠĠĠ Ġcanvas . with Matrix ( matrix ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( rect , Ġpaint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** åĽºå®ļ å·¦ ä¸Ĭ è§Ĵ , Ġ è°ĥæķ´ çŁ© å½¢ çļĦ å®½ é«ĺ ĊĠĠĠĠ Ġ* Ġ[ rect ] ĠéľĢè¦ģ æĹ ĭ è½¬ çļĦ çŁ© å½¢ ĊĠĠĠĠ Ġ* Ġ[ new Width ] Ġ[ new Height ] Ġ æĸ°çļĦ å®½ é«ĺ ĊĠĠĠĠ Ġ* Ġ[ rotate ] Ġ çŁ© å½¢ å½ĵåīį æĹ ĭ è½¬ çļĦ è§Ĵ åº¦ */ ĊĠĠĠ Ġprivate Ġfun Ġupdate Rect Bounds LT ( rect : ĠRect F , Ġnew Width : ĠFloat , Ġnew Height : ĠFloat , Ġrotate : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// åİŁå§ĭ çŁ© å½¢ æĹ ĭ è½¬ çļĦ ä¸Ńå¿ĥ çĤ¹ åĿĲæłĩ ĊĠĠĠĠĠĠĠ Ġval Ġorigin Center X Ġ= Ġrect . center X () ĊĠĠĠĠĠĠĠ Ġval Ġorigin Center Y Ġ= Ġrect . center Y () ĊĠĠĠĠĠĠĠ Ġ// å·¦ ä¸Ĭ è§Ĵ åĽºå®ļ , Ġ è°ĥæķ´ çŁ© å½¢ å®½ é«ĺ ĊĠĠĠĠĠĠĠ Ġrect . adjust Size ( new Width , Ġnew Height , ĠAD JUST _ TYPE _ LT ) ĊĊĠĠĠĠĠĠĠ Ġ// æĮīçħ§ åİŁå§ĭ çļĦ æĹ ĭ è½¬ ä¸Ń çĤ¹ åĿĲæłĩ , Ġ æĹ ĭ è½¬ è°ĥæķ´ åĲİçļĦ çŁ© å½¢ ĊĠĠĠĠĠĠĠ Ġval Ġrotate Rect Ġ= ĠRect F () ĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġmatrix . post Rotate ( rotate , Ġorigin Center X , Ġorigin Center Y ) ĊĠĠĠĠĠĠĠ Ġmatrix . map Rect F ( rect , Ġrotate Rect ) ĊĊĠĠĠĠĠĠĠ Ġ// æĹ ĭ è½¬ åĲİçļĦ çŁ© å½¢ ä¸Ń çĤ¹ å°±æĺ¯ è°ĥæķ´ åĲİçļĦ çŁ© å½¢ éľĢè¦ģ åģı ç§» çļĦ x , y ĊĠĠĠĠĠĠĠ Ġrect . offset ( rotate Rect . center X () Ġ- Ġrect . center X (), Ġrotate Rect . center Y () Ġ- Ġrect . center Y ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** è®¡ç®Ĺ 2 ä¸ª åľ¨ åıį åĲĳ æĹ ĭ è½¬ åĲİçļĦ x , y è·Ŀç¦» */ ĊĠĠĠ Ġprivate Ġfun Ġcalc Rotate Before Distance ( ĊĠĠĠĠĠĠĠ Ġx 1 : ĠFloat , Ġy 1 : ĠFloat , ĊĠĠĠĠĠĠĠ Ġx 2 : ĠFloat , Ġy 2 : ĠFloat , ĊĠĠĠĠĠĠĠ Ġrotate Center X : ĠFloat , Ġrotate Center Y : ĠFloat , ĊĠĠĠĠĠĠĠ Ġresult : ĠPoint F ĊĠĠĠ Ġ): ĠPoint F Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġmatrix . post Rotate ( rotate , Ġrotate Center X , Ġrotate Center Y ) ĊĠĠĠĠĠĠĠ Ġmatrix . invert ( matrix ) ĊĊĠĠĠĠĠĠĠ Ġval Ġp 1 Ġ= Ġmatrix . map Point ( x 1 , Ġy 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġp 1 x Ġ= Ġp 1 . x ĊĠĠĠĠĠĠĠ Ġval Ġp 1 y Ġ= Ġp 1 . y ĊĠĠĠĠĠĠĠ Ġval Ġp 2 Ġ= Ġmatrix . map Point ( x 2 , Ġy 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġp 2 x Ġ= Ġp 2 . x ĊĠĠĠĠĠĠĠ Ġval Ġp 2 y Ġ= Ġp 2 . y ĊĊĠĠĠĠĠĠĠ Ġresult . x Ġ= Ġp 2 x Ġ- Ġp 1 x ĊĠĠĠĠĠĠĠ Ġresult . y Ġ= Ġp 2 y Ġ- Ġp 1 y ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ }