/* Ċ Ġ* Ċ Ġ* Ġ Ġ* ĠCopyright Ġ[ 2 0 2 0 Ġ- ĠPresent ] Ġ[ L Ãª ĠTr áº§n ĠNg á»įc ĠTh Ãłnh Ġ- Ġ çĳ Ľ å¤ª Ġ( e ita )] Ġ[ k ine ita Ġ( Github )] Ċ Ġ* Ġ Ġ* Ċ Ġ* Ġ Ġ* Ġ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 Ġjp . e ita . canvas gl . util Ċ Ċ import Ġandroid . graphics . PointF Ċ import Ġkotlin . math .* Ċ Ċ object ĠMath Utils Ġ{ ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ L AMBDA Ġ= Ġ 1 0 f ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ SPEED : ĠInt Ġ= Ġ 1 5 ĊĊĠĠĠ Ġfun Ġgenerate Curve ( point From : ĠPoint F , Ġpoint To : ĠPoint F , Ġradius : ĠFloat , Ġspeed : ĠInt Ġ= ĠDEFAULT _ SPEED ): ĠArrayList < PointF > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult : ĠArrayList < PointF > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġval Ġdist : ĠFloat Ġ= Ġdistance Of ( point From , Ġpoint To ) ĊĠĠĠĠĠĠĠ Ġval Ġh Ġ= Ġsqrt ( radius Ġ* Ġradius Ġ- Ġdist Ġ* Ġdist Ġ/ Ġ 4 . 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġangle Step : ĠFloat Ġ= Ġspeed Ġ/ Ġradius ĊĠĠĠĠĠĠĠ Ġif Ġ( 2 . 0 f Ġ* Ġradius Ġ<= Ġdist ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" Radius Ġis Ġtoo Ġsmall ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠFind Ġcenter Ġpoint ĊĠĠĠĠĠĠĠ Ġval Ġx 1 : ĠFloat Ġ= Ġpoint From . x ĊĠĠĠĠĠĠĠ Ġval Ġx 2 : ĠFloat Ġ= Ġpoint From . y ĊĠĠĠĠĠĠĠ Ġval Ġy 1 : ĠFloat Ġ= Ġpoint To . x ĊĠĠĠĠĠĠĠ Ġval Ġy 2 : ĠFloat Ġ= Ġpoint To . y ĊĠĠĠĠĠĠĠ Ġval Ġm 1 : ĠFloat Ġ= Ġ( x 1 Ġ+ Ġy 1 ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġm 2 : ĠFloat Ġ= Ġ( x 2 Ġ+ Ġy 2 ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġu 1 : ĠFloat Ġ= Ġ-( y 2 Ġ- Ġx 2 ) Ġ/ Ġdist ĊĠĠĠĠĠĠĠ Ġval Ġu 2 : ĠFloat Ġ= Ġ( y 1 Ġ- Ġx 1 ) Ġ/ Ġdist ĊĠĠĠĠĠĠĠ Ġval Ġo 1 : ĠFloat Ġ= Ġ( m 1 Ġ+ Ġh Ġ* Ġu 1 ). toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġo 2 : ĠFloat Ġ= Ġ( m 2 Ġ+ Ġh Ġ* Ġu 2 ). toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġpoint Center Ġ= ĠPoint F ( o 1 , Ġo 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġstart Angle : ĠFloat Ġ= Ġget Angle ( point From , Ġpoint Center , Ġradius ) ĊĠĠĠĠĠĠĠ Ġvar Ġend Angle : ĠFloat Ġ= Ġget Angle ( point To , Ġpoint Center , Ġradius ) ĊĠĠĠĠĠĠĠ Ġif Ġ( end Angle Ġ< Ġstart Angle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Angle Ġ+= Ġ 2 . 0 f Ġ* ĠMath . PI . toFloat () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġl adder Start Angle : ĠFloat Ġ= Ġstart Angle ĊĠĠĠĠĠĠĠ Ġwhile Ġ( lad der Start Angle Ġ< Ġend Angle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoint Ġ= ĠPoint F ( o 1 Ġ+ Ġradius Ġ* Ġcos ( lad der Start Angle ), Ġo 2 Ġ+ Ġradius Ġ* Ġsin ( lad der Start Angle )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( point ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl adder Start Angle Ġ+= Ġangle Step ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġresult . add ( point To ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Angle ( point X : ĠPoint F , Ġpoint Y : ĠPoint F , Ġradius : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcos A : ĠFloat Ġ= Ġ( point X . x Ġ- Ġpoint Y . x ) Ġ/ Ġradius ĊĠĠĠĠĠĠĠ Ġval Ġsin A : ĠFloat Ġ= Ġ( point X . y Ġ- Ġpoint Y . y ) Ġ/ Ġradius ĊĠĠĠĠĠĠĠ Ġval Ġangle : ĠFloat Ġ= Ġa cos ( cos A ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ( if Ġ( sin ( angle ) Ġ* Ġsin A Ġ>= Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġangle ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 . 0 f Ġ* ĠMath . PI . toFloat () Ġ- Ġangle ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdistance Of ( point X : ĠPoint F , Ġpoint Y : ĠPoint F ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġh ypot ( point X . x Ġ- Ġpoint Y . x , Ġpoint X . y Ġ- Ġpoint Y . y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate Line ( point From : ĠPoint F , Ġpoint To : ĠPoint F , Ġspeed : ĠInt Ġ= ĠDEFAULT _ SPEED ): ĠList < PointF > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠArrayList < PointF >() ĊĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġdistance Of ( point From , Ġpoint To ) ĊĠĠĠĠĠĠĠ Ġval Ġdistance From O Ġ= Ġdistance Of ( point From , ĠPoint F ( 0 f , Ġ 0 f )) ĊĠĠĠĠĠĠĠ Ġval Ġdistance To O Ġ= Ġdistance Of ( point To , ĠPoint F ( 0 f , Ġ 0 f )) ĊĊĠĠĠĠĠĠĠ Ġvar Ġdelta X Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġdelta Y Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġflag Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġwhile Ġ( flag Ġ< Ġdistance ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlambda Ġ= ĠDEFAULT _ L AMBDA Ġ+ Ġspeed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflag Ġ+= Ġlambda ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( distance From O Ġ> Ġdistance To O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelta X Ġ-= Ġif Ġ( point From . x Ġ== Ġpoint To . x ) Ġ 0 f Ġelse Ġlambda ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelta Y Ġ-= Ġif Ġ( point From . y Ġ== Ġpoint To . y ) Ġ 0 f Ġelse Ġlambda ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelta X Ġ+= Ġif Ġ( point From . x Ġ== Ġpoint To . x ) Ġ 0 f Ġelse Ġlambda ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelta Y Ġ+= Ġif Ġ( point From . y Ġ== Ġpoint To . y ) Ġ 0 f Ġelse Ġlambda ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġif Ġ( point To . x Ġ>= Ġ 0 ) Ġpoint From . x Ġ+ Ġdelta X Ġelse Ġpoint From . x Ġ- Ġdelta X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġif Ġ( point To . y Ġ>= Ġ 0 ) Ġpoint From . y Ġ+ Ġdelta Y Ġelse Ġpoint From . y Ġ- Ġdelta Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoint F Ġ= ĠPoint F ( x , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( point F ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠRe location Ġlast Ġitem ĊĠĠĠĠĠĠĠ Ġif Ġ( result . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Location Ġ= Ġresult . size Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ last Location ]. x Ġ!= Ġpoint To . x Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ last Location ]. x Ġ= Ġpoint To . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ last Location ]. y Ġ!= Ġpoint To . y Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ last Location ]. y Ġ= Ġpoint To . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind Mid point ( point X : ĠPoint F , Ġpoint Y : ĠPoint F ): ĠPoint F Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġx : ĠFloat Ġ= Ġ( point X . x Ġ+ Ġpoint Y . x ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġy : ĠFloat Ġ= Ġ( point X . y Ġ+ Ġpoint Y . y ) Ġ/ Ġ 2 ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPoint F ( x , Ġy ) ĊĠĠĠ Ġ} Ċ }