package Ġcom . ed uc ards . scroll selector Ċ Ċ import Ġjava . lang . Math . c br t Ċ import Ġkotlin . math .* Ċ Ċ /** Ċ Ġ* ĠThis Ġclass Ġdeals Ġwith Ġthe Ġcomputation Ġof Ġthe Ġ` selection Ratio `: Ġ[ compute Selection Ratio ]. Ċ Ġ* ĠThe Ġ` selection ` Ġitself Ġis Ġmay Ġbe Ġperformed Ġin Ġthe Ġsecond Ġstep , Ġusually Ġby Ġlever aging Ġthe Ġ[ Selector ]. Ċ Ġ* Ċ Ġ* Ġ* Ġ` selection Ratio ` Ġis Ġa Ġreal Ġvalue Ġfrom Ġan Ġopen Ġinterval Ġ`( 0 , Ġ 1 )`. Ċ Ġ* ĠĠ ĠThe Ġvalue Ġdefines Ġwhich Ġpart Ġof Ġthe Ġviewport Ġof Ġthe Ġscroll able Ġ[ View ] Ġto Ġselect . Ċ Ġ* ĠĠ ĠThe Ġ[ View ] Ġcan Ġbe Ġany ĠUI Ġcomponent Ġwhich Ġhas Ġthe Ġability Ġto Ġscroll Ġand Ġmeasure Ċ Ġ* ĠĠ Ġits Ġinner Ġcontent Ġ( such Ġas Ġ[ RecyclerView ], Ġ[ ListView ], Ġor Ġ[ ScrollView ]). Ċ Ġ* Ġ* Ġ` selection ` Ġis Ġthe Ġact Ġof Ġdetermining Ġand Ġselecting Ġa Ġspecific Ġ[ View ] Ġor Ġits Ċ Ġ* ĠĠ Ġpart Ġbased Ġon Ġthe Ġcomputed Ġ` selection Ratio `. Ċ Ġ* Ċ Ġ* ĠBecause Ġthe Ġ` selection Ratio ` Ġcomputation Ġis Ġnot Ġtrivial , Ġmultiple Ċ Ġ* Ġmethods Ġare Ġpublic Ġto Ġenable Ġbetter Ġdebugging Ġand Ġvisualization Ġ([ curve ], Ġ[ curve Top ], Ġ[ curve Middle ], Ġ[ curve Bottom ]). Ċ Ġ*/ Ċ class ĠSelection Ratio Solver Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġedge Distance Top ĠDistance Ġ( number Ġof Ġpixels ) Ġto Ġscroll Ġthe Ġ[ View ] Ġto Ġthe Ġvery Ġtop . ĊĠĠĠĠ Ġ* Ġ` null ` Ġif Ġthe Ġtop Ġis Ġtoo Ġfar Ġto Ġbe Ġmeasured . ĠThis Ġis Ġparticularly Ġthe Ġcase Ġfor Ġlarge Ġlists . ĊĠĠĠĠ Ġ* Ġ@ param Ġedge Distance Bottom ĠDistance Ġ( number Ġof Ġpixels ) Ġto Ġscroll Ġthe Ġ[ View ] Ġto Ġthe Ġvery Ġbottom . ĊĠĠĠĠ Ġ* Ġ` null ` Ġif Ġthe Ġtop Ġis Ġtoo Ġfar Ġto Ġbe Ġmeasured . ĠThis Ġis Ġparticularly Ġthe Ġcase Ġfor Ġlarge Ġlists . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġ` selection Ratio ` Ġof Ġthe Ġ[ View ]' s Ġviewport : ĊĠĠĠĠ Ġ* Ġ* Ġ 0 . 0 Ġ- Ġthe Ġtop Ġedge Ġof Ġthe Ġ[ View ] ĊĠĠĠĠ Ġ* Ġ* Ġ 0 . 5 Ġ- Ġmiddle Ġpart Ġof Ġthe Ġ[ View ] ĊĠĠĠĠ Ġ* Ġ* Ġ 1 . 0 Ġ- Ġthe Ġbottom Ġedge Ġof Ġthe Ġ[ View ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ** Note **: ĠThe Ġ`( 0 , Ġ 1 )` Ġinterval Ġ[ can Ġbe Ġcustomized ][ Input Params . rem apped Ratio ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcompute Selection Ratio ( ĊĠĠĠĠĠĠĠ Ġparams : ĠInput Params , ĊĠĠĠĠĠĠĠ Ġedge Distance Top : ĠInt ?, ĊĠĠĠĠĠĠĠ Ġedge Distance Bottom : ĠInt ?, ĊĠĠĠ Ġ): ĠDouble ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġratio Ġ= Ġif Ġ( edge Distance Top Ġ!= Ġnull Ġ&& Ġedge Distance Bottom Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurve Middle ( params , Ġedge Distance Top , Ġedge Distance Bottom ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( edge Distance Top Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurve Top ( params , Ġedge Distance Top . toDouble ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( edge Distance Bottom Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġparams . bottom Per ception Range Ġ- Ġedge Distance Bottom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurve Bottom ( params , Ġx . toDouble ()) ?. plus ( params . selection Y Mid ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . selection Y Mid ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġparams . selection Area . remap For View ( ratio ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġcomponent Ġof Ġthe Ġ[ compute Selection Ratio ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcurve Middle ( ĊĠĠĠĠĠĠĠ Ġparams : ĠInput Params , ĊĠĠĠĠĠĠĠ Ġedge Distance Top : ĠInt , ĊĠĠĠĠĠĠĠ Ġedge Distance Bottom : ĠInt ĊĠĠĠ Ġ): ĠDouble ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtop Y Ġ= Ġcurve Top ( params , Ġedge Distance Top . toDouble ()) ĊĠĠĠĠĠĠĠ Ġval Ġbottom Y Ġ= Ġcurve Bottom ( params , Ġ( params . bottom Per ception Range Ġ- Ġedge Distance Bottom ). toDouble ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( top Y Ġ!= Ġnull Ġ&& Ġbottom Y Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġedge Distance Top ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Width Ġ= Ġedge Distance Top Ġ+ Ġedge Distance Bottom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbottom Start Ġ= Ġtotal Width Ġ- Ġparams . bottom Per ception Range ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġweight From Ġ= Ġmax ( 0 , Ġbottom Start ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġweight To Ġ= Ġmin ( params . top Per ception Range , Ġtotal Width ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġweight Dist Ġ= Ġweight To Ġ- Ġweight From ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtop Weight Ġ= Ġif Ġ( x Ġ< Ġweight From ) Ġ 1 . 0 Ġelse Ġif Ġ( x Ġ> Ġweight To ) Ġ 0 . 0 Ġelse Ġ 1 Ġ- Ġ(( x Ġ- Ġweight From ). toDouble () Ġ/ Ġweight Dist ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Weight Ġ= Ġsqrt ( top Weight ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbottom Weight Ġ= Ġif Ġ( x Ġ< Ġweight From ) Ġ 0 . 0 Ġelse Ġif Ġ( x Ġ> Ġweight To ) Ġ 1 . 0 Ġelse Ġ( x Ġ- Ġweight From ). toDouble () Ġ/ Ġweight Dist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Weight Ġ= Ġsqrt ( bottom Weight ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop Y Shift ed Ġ= Ġtop Y Ġ- Ġparams . selection Y Mid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( top Y Shift ed Ġ* Ġtop Weight Ġ+ Ġbottom Y Ġ* Ġbottom Weight ) Ġ+ Ġparams . selection Y Mid ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġcomponent Ġof Ġthe Ġ[ compute Selection Ratio ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcurve Top ( params : ĠInput Params , Ġx : ĠDouble ) Ġ= Ġcurve ( ĊĠĠĠĠĠĠĠ Ġparams . top Per ception Range . toDouble (), ĊĠĠĠĠĠĠĠ Ġparams . selection Y Mid , ĊĠĠĠĠĠĠĠĠ 1 . 0 Ġ- Ġparams . st iff ness , ĊĠĠĠĠĠĠĠ Ġx ĊĠĠĠ Ġ) ?. second ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġcomponent Ġof Ġthe Ġ[ compute Selection Ratio ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcurve Bottom ( params : ĠInput Params , Ġx : ĠDouble ) Ġ= Ġcurve ( ĊĠĠĠĠĠĠĠ Ġparams . bottom Per ception Range . toDouble (), ĊĠĠĠĠĠĠĠĠ 1 . 0 Ġ- Ġparams . selection Y Mid , ĊĠĠĠĠĠĠĠĠ 1 . 0 Ġ- Ġparams . st iff ness , ĊĠĠĠĠĠĠĠ Ġx ĊĠĠĠ Ġ) ?. second ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComputes Ġa Ġvalue Ġof Ġa Ġfunction Ġ` f ` Ġwith Ġthe Ġfollowing Ġproperties : ĊĠĠĠĠ Ġ* Ġ* Ġ` f ` Ġis Ġcontinuous ĊĠĠĠĠ Ġ* Ġ* ĠIs Ġconstant Ġfor Ġ` f ( 0 ) Ġ= Ġ 0 ` ĊĠĠĠĠ Ġ* Ġ* ĠIs Ġconstant Ġfor Ġ` f ( width ) Ġ= Ġheight ` ĊĠĠĠĠ Ġ* Ġ* Ġ` f ` Ġis Ġmon oton ically Ġde creasing Ġ(` x Ġ<= Ġy Ġ| Ġf ( x ) Ġ<= Ġf ( y ) `) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThese Ġproperties Ġensure , Ġthat Ġthe Ġlinear Ġcombination Ġof Ġmultiple Ġcurves Ġwill ĊĠĠĠĠ Ġ* Ġpreserve Ġthese Ġproperties Ġfor Ġthe Ġresulting Ġcurve . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠBe zier Ġcurve Ġis Ġone Ġpossible Ġimplementation . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠResult Ġas Ġa Ġpair Ġof Ġ{ x , Ġy }. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcurve ( ĊĠĠĠĠĠĠĠ Ġwidth : ĠDouble , ĊĠĠĠĠĠĠĠ Ġheight : ĠDouble , ĊĠĠĠĠĠĠĠ Ġcur v ature : ĠDouble , ĊĠĠĠĠĠĠĠ Ġx : ĠDouble ĊĠĠĠ Ġ): ĠPair < Double , ĠDouble >? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠBe zier Ġin Ġgeneral Ġdoesn 't Ġhave Ġthe Ġrequested Ġproperties . ĠIt 's Ġnot Ġevent Ġa ĊĠĠĠĠĠĠĠ Ġ// Ġfunction Ġby Ġdefinition , ĠBe zier Ġis Ġa Ġparame tric Ġfunction . ĊĠĠĠĠĠĠĠ Ġ// ĠBut , Ġwith Ġthe Ġright Ġconstraints Ġit Ġgive Ġthe Ġsame Ġvalue Ġas Ġthe Ġdesired Ġfunction . ĊĠĠĠĠĠĠĠ Ġreturn Ġcurve Bezier For X ( width , Ġheight , Ġcur v ature , Ġx ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcurve Bezier For P ( ĊĠĠĠĠĠĠĠ Ġwidth : ĠDouble , ĊĠĠĠĠĠĠĠ Ġheight : ĠDouble , ĊĠĠĠĠĠĠĠ Ġcur v ature : ĠDouble , ĊĠĠĠĠĠĠĠ Ġp : ĠDouble ĊĠĠĠ Ġ): ĠPair < Double , ĠDouble > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠB ( t ) Ġ= Ġ( 1 Ġ- Ġt ) 3 P 0 Ġ+ Ġ 3 ( 1 - t ) 2 t P 1 Ġ+ Ġ 3 ( 1 - t ) t 2 P 2 Ġ+ Ġt 3 P 3 ĊĊĠĠĠĠĠĠĠ Ġval Ġx 0 Ġ= Ġ. 0 ĊĠĠĠĠĠĠĠ Ġval Ġy 0 Ġ= Ġ. 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġx 1 Ġ= Ġcur v ature Ġ* Ġwidth ĊĠĠĠĠĠĠĠ Ġval Ġy 1 Ġ= Ġ. 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġx 2 Ġ= Ġwidth Ġ- Ġcur v ature Ġ* Ġwidth ĊĠĠĠĠĠĠĠ Ġval Ġy 2 Ġ= Ġheight ĊĊĠĠĠĠĠĠĠ Ġval Ġx 3 Ġ= Ġwidth ĊĠĠĠĠĠĠĠ Ġval Ġy 3 Ġ= Ġheight ĊĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġ(( 1 Ġ- Ġp ). pow ( 3 ) Ġ* Ġx 0 ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 3 Ġ* Ġ( 1 Ġ- Ġp ). pow ( 2 ) Ġ* Ġp Ġ* Ġx 1 ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 3 Ġ* Ġ( 1 Ġ- Ġp ) Ġ* Ġp . pow ( 2 ) Ġ* Ġx 2 ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( p . pow ( 3 ) Ġ* Ġx 3 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġ(( 1 Ġ- Ġp ). pow ( 3 ) Ġ* Ġy 0 ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 3 Ġ* Ġ( 1 Ġ- Ġp ). pow ( 2 ) Ġ* Ġp Ġ* Ġy 1 ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 3 Ġ* Ġ( 1 Ġ- Ġp ) Ġ* Ġp . pow ( 2 ) Ġ* Ġy 2 ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( p . pow ( 3 ) Ġ* Ġy 3 ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( x , Ġy ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcurve Bezier For X ( ĊĠĠĠĠĠĠĠ Ġwidth : ĠDouble , ĊĠĠĠĠĠĠĠ Ġheight : ĠDouble , ĊĠĠĠĠĠĠĠ Ġcur v ature : ĠDouble , ĊĠĠĠĠĠĠĠ Ġx : ĠDouble ĊĠĠĠ Ġ): ĠPair < Double , ĠDouble >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġfind T ( width , Ġcur v ature , Ġx ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( t Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurve Bezier For P ( width , Ġheight , Ġcur v ature , Ġt ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind T ( ĊĠĠĠĠĠĠĠ Ġwidth : ĠDouble , ĊĠĠĠĠĠĠĠ Ġcur v ature : ĠDouble , ĊĠĠĠĠĠĠĠ Ġx : ĠDouble ): ĠDouble ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġx 0 Ġ= Ġ. 0 ĊĠĠĠĠĠĠĠ Ġval Ġx 1 Ġ= Ġcur v ature Ġ* Ġwidth ĊĠĠĠĠĠĠĠ Ġval Ġx 2 Ġ= Ġwidth Ġ- Ġcur v ature Ġ* Ġwidth ĊĠĠĠĠĠĠĠ Ġval Ġx 3 Ġ= Ġwidth ĊĊĠĠĠĠĠĠĠ Ġval Ġroots Ġ= Ġfind Roots ( x , Ġx 0 , Ġx 1 , Ġx 2 , Ġx 3 ); ĊĠĠĠĠĠĠĠ Ġif Ġ( roots ?. isNotEmpty () Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( t Ġin Ġroots ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( t Ġin Ġ 0 . 0 .. 1 . 0 ) Ġreturn Ġt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFind Ġthe Ġroots Ġfor Ġa Ġcubic Ġpolynomial Ġwith Ġb ern stein Ġcoefficients ĊĠĠĠĠ Ġ* Ġ{ pa , Ġpb , Ġpc , Ġpd }. ĠThe Ġfunction Ġwill Ġfirst Ġconvert Ġthose Ġto Ġthe ĊĠĠĠĠ Ġ* Ġstandard Ġpolynomial Ġcoefficients , Ġand Ġthen Ġrun Ġthrough ĠCard ano 's ĊĠĠĠĠ Ġ* Ġformula Ġfor Ġfinding Ġthe Ġroots Ġof Ġa Ġdep ressed Ġcubic Ġcurve . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ[ Source ]( https :// stackoverflow . com / a / 5 1 8 8 3 3 4 7 / 9 1 5 7 5 6 ) ĊĠĠĠĠ Ġ* Ġ@ author Ġ[ Mi ke Ġ' P om ax ' ĠK am erm ans ]( https :// stackoverflow . com / users / 7 4 0 5 5 3 / mike - pom ax - k am erm ans ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfind Roots ( x : ĠDouble , Ġpa : ĠDouble , Ġpb : ĠDouble , Ġpc : ĠDouble , Ġpd : ĠDouble ): ĠDouble Array ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġpa 3 Ġ= Ġ 3 Ġ* Ġpa ĊĠĠĠĠĠĠĠ Ġval Ġpb 3 Ġ= Ġ 3 Ġ* Ġpb ĊĠĠĠĠĠĠĠ Ġval Ġpc 3 Ġ= Ġ 3 Ġ* Ġpc ĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġ- pa Ġ+ Ġpb 3 Ġ- Ġpc 3 Ġ+ Ġpd ĊĠĠĠĠĠĠĠ Ġvar Ġb Ġ= Ġpa 3 Ġ- Ġ 2 Ġ* Ġpb 3 Ġ+ Ġpc 3 ĊĠĠĠĠĠĠĠ Ġvar Ġc Ġ= Ġ- pa 3 Ġ+ Ġpb 3 ĊĠĠĠĠĠĠĠ Ġvar Ġd Ġ= Ġpa Ġ- Ġx ĊĊĠĠĠĠĠĠĠ Ġ// ĠFun Ġfact : Ġany ĠBe zier Ġcurve Ġmay Ġ( acc ident ally Ġor Ġon Ġpurpose ) ĊĠĠĠĠĠĠĠ Ġ// Ġperfectly Ġmodel Ġany Ġlower Ġorder Ġcurve , Ġso Ġwe Ġwant Ġto Ġtest ĊĠĠĠĠĠĠĠ Ġ// Ġfor Ġthat : Ġlower Ġorder Ġcurves Ġare Ġmuch Ġeasier Ġto Ġroot - find . ĊĠĠĠĠĠĠĠ Ġif Ġ( approx imately ( a , Ġ 0 . 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġis Ġnot Ġa Ġcubic Ġcurve . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( approx imately ( b , Ġ 0 . 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġin Ġfact , Ġthis Ġis Ġnot Ġa Ġquadr atic Ġcurve Ġeither . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( approx imately ( c , Ġ 0 . 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġin Ġfact Ġin Ġfact , Ġthere Ġare Ġno Ġsolutions . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdouble ArrayOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġdouble ArrayOf (- d Ġ/ Ġc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlinear Ġsolution : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġquadr atic Ġsolution : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġq : ĠDouble Ġ= Ġsqrt ( c Ġ* Ġc Ġ- Ġ 4 Ġ* Ġb Ġ* Ġd ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb 2 Ġ= Ġ 2 Ġ* Ġb ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdouble ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( q Ġ- Ġc ) Ġ/ Ġb 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(- c Ġ- Ġq ) Ġ/ Ġb 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAt Ġthis Ġpoint , Ġwe Ġknow Ġwe Ġneed Ġa Ġcubic Ġsolution , ĊĠĠĠĠĠĠĠ Ġ// Ġand Ġthe Ġabove Ġa / b / c / d Ġvalues Ġwere Ġtechnically ĊĠĠĠĠĠĠĠ Ġ// Ġa Ġpre - optimized Ġset Ġbecause Ġa Ġmight Ġbe Ġzero Ġand ĊĠĠĠĠĠĠĠ Ġ// Ġthat Ġwould Ġcause Ġthe Ġfollowing Ġdiv isions Ġto Ġerror . ĊĠĠĠĠĠĠĠ Ġb Ġ/= Ġa ĊĠĠĠĠĠĠĠ Ġc Ġ/= Ġa ĊĠĠĠĠĠĠĠ Ġd Ġ/= Ġa ĊĠĠĠĠĠĠĠ Ġval Ġb 3 Ġ= Ġb Ġ/ Ġ 3 ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġ( 3 Ġ* Ġc Ġ- Ġb Ġ* Ġb ) Ġ/ Ġ 3 ĊĠĠĠĠĠĠĠ Ġval Ġp 3 Ġ= Ġp Ġ/ Ġ 3 ĊĠĠĠĠĠĠĠ Ġval Ġq Ġ= Ġ( 2 Ġ* Ġb Ġ* Ġb Ġ* Ġb Ġ- Ġ 9 Ġ* Ġb Ġ* Ġc Ġ+ Ġ 2 7 Ġ* Ġd ) Ġ/ Ġ 2 7 ĊĠĠĠĠĠĠĠ Ġval Ġq 2 Ġ= Ġq Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġdis crimin ant Ġ= Ġq 2 Ġ* Ġq 2 Ġ+ Ġp 3 Ġ* Ġp 3 Ġ* Ġp 3 ĊĠĠĠĠĠĠĠ Ġval Ġu 1 : ĠDouble ĊĠĠĠĠĠĠĠ Ġval Ġv 1 : ĠDouble ĊĊĠĠĠĠĠĠĠ Ġ// Ġcase Ġ 1 : Ġthree Ġreal Ġroots , Ġbut Ġfinding Ġthem Ġinvolves Ġcomplex ĊĠĠĠĠĠĠĠ Ġ// Ġmath s . ĠSince Ġwe Ġdon 't Ġhave Ġa Ġcomplex Ġdata Ġtype , Ġwe Ġuse Ġtrig ĊĠĠĠĠĠĠĠ Ġ// Ġinstead , Ġbecause Ġcomplex Ġnumbers Ġhave Ġnice Ġge ometric Ġproperties . ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( dis crimin ant Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmp 3 Ġ= Ġ- p Ġ/ Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr : ĠDouble Ġ= Ġsqrt ( mp 3 Ġ* Ġmp 3 Ġ* Ġmp 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġ- q Ġ/ Ġ( 2 Ġ* Ġr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġco sp hi : ĠDouble Ġ= Ġif Ġ( t Ġ< Ġ- 1 ) Ġ- 1 . 0 Ġelse Ġif Ġ( t Ġ> Ġ 1 ) Ġ 1 . 0 Ġelse Ġt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġphi : ĠDouble Ġ= Ġa cos ( co sp hi ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcr tr : ĠDouble Ġ= Ġc br t ( r ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt 1 Ġ= Ġ 2 Ġ* Ġcr tr ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdouble ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt 1 Ġ* Ġcos ( phi Ġ/ Ġ 3 ) Ġ- Ġb 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt 1 Ġ* Ġcos (( phi Ġ+ ĠT AU ) Ġ/ Ġ 3 ) Ġ- Ġb 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt 1 Ġ* Ġcos (( phi Ġ+ Ġ 2 Ġ* ĠT AU ) Ġ/ Ġ 3 ) Ġ- Ġb 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( dis crimin ant Ġ== Ġ 0 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġu 1 Ġ= Ġif Ġ( q 2 Ġ< Ġ 0 ) Ġc br t (- q 2 ) Ġelse Ġ- c br t ( q 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdouble ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ* Ġu 1 Ġ- Ġb 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- u 1 Ġ- Ġb 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsd : ĠDouble Ġ= Ġsqrt ( dis crimin ant ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġu 1 Ġ= Ġc br t (- q 2 Ġ+ Ġsd ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 Ġ= Ġc br t ( q 2 Ġ+ Ġsd ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdouble ArrayOf ( u 1 Ġ- Ġv 1 Ġ- Ġb 3 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġapproximately ( a : ĠDouble , Ġb : ĠDouble ): ĠBoolean Ġ= Ġabs ( a - b ) Ġ< Ġ 0 . 0 0 0 0 0 1 ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTAG Ġ= Ġ" Selection Solver " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠT AU Ġ= Ġ 2 Ġ* ĠMath . PI ĊĠĠĠ Ġ} Ċ Ċ }