package Ġjump aku . cur ves . f sc . fre ec ur ve Ċ Ċ import Ġjump aku . commons . control . Option Ċ import Ġjump aku . commons . control . option When Ċ import Ġjump aku . commons . control . or Default Ċ import Ġjump aku . commons . control . to Option Ċ import Ġjump aku . commons . math . Solver Ċ import Ġjump aku . cur ves . core . curve .* Ċ import Ġjump aku . cur ves . core . curve . bezier . Bezier Ċ import Ġjump aku . cur ves . core . curve . bezier . Con ic Section Ċ import Ġjump aku . cur ves . core . curve . bsp line . BS pline Ċ import Ġjump aku . cur ves . core . geom . Point Ċ import Ġkotlin . collections . component 1 Ċ import Ġkotlin . collections . component 2 ĊĊ Ċ class ĠSm ooth Result ( val Ġcon ic Sections : ĠList < Con ic Section >, Ġval Ġcubic Be zi ers : ĠList < Bezier >) Ċ Ċ class ĠSm oo ther ( val Ġpr uning Factor : ĠDouble Ġ= Ġ 1 . 0 , Ġval Ġsampling Factor : ĠInt Ġ= Ġ 3 3 ) Ġ{ ĊĊĠĠĠ Ġfun Ġsmooth ( f sc : ĠB Spline , Ġts : ĠList < Double >, Ġsegment Result : ĠSegment Result , Ġis Closed : ĠBoolean Ġ= Ġis Closed ( f sc )): ĠSm ooth Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġp is Ġ= Ġsegment Result . segment Param Indices ĊĠĠĠĠĠĠĠ Ġval Ġsegments Ġ= Ġsegment Result . segments ĊĊĠĠĠĠĠĠĠ Ġval Ġqs Ġ= Ġsegments . map Ġ{ Ġit . con ic Section Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġc is Ġ= Ġfragment Cs ( qs , Ġf sc . invoke ( pis . map Ġ{ Ġ( ts [ it ]) Ġ}), Ġis Closed ) ĊĠĠĠĠĠĠĠ Ġval Ġks Ġ= Ġremain Con ic Section Indices ( cis ) ĊĠĠĠĠĠĠĠ Ġval Ġrs Ġ= Ġremain Cs ( qs , Ġc is , Ġks ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfis Ġ= Ġfragment F sc ( f sc , Ġts , Ġp is , Ġis Closed ) ĊĠĠĠĠĠĠĠ Ġval Ġg is Ġ= Ġcombine F sc Interval ( f sc , Ġfis , Ġks ) ĊĠĠĠĠĠĠĠ Ġval Ġbs Ġ= Ġfit Bezier ( f sc , Ġg is , Ġrs , Ġis Closed ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSm ooth Result ( rs , Ġbs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfragment Cs ( qs : ĠList < Con ic Section >, Ġcs : ĠList < Point >, Ġis Closed : ĠBoolean ): ĠList < Option < Interval >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbegins Ġ= Ġqs . zip ( cs ) Ġ{ Ġq , Ġc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInterval . Unit . sample ( sampling Factor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Ġ{ Ġq ( it ). dist ( c ) Ġ> Ġc . r Ġ* Ġpr uning Factor Ġ}. to Option () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĠSolver (). solve ( 0 . 0 .. it ) Ġ{ Ġq ( it ). dist ( c ) Ġ- Ġc . r Ġ* Ġpr uning Factor Ġ}. value () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Default ( 1 . 0 ) ĊĠĠĠĠĠĠĠ Ġ}. to Mutable List (). apply Ġ{ Ġif Ġ(! is Closed ) Ġset ( 0 , Ġ 0 . 0 ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġends Ġ= Ġqs . zip ( cs . drop ( 1 )) Ġ{ Ġq , Ġc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInterval . Unit . sample ( sampling Factor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Last Ġ{ Ġq ( it ). dist ( c ) Ġ> Ġc . r Ġ* Ġpr uning Factor Ġ}. to Option () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĠSolver (). solve ( it .. 1 . 0 ) Ġ{ Ġq ( it ). dist ( c ) Ġ- Ġc . r Ġ* Ġpr uning Factor Ġ}. value () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Default ( 0 . 0 ) ĊĊĠĠĠĠĠĠĠ Ġ}. to Mutable List (). apply Ġ{ Ġif Ġ(! is Closed ) Ġset ( last Index , Ġ 1 . 0 ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbegins . zip ( ends ) Ġ{ Ġb , Ġe Ġ-> Ġoption When ( b Ġ< Ġe ) Ġ{ ĠInterval ( b , Ġe ) Ġ} Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfragment F sc ( f sc : ĠB Spline , Ġts : ĠList < Double >, Ġp is : ĠList < Int >, Ġis Closed : ĠBoolean ): ĠList < Interval > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( b , Ġe ) Ġ= Ġf sc . domain ĊĠĠĠĠĠĠĠ Ġval Ġsample Span Ġ= Ġf sc . domain . span Ġ/ Ġ(( ts . size Ġ- Ġ 1 ) Ġ* Ġsampling Factor ) ĊĠĠĠĠĠĠĠ Ġfun Ġfragment F sc Interval ( t : ĠDouble ): ĠInterval Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġf sc ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbegin Ġ= ĠInterval ( b , Ġt ). sample ( sample Span ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Last Ġ{ Ġf sc ( it ). dist ( c ) Ġ> Ġc . r Ġ* Ġpr uning Factor Ġ}. to Option () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĠSolver (). solve ( it .. t ) Ġ{ Ġf sc ( it ). dist ( c ) Ġ- Ġc . r Ġ* Ġpr uning Factor Ġ}. value () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Default ( b ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= ĠInterval ( t , Ġe ). sample ( sample Span ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Ġ{ Ġf sc ( it ). dist ( c ) Ġ> Ġc . r Ġ* Ġpr uning Factor Ġ}. to Option () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĠSolver (). solve ( t .. it ) Ġ{ Ġf sc ( it ). dist ( c ) Ġ- Ġc . r Ġ* Ġpr uning Factor Ġ}. value () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Default ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠInterval ( begin , Ġend ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġp is . map Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! is Closed Ġ&& Ġi Ġ== Ġp is . first () Ġ-> ĠInterval ( b , Ġb ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! is Closed Ġ&& Ġi Ġ== Ġp is . last () Ġ-> ĠInterval ( e , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfragment F sc Interval ( ts [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremain Con ic Section Indices ( cis : ĠList < Option < Interval >> ): ĠList < Int > Ġ= Ġc is . with Index (). flatMap Ġ{ Ġ( i , Ġopt ) Ġ-> Ġopt . map Ġ{ Ġi Ġ} Ġ} ĊĊĠĠĠ Ġfun Ġremain Cs ( qs : ĠList < Con ic Section >, Ġc is : ĠList < Option < Interval >>, Ġks : ĠList < Int >): ĠList < Con ic Section > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġks . flatMap Ġ{ Ġc is [ it ]. map Ġ{ Ġi Ġ-> Ġqs [ it ]. clip out ( i ) Ġ} Ġ} ĊĊĠĠĠ Ġfun Ġcombine F sc Interval ( f sc : ĠB Spline , Ġfis : ĠList < Interval >, Ġks : ĠList < Int >): ĠList < Interval > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ks . isEmpty ()) Ġreturn ĠlistOf ( f sc . domain ) ĊĊĠĠĠĠĠĠĠ Ġval Ġm idd les Ġ= Ġks . zip With Next Ġ{ Ġprev , Ġnext Ġ-> ĠInterval ( fis [ prev Ġ+ Ġ 1 ]. begin , Ġfis [ next ]. end ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġ( b , Ġe ) Ġ= Ġf sc . domain ĊĠĠĠĠĠĠĠ Ġval Ġfront Ġ= Ġfis [ ks . first ()]. copy ( begin Ġ= Ġb ) ĊĠĠĠĠĠĠĠ Ġval Ġback Ġ= Ġfis [ ks . last () Ġ+ Ġ 1 ]. copy ( end Ġ= Ġe ) ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( front ) Ġ+ Ġm idd les Ġ+ ĠlistOf ( back ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfit Bezier ( f sc : ĠB Spline , Ġg is : ĠList < Interval >, Ġrs : ĠList < Con ic Section >, Ġis Closed : ĠBoolean ): ĠList < Bezier > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġf itter Ġ= ĠSm ooth Bezier F itter () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( rs . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġif Ġ( is Closed ) Ġf sc . close () Ġelse Ġf sc ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( f itter . fit All F sc ( parametrize ( s . invoke ( Sampler ( sampling Factor ))))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġderivatives Ġ= Ġrs . map Ġ{ Ġit . different iate () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġp 0 v 0 s Ġ= Ġrs . zip ( deriv atives ) Ġ{ Ġr , Ġd Ġ-> ĠPair ( r ( 1 . 0 ), Ġd ( 1 . 0 )) Ġ}. drop Last ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġp 1 v 1 s Ġ= Ġrs . zip ( deriv atives ) Ġ{ Ġr , Ġd Ġ-> ĠPair ( r ( 0 . 0 ), Ġd ( 0 . 0 )) Ġ}. drop ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġp 0 v 0 p 1 v 1 s Ġ= Ġp 0 v 0 s . zip ( p 1 v 1 s )// Ġ{ Ġpv 0 , Ġpv 1 Ġ-> ĠTuple 4 ( pv 0 ._ 1 , Ġpv 0 ._ 2 , Ġpv 1 ._ 1 , Ġpv 1 ._ 2 ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġm idd les Ġ= Ġg is . slice ( 1 Ġuntil Ġg is . last Index ). zip ( p 0 v 0 p 1 v 1 s ) Ġ{ Ġi , Ġ( p 0 v 0 , Ġp 1 v 1 ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġparame tri ze ( f sc . restrict ( i ). invoke ( Sampler ( sampling Factor ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf itter . fit Middle ( p 0 v 0 . first , Ġp 0 v 0 . second , Ġp 1 v 1 . first , Ġp 1 v 1 . second , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġval Ġ( p 1 , Ġv 1 ) Ġ= Ġrs . first ()( 0 . 0 ) Ġto Ġ Ġderivatives . first ()( 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġfront Points Ġ= Ġg is . first (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( begin Ġ== Ġend ) ĠList ( sampling Factor ) Ġ{ Ġf sc ( begin ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġf sc . restrict ( this ). invoke ( Sampler ( sampling Factor )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġ( p 0 , Ġv 0 ) Ġ= Ġrs . last ()( 1 . 0 ) Ġto Ġderivatives . last ()( 1 . 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġback Points Ġ= Ġg is . last (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( begin Ġ== Ġend ) ĠList ( sampling Factor ) Ġ{ Ġf sc ( end ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġf sc . restrict ( this ). invoke ( Sampler ( sampling Factor )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Closed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġparame tri ze ( back Points Ġ+ Ġfront Points . reversed ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm idd les Ġ+ Ġf itter . fit Middle ( p 0 , Ġv 0 , Ġp 1 , Ġv 1 , Ġdata ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfront Data Ġ= Ġparame tri ze ( front Points ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġback Data Ġ= Ġparame tri ze ( back Points ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( f itter . fit Front ( p 1 , Ġv 1 , Ġfront Data )) Ġ+ Ġm idd les Ġ+ ĠlistOf ( f itter . fit Back ( p 0 , Ġv 0 , Ġback Data )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Closed ( s : ĠB Spline ): ĠBoolean Ġ= Ġs . invoke ( Sampler ( 2 )). let Ġ{ Ġ( b , Ġe ) Ġ-> Ġe . is Possible ( b ). value Ġ> Ġ 0 . 5 Ġ} ĊĊĠĠĠ Ġfun Ġparame tri ze ( points : ĠList < Point >): ĠList < Param Point > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġch ord al Parame tri ze ( points , Ġrange Ġ= ĠInterval . Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. try Recover Ġ{ Ġuniform Parame tri ze ( points , Ġrange Ġ= ĠInterval . Unit ) Ġ}. value (). or Throw () Ċ } Ċ