package Ġde . rob ol ab . client . renderer . drawable . utils Ċ Ċ import Ġde . rob ol ab . common . utils . Vector Ċ import Ġkotlin . math . min Ċ Ċ /** Ċ Ġ* Ġ@ author Ġl ars Ċ Ġ*/ Ċ object ĠB Spline Ġ: ĠCurve Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġeval ( t : ĠDouble , Ġpoints : ĠList < Vector >): ĠVector Ġ= ĊĠĠĠĠĠĠĠ Ġeval ( t , Ġmin ( DEFAULT _ DEG REE , Ġpoints . last Index ), Ġpoints ) ĊĊĠĠĠ Ġ// override Ġfun Ġeval Gradient ( t : ĠDouble , Ġpoints : ĠList < Point >): ĠPoint Ġ= ĊĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġeval ( t , Ġmin ( DEFAULT _ DEG REE , Ġpoints . last Index ) Ġ- Ġ 1 , Ġpoints ). normalize () ĊĊĠĠĠ Ġprivate Ġfun Ġeval ( t : ĠDouble , Ġdegree : ĠInt , Ġpoints : ĠList < Vector >): ĠVector Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( t Ġ== Ġ 0 . 0 ) Ġreturn Ġpoints . first () ĊĠĠĠĠĠĠĠ Ġif Ġ( t Ġ== Ġ 1 . 0 ) Ġreturn Ġpoints . last () ĊĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġvector ( degree , Ġpoints . size ) ĊĠĠĠĠĠĠĠ Ġreturn Ġc ox De Bo or ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv . indexOf Last Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ<= Ġ( t Ġ* Ġ( points . size Ġ- Ġdegree )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt Ġ* Ġ( points . size Ġ- Ġdegree ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpoints , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdegree ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġvector Cache : ĠMutable Map < Pair < Int , ĠInt >, ĠList < Int >> Ġ= Ġmutable Map Of () ĊĠĠĠ Ġprivate Ġfun Ġvector ( degree : ĠInt , Ġpoint Count : ĠInt ): ĠList < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvector Cache . get Or Put ( degree Ġto Ġpoint Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < Int >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġdegree ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ+= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. ( point Count Ġ- Ġdegree )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ+= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġdegree ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ+= Ġpoint Count Ġ- Ġdegree ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġc ox De Bo or ( curve Segment : ĠInt , Ġt : ĠDouble , Ġvector : ĠList < Int >, Ġpoints : ĠList < Vector >, Ġdegree : ĠInt ): ĠVector Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġd : ĠMutable List < Vector > Ġ= ĠArrayList ( degree Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġ 0 .. degree ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd Ġ+= Ġpoints [ index Ġ+ Ġcurve Segment Ġ- Ġdegree ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( r Ġin Ġ 1 .. degree ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġdegree Ġdown To Ġr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalpha Ġ= Ġ( t Ġ- Ġvector [ j Ġ+ Ġcurve Segment Ġ- Ġdegree ]) Ġ/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( vector [ j Ġ+ Ġ 1 Ġ+ Ġcurve Segment Ġ- Ġr ] Ġ- Ġvector [ j Ġ+ Ġcurve Segment Ġ- Ġdegree ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd [ j ] Ġ= Ġ( d [ j Ġ- Ġ 1 ] Ġ* Ġ( 1 . 0 Ġ- Ġalpha )) Ġ+ Ġ( d [ j ] Ġ* Ġalpha ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġd [ degree ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ DEG REE Ġ= Ġ 3 Ċ } Ċ