/* čĊ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 - 2 0 2 1 ĠAnimated LED Strip čĊ Ġ* čĊ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy čĊ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal čĊ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights čĊ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell čĊ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis čĊ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : čĊ Ġ* čĊ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin čĊ Ġ* Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . čĊ Ġ* čĊ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR čĊ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , čĊ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE čĊ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER čĊ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , čĊ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN čĊ Ġ* ĠTHE ĠSOFTWARE . čĊ Ġ*/ čĊč Ċ package Ġanimated led strip . led s . location management čĊč Ċ import Ġanimated led strip . animations . parameters . Absolute Distance č Ċ import Ġanimated led strip . animations . parameters . Equation č Ċ import Ġanimated led strip . animations . parameters . Radians Rotation č Ċ import Ġanimated led strip . led s . animation management . Animation Manager č Ċ import Ġanimated led strip . led s . animation management . Pixel Modification Lists č Ċ import Ġkotlin . math . abs č Ċ import Ġkotlin . math . truncate čĊč Ċ /** čĊ Ġ* ĠGroup Ġpixels Ġbased Ġon Ġtheir Ġlocation Ġalong Ġthe ĠX Ġaxis Ġafter Ġa Ġtransformation Ġis Ġperformed . čĊ Ġ* čĊ Ġ* ĠUsed Ġby Ġanimations Ġsuch Ġas ĠPlane ĠRun , ĠWave , Ġand ĠW ipe . čĊ Ġ* čĊ Ġ* Ġ@ param Ġrotation ĠHow Ġto Ġrotate Ġthe Ġanimation čĊ Ġ* Ġ@ param Ġmovement Per Iteration ĠHow Ġfar Ġto Ġmove Ġalong Ġthe ĠX Ġaxis Ġin Ġeach Ġiteration čĊ Ġ* Ġ@ return ĠLists Ġof Ġpixels Ġto Ġmodify Ġin Ġeach Ġiteration Ġas Ġa Ġ[ Pixel Modification Lists ] čĊ Ġ*/ č Ċ fun ĠAnimation Manager . group Pixel sBy X Location ( čĊĠĠĠ Ġoffset : ĠAbsolute Distance , čĊĠĠĠ Ġrotation : ĠRad ians Rotation , čĊĠĠĠ Ġmovement Per Iteration : ĠDouble , č Ċ ): ĠPixel Modification Lists Ġ{ čĊĠĠĠ Ġrequire ( movement Per Iteration Ġ!= Ġ 0 . 0 ) Ġ{ Ġ" Movement Ġper Ġiteration Ġcannot Ġbe Ġ 0 " Ġ} čĊčĊĠĠĠ Ġ// ĠNegative Ġoffset Ġand Ġrotation Ġused Ġbecause Ġwe Ġwant Ġit Ġto Ġappear Ġlike Ġthe Ġanimation Ġmoved , Ġnot Ġthe Ġpixels čĊĠĠĠ Ġval Ġlocation Manager Ġ= ĠPixel Location Manager ( pixel Location Manager , č ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġ- offset , č ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrotation Ġ= Ġ- rotation , č ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvert X Ġ= Ġmovement Per Iteration Ġ< Ġ 0 . 0 ) čĊčĊĠĠĠ Ġval Ġpixels To Set Per Iteration : ĠMutable List < List < Int >> Ġ= Ġmutable ListOf () čĊĠĠĠ Ġval Ġpixels To Re vert Per Iteration : ĠMutable List < List < Int >> Ġ= Ġmutable ListOf ( listOf ()) čĊĠĠĠ Ġval Ġchanged Pixels : ĠMutable List < Pixel Location > Ġ= Ġmutable ListOf () čĊčĊĠĠĠ Ġval Ġmovement Distance Ġ= Ġabs ( movement Per Iteration ) čĊčĊĠĠĠ Ġvar Ġiteration Ġ= Ġ 0 čĊĠĠĠ Ġvar Ġcurrent X Ġ= Ġlocation Manager . x Min čĊĠĠĠ Ġwhile Ġ( current X Ġ< Ġlocation Manager . x Max Ġ+ Ġmovement Per Iteration ) Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġpixels To Set : ĠMutable List < Int > Ġ= Ġmutable ListOf () čĊĠĠĠĠĠĠĠ Ġfor Ġ( pixel Ġin Ġlocation Manager . pixel Locations ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pixel Ġ! in Ġchanged Pixels Ġ&& Ġpixel . location . x Ġ<= Ġcurrent X ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpixels To Set . add ( pixel . index ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Pixels . add ( pixel ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġpixels To Set Per Iteration . add ( pixels To Set . toList ()) čĊĠĠĠĠĠĠĠ Ġif Ġ( iteration Ġ> Ġ 0 ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpixels To Re vert Per Iteration . add ( pixels To Set Per Iteration [ iteration Ġ- Ġ 1 ] Ġ- Ġpixels To Set ) čĊĠĠĠĠĠĠĠ Ġiteration ++ čĊĠĠĠĠĠĠĠ Ġcurrent X Ġ+= Ġmovement Distance čĊĠĠĠ Ġ} čĊĠĠĠ Ġval Ġlast Re vert Ġ= Ġpixels To Set Per Iteration . last () Ġ- Ġpixels To Set Per Iteration [ 0 ] čĊĠĠĠ Ġpixels To Re vert Per Iteration [ 0 ] Ġ= Ġlast Re vert čĊĠĠĠ Ġpixels To Re vert Per Iteration . add ( last Re vert ) čĊčĊĠĠĠ Ġreturn ĠPixel Modification Lists ( pixels To Set Per Iteration , Ġpixels To Re vert Per Iteration ) č Ċ } čĊč Ċ /** čĊ Ġ* ĠGroup Ġpixels Ġbased Ġon Ġtheir Ġdistance Ġfrom Ġa Ġcentral Ġpoint . čĊ Ġ* čĊ Ġ* ĠUsed Ġby Ġanimations Ġsuch Ġas ĠR ipple . čĊ Ġ* čĊ Ġ* Ġ@ param Ġmaximum Distance ĠHow Ġfar Ġaway Ġfrom Ġthe Ġcenter Ġthe Ġanimation Ġcan Ġbe čĊ Ġ* Ġ@ param Ġmovement Per Iteration ĠHow Ġfar Ġto Ġmove Ġaway Ġfrom Ġ( or Ġtowards ) Ġthe Ġcenter Ġin Ġeach Ġiteration čĊ Ġ* Ġ@ return ĠLists Ġof Ġpixels Ġto Ġmodify Ġin Ġeach Ġiteration Ġas Ġa Ġ[ Pixel Modification Lists ] čĊ Ġ*/ č Ċ fun ĠAnimation Manager . group Pixel sBy Distance ( čĊĠĠĠ Ġcenter : ĠLocation , čĊĠĠĠ Ġmaximum Distance : ĠAbsolute Distance , čĊĠĠĠ Ġmovement Per Iteration : ĠDouble , č Ċ ): ĠPixel Modification Lists Ġ{ čĊĠĠĠ Ġrequire ( movement Per Iteration Ġ!= Ġ 0 . 0 ) Ġ{ Ġ" Movement Ġper Ġiteration Ġcannot Ġbe Ġ 0 " Ġ} čĊčĊĠĠĠ Ġval Ġmax Distance Ġ= Ġmaximum Distance . max Distance čĊĠĠĠ Ġval Ġlocation Manager Ġ= Ġpixel Location Manager čĊĠĠĠ Ġval Ġpixels To Set Per Iteration : ĠMutable List < List < Int >> Ġ= Ġmutable ListOf () čĊĠĠĠ Ġval Ġpixels To Re vert Per Iteration : ĠMutable List < List < Int >> Ġ= Ġmutable ListOf ( listOf ()) čĊĠĠĠ Ġval Ġchanged Pixels : ĠMutable List < Pixel Location > Ġ= Ġmutable ListOf () čĊčĊĠĠĠ Ġval Ġmovement Distance Ġ= Ġabs ( movement Per Iteration ) čĊčĊĠĠĠ Ġvar Ġiteration Ġ= Ġ 0 čĊĠĠĠ Ġif Ġ( movement Per Iteration Ġ> Ġ 0 . 0 ) Ġ{ čĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Distance Ġ= Ġ 0 . 0 čĊĠĠĠĠĠĠĠ Ġwhile Ġ( current Distance Ġ< Ġmax Distance ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpixels To Set : ĠMutable List < Int > Ġ= Ġmutable ListOf () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( pixel Ġin Ġlocation Manager . pixel Locations ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pixel Ġ! in Ġchanged Pixels Ġ&& Ġpixel . location . distance From ( center ) Ġ<= Ġcurrent Distance ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpixels To Set . add ( pixel . index ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Pixels . add ( pixel ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpixels To Set Per Iteration . add ( pixels To Set . toList ()) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( iteration Ġ> Ġ 0 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpixels To Re vert Per Iteration . add ( pixels To Set Per Iteration [ iteration Ġ- Ġ 1 ] Ġ- Ġpixels To Set ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġiteration ++ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Distance Ġ+= Ġmovement Distance čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Distance Ġ= Ġmax Distance čĊĠĠĠĠĠĠĠ Ġwhile Ġ( current Distance Ġ>= Ġ 0 . 0 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpixels To Set : ĠMutable List < Int > Ġ= Ġmutable ListOf () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( pixel Ġin Ġlocation Manager . pixel Locations ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pixel Ġ! in Ġchanged Pixels Ġ&& Ġpixel . location . distance From ( center ) Ġ>= Ġcurrent Distance ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpixels To Set . add ( pixel . index ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Pixels . add ( pixel ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpixels To Set Per Iteration . add ( pixels To Set . toList ()) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( iteration Ġ> Ġ 0 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpixels To Re vert Per Iteration . add ( pixels To Set Per Iteration [ iteration Ġ- Ġ 1 ] Ġ- Ġpixels To Set ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġiteration ++ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Distance Ġ-= Ġmovement Distance čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊĠĠĠ Ġval Ġlast Re vert Ġ= Ġpixels To Set Per Iteration . last () Ġ- Ġpixels To Set Per Iteration [ 0 ] čĊĠĠĠ Ġpixels To Re vert Per Iteration [ 0 ] Ġ= Ġlast Re vert čĊĠĠĠ Ġpixels To Re vert Per Iteration . add ( last Re vert ) čĊčĊĠĠĠ Ġreturn ĠPixel Modification Lists ( pixels To Set Per Iteration , Ġpixels To Re vert Per Iteration ) č Ċ } čĊč Ċ /** čĊ Ġ* ĠGroup Ġpixels Ġbased Ġon Ġtheir Ġlocation Ġalong Ġthe ĠX Ġaxis Ġand Ġdistance Ġfrom Ġa Ġline čĊ Ġ* Ġafter Ġan Ġoffset Ġand Ġa Ġrotation Ġare Ġperformed čĊ Ġ* čĊ Ġ* Ġ@ param Ġline ĠThe Ġline Ġthat Ġwill Ġdetermine Ġif Ġa Ġpixel Ġis Ġclose Ġenough Ġto Ġbe Ġaffected čĊ Ġ* Ġ@ param Ġrotation ĠHow Ġto Ġrotate Ġthe Ġanimation čĊ Ġ* Ġ@ param Ġoffset ĠHow Ġto Ġoffset Ġthe Ġanimation čĊ Ġ* Ġ@ param Ġinfluence Distance ĠHow Ġfar Ġa Ġpixel Ġcan Ġbe Ġfrom Ġthe Ġline Ġbefore Ġit Ġdoesn 't Ġget Ġaffected čĊ Ġ* Ġ@ param Ġmovement Per Iteration ĠHow Ġfar Ġto Ġmove Ġalong Ġthe ĠX Ġaxis Ġin Ġeach Ġiteration čĊ Ġ* Ġ@ return ĠLists Ġof Ġpixels Ġto Ġmodify Ġin Ġeach Ġiteration Ġas Ġa Ġ[ Pixel Modification Lists ] čĊ Ġ*/ č Ċ fun ĠAnimation Manager . group Pixels Al ong Line ( čĊĠĠĠ Ġline : ĠE quation , čĊĠĠĠ Ġrotation : ĠRad ians Rotation , čĊĠĠĠ Ġoffset : ĠAbsolute Distance , čĊĠĠĠ Ġinfluence Distance : ĠDouble , čĊĠĠĠ Ġmovement Per Iteration : ĠDouble , č Ċ ): ĠPixel Modification Lists Ġ{ čĊĠĠĠ Ġrequire ( movement Per Iteration Ġ!= Ġ 0 . 0 ) Ġ{ Ġ" Movement Ġper Ġiteration Ġcannot Ġbe Ġ 0 " Ġ} čĊčĊĠĠĠ Ġ// ĠNeg atives Ġused Ġbecause Ġwe Ġwant Ġit Ġto Ġappear Ġlike Ġthe Ġanimation Ġmoved , Ġnot Ġthe Ġpixels čĊĠĠĠ Ġval Ġlocation Manager Ġ= ĠPixel Location Manager ( pixel Location Manager , č ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġ- offset , č ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrotation Ġ= Ġ- rotation , č ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvert X Ġ= Ġmovement Per Iteration Ġ< Ġ 0 . 0 ) čĊĠĠĠ Ġval Ġpixels To Set Per Iteration : ĠMutable List < List < Int >> Ġ= Ġmutable ListOf () čĊĠĠĠ Ġval Ġpixels To Re vert Per Iteration : ĠMutable List < List < Int >> Ġ= Ġmutable ListOf ( listOf ()) čĊčĊĠĠĠ Ġval Ġmovement Distance Ġ= Ġabs ( movement Per Iteration ) čĊčĊĠĠĠ Ġvar Ġiteration Ġ= Ġ 0 čĊĠĠĠ Ġvar Ġcurrent X Ġ= Ġlocation Manager . x Min čĊĠĠĠ Ġwhile Ġ( current X Ġ< Ġlocation Manager . x Max Ġ+ Ġmovement Per Iteration ) Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġpixels To Set : ĠMutable List < Int > Ġ= Ġmutable ListOf () čĊĠĠĠĠĠĠĠ Ġval Ġcurrent Location Ġ= ĠLocation ( current X , Ġline . calculate ( current X )) čĊĠĠĠĠĠĠĠ Ġfor Ġ( pixel Ġin Ġlocation Manager . pixel Locations ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pixel . location . distance From ( current Location ) Ġ<= Ġinfluence Distance ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpixels To Set . add ( pixel . index ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġpixels To Set Per Iteration . add ( pixels To Set . toList ()) čĊĠĠĠĠĠĠĠ Ġif Ġ( iteration Ġ> Ġ 0 ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpixels To Re vert Per Iteration . add ( pixels To Set Per Iteration [ iteration Ġ- Ġ 1 ] Ġ- Ġpixels To Set ) čĊĠĠĠĠĠĠĠ Ġiteration ++ čĊĠĠĠĠĠĠĠ Ġcurrent X Ġ+= Ġmovement Distance čĊĠĠĠ Ġ} čĊĠĠĠ Ġval Ġlast Re vert Ġ= Ġpixels To Set Per Iteration . last () Ġ- Ġpixels To Set Per Iteration [ 0 ] čĊĠĠĠ Ġpixels To Re vert Per Iteration [ 0 ] Ġ= Ġlast Re vert čĊĠĠĠ Ġpixels To Re vert Per Iteration . add ( last Re vert ) čĊčĊĠĠĠ Ġreturn ĠPixel Modification Lists ( pixels To Set Per Iteration , Ġpixels To Re vert Per Iteration ) č Ċ } čĊč Ċ /** čĊ Ġ* ĠGroup Ġpixels Ġinto Ġgroups Ġsp aced Ġapart Ġby Ġ[ group Spacing ] Ġbased Ġon Ġtheir Ġlocation Ġalong čĊ Ġ* Ġthe ĠX Ġaxis Ġand Ġdistance Ġfrom Ġa Ġline Ġafter Ġan Ġoffset Ġand Ġa Ġrotation Ġare Ġperformed čĊ Ġ* čĊ Ġ* Ġ@ param Ġline ĠThe Ġline Ġthat Ġwill Ġdetermine Ġif Ġa Ġpixel Ġis Ġclose Ġenough Ġto Ġbe Ġaffected čĊ Ġ* Ġ@ param Ġrotation ĠHow Ġto Ġrotate Ġthe Ġanimation čĊ Ġ* Ġ@ param Ġoffset ĠHow Ġto Ġoffset Ġthe Ġanimation čĊ Ġ* Ġ@ param Ġinfluence Distance ĠHow Ġfar Ġa Ġpixel Ġcan Ġbe Ġfrom Ġthe Ġline Ġbefore Ġit Ġdoesn 't Ġget Ġaffected čĊ Ġ* Ġ@ param Ġmovement Per Iteration ĠHow Ġfar Ġto Ġmove Ġalong Ġthe ĠX Ġaxis Ġin Ġeach Ġiteration čĊ Ġ* Ġ@ param Ġgroup Spacing ĠHow Ġfar Ġapart Ġalong Ġthe ĠX Ġaxis Ġeach Ġgroup Ġshould Ġbe čĊ Ġ* Ġ@ return ĠLists Ġof Ġpixels Ġto Ġmodify Ġin Ġeach Ġiteration Ġas Ġa Ġ[ Pixel Modification Lists ] čĊ Ġ*/ č Ċ fun ĠAnimation Manager . group Groups Of Pixels Al ong Line ( čĊĠĠĠ Ġline : ĠE quation , čĊĠĠĠ Ġrotation : ĠRad ians Rotation , čĊĠĠĠ Ġoffset : ĠAbsolute Distance , čĊĠĠĠ Ġinfluence Distance : ĠDouble , čĊĠĠĠ Ġmovement Per Iteration : ĠDouble , čĊĠĠĠ Ġgroup Spacing : ĠDouble , č Ċ ): ĠPixel Modification Lists Ġ{ čĊĠĠĠ Ġrequire ( movement Per Iteration Ġ!= Ġ 0 . 0 ) Ġ{ Ġ" Movement Ġper Ġiteration Ġcannot Ġbe Ġ 0 " Ġ} čĊĠĠĠ Ġrequire ( group Spacing Ġ> Ġ 0 . 0 ) Ġ{ Ġ" Group Ġspacing Ġcannot Ġbe Ġless Ġthan Ġor Ġequal Ġto Ġ 0 " Ġ} čĊčĊĠĠĠ Ġ// ĠNeg atives Ġused Ġbecause Ġwe Ġwant Ġit Ġto Ġappear Ġlike Ġthe Ġanimation Ġmoved , Ġnot Ġthe Ġpixels čĊĠĠĠ Ġval Ġlocation Manager Ġ= ĠPixel Location Manager ( pixel Location Manager , č ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġ- offset , č ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrotation Ġ= Ġ- rotation , č ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvert X Ġ= Ġmovement Per Iteration Ġ< Ġ 0 . 0 ) čĊĠĠĠ Ġval Ġpixels To Set Per Iteration : ĠMutable List < List < Int >> Ġ= Ġmutable ListOf () čĊĠĠĠ Ġval Ġpixels To Re vert Per Iteration : ĠMutable List < List < Int >> Ġ= Ġmutable ListOf ( listOf ()) čĊčĊĠĠĠ Ġval Ġmovement Distance Ġ= Ġabs ( movement Per Iteration ) čĊčĊĠĠĠ Ġvar Ġiteration Ġ= Ġ 0 čĊĠĠĠ Ġvar Ġcurrent Base Point Ġ= Ġlocation Manager . x Min čĊĠĠĠ Ġwhile Ġ( current Base Point Ġ< Ġlocation Manager . x Max Ġ+ Ġmovement Per Iteration ) Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġpixels To Set : ĠMutable List < Int > Ġ= Ġmutable ListOf () čĊĠĠĠĠĠĠĠ Ġvar Ġcurrent X Ġ= čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Base Point Ġ- Ġ( group Spacing Ġ* Ġ( truncate (( current Base Point Ġ- Ġlocation Manager . x Min ) Ġ/ Ġgroup Spacing ) Ġ+ Ġ 1 )) čĊĠĠĠĠĠĠĠ Ġwhile Ġ( current X Ġ< Ġlocation Manager . x Max Ġ+ Ġinfluence Distance ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Location Ġ= ĠLocation ( current X , Ġline . calculate ( current X )) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( pixel Ġin Ġlocation Manager . pixel Locations ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pixel . location . distance From ( current Location ) Ġ<= Ġinfluence Distance ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpixels To Set . add ( pixel . index ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent X Ġ+= Ġgroup Spacing čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġpixels To Set Per Iteration . add ( pixels To Set . toList ()) čĊĠĠĠĠĠĠĠ Ġif Ġ( iteration Ġ> Ġ 0 ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpixels To Re vert Per Iteration . add ( pixels To Set Per Iteration [ iteration Ġ- Ġ 1 ] Ġ- Ġpixels To Set ) čĊĠĠĠĠĠĠĠ Ġiteration ++ čĊĠĠĠĠĠĠĠ Ġcurrent Base Point Ġ+= Ġmovement Distance čĊĠĠĠ Ġ} čĊĠĠĠ Ġval Ġlast Re vert Ġ= Ġpixels To Set Per Iteration . last () Ġ- Ġpixels To Set Per Iteration [ 0 ] čĊĠĠĠ Ġpixels To Re vert Per Iteration [ 0 ] Ġ= Ġlast Re vert čĊĠĠĠ Ġpixels To Re vert Per Iteration . add ( last Re vert ) čĊčĊĠĠĠ Ġreturn ĠPixel Modification Lists ( pixels To Set Per Iteration , Ġpixels To Re vert Per Iteration ) č Ċ }