/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠAnt on ĠTr ush kov Ċ Ġ* Ċ Ġ* Ġ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 Ġorg . ks df v . the le ma . math Ċ Ċ import Ġkotlin . math . sqrt Ċ Ċ /** Ġ@ author ĠX op pa , Ġz eg an styl Ġ*/ Ċ class ĠCat m ull Rom Spline ( var Ġcontrol Points : ĠList < IV ec >, Ġvar Ġcontinuous : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġtmp : ĠI Vec Ġ= Ġcontrol Points [ 0 ]. copy () ĊĠĠĠ Ġprivate Ġval Ġtmp 2 Ġ= Ġcontrol Points [ 0 ]. copy () ĊĠĠĠ Ġprivate Ġval Ġtmp 3 Ġ= Ġcontrol Points [ 0 ]. copy () ĊĠĠĠ Ġvar Ġspan Count Ġ= Ġif Ġ( continuous ) Ġcontrol Points . size Ġelse Ġcontrol Points . size Ġ- Ġ 3 ĊĊĠĠĠ Ġfun Ġvalue At ( out : ĠI Vec , Ġt : ĠFloat ): ĠI Vec Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġspan Count ĊĠĠĠĠĠĠĠ Ġvar Ġu Ġ= Ġt Ġ* Ġn ĊĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġif Ġ( t Ġ>= Ġ 1 f ) Ġn Ġ- Ġ 1 Ġelse Ġu . toInt () ĊĠĠĠĠĠĠĠ Ġu Ġ-= Ġi . toFloat () ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue At ( out , Ġi , Ġu ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ@ return ĠThe Ġvalue Ġof Ġthe Ġspline Ġat Ġposition Ġu Ġof Ġthe Ġspecified Ġspan Ġ*/ ĊĠĠĠ Ġfun Ġvalue At ( out : ĠI Vec , Ġspan : ĠInt , Ġu : ĠFloat ): ĠI Vec Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcalculate ( out , Ġif Ġ( continuous ) Ġspan Ġelse Ġspan Ġ+ Ġ 1 , Ġu , Ġcontrol Points , Ġcontinuous , Ġtmp ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġderivative At ( out : ĠI Vec , Ġt : ĠFloat ): ĠI Vec Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġspan Count ĊĠĠĠĠĠĠĠ Ġvar Ġu Ġ= Ġt Ġ* Ġn ĊĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġif Ġ( t Ġ>= Ġ 1 f ) Ġn Ġ- Ġ 1 Ġelse Ġu . toInt () ĊĠĠĠĠĠĠĠ Ġu Ġ-= Ġi . toFloat () ĊĠĠĠĠĠĠĠ Ġreturn Ġderivative At ( out , Ġi , Ġu ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ@ return ĠThe Ġderivative Ġof Ġthe Ġspline Ġat Ġposition Ġu Ġof Ġthe Ġspecified Ġspan Ġ*/ ĊĠĠĠ Ġfun Ġderivative At ( out : ĠI Vec , Ġspan : ĠInt , Ġu : ĠFloat ): ĠI Vec Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġderivative ( out , Ġif Ġ( continuous ) Ġspan Ġelse Ġspan Ġ+ Ġ 1 , Ġu , Ġcontrol Points , Ġcontinuous , Ġtmp ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** Ġ@ return ĠThe Ġspan Ġclosest Ġto Ġthe Ġspecified Ġvalue , Ġrestrict ing Ġto Ġthe Ġspecified Ġspans . Ġ*/ ĊĠĠĠ Ġ/** Ġ@ return ĠThe Ġspan Ġclosest Ġto Ġthe Ġspecified Ġvalue Ġ*/ ĊĠĠĠ Ġfun Ġnearest (` in `: ĠI Vec ?, Ġstart : ĠInt Ġ= Ġ 0 , Ġcount : ĠInt Ġ= Ġspan Count ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġstart 1 Ġ= Ġstart ĊĠĠĠĠĠĠĠ Ġwhile Ġ( start 1 Ġ< Ġ 0 ) Ġstart 1 Ġ+= Ġspan Count ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġstart 1 Ġ% Ġspan Count ĊĠĠĠĠĠĠĠ Ġvar Ġdst Ġ= Ġ` in ` !!. dst 2 ( control Points [ result ]) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 Ġuntil Ġcount ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx Ġ= Ġ( start 1 Ġ+ Ġi ) Ġ% Ġspan Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd Ġ= Ġ` in `. dst 2 ( control Points [ idx ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( d Ġ< Ġdst ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdst Ġ= Ġd ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġidx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġapproximate ( v : ĠI Vec ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġapproximate ( v , Ġnearest ( v )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġapproximate (` in `: ĠI Vec , Ġstart : ĠInt , Ġcount : ĠInt ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġapproximate (` in `, Ġnearest (` in `, Ġstart , Ġcount )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġapproximate (` in `: ĠI Vec ?, Ġnear : ĠInt ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġn Ġ= Ġnear ĊĠĠĠĠĠĠĠ Ġval Ġnearest Ġ= Ġcontrol Points [ n ] ĊĠĠĠĠĠĠĠ Ġval Ġprevious Ġ= Ġcontrol Points [ if Ġ( n Ġ> Ġ 0 ) Ġn Ġ- Ġ 1 Ġelse Ġspan Count Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġcontrol Points [( n Ġ+ Ġ 1 ) Ġ% Ġspan Count ] ĊĠĠĠĠĠĠĠ Ġval Ġdst Prev 2 Ġ= Ġ` in ` !!. dst 2 ( previous ) ĊĠĠĠĠĠĠĠ Ġval Ġdst Next 2 Ġ= Ġ` in `. dst 2 ( next ) ĊĠĠĠĠĠĠĠ Ġval Ġp 1 : ĠI Vec ĊĠĠĠĠĠĠĠ Ġval Ġp 2 : ĠI Vec ĊĠĠĠĠĠĠĠ Ġval Ġp 3 : ĠI Vec ? ĊĠĠĠĠĠĠĠ Ġif Ġ( dst Next 2 Ġ< Ġdst Prev 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp 1 Ġ= Ġnearest ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp 2 Ġ= Ġnext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp 3 Ġ= Ġ` in ` ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp 1 Ġ= Ġprevious ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp 2 Ġ= Ġnearest ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp 3 Ġ= Ġ` in ` ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn Ġ= Ġif Ġ( n Ġ> Ġ 0 ) Ġn Ġ- Ġ 1 Ġelse Ġspan Count Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġl 1 S qr Ġ= Ġp 1 . dst 2 ( p 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġl 2 S qr Ġ= Ġp 3 . dst 2 ( p 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġl 3 S qr Ġ= Ġp 3 . dst 2 ( p 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġl 1 Ġ= Ġsqrt ( l 1 S qr . toDouble ()). toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġ( l 2 S qr Ġ+ Ġl 1 S qr Ġ- Ġl 3 S qr ) Ġ/ Ġ( 2 f Ġ* Ġl 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġu Ġ= ĠM ATH . clamp (( l 1 Ġ- Ġs ) Ġ/ Ġl 1 , Ġ 0 f , Ġ 1 f ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ( n Ġ+ Ġu ) Ġ/ Ġspan Count ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlocate ( v : ĠI Vec ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġapproximate ( v ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġapprox Length ( samples : ĠInt ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtemp Length Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsamples ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp 2 . set ( tmp 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue At ( tmp 3 , Ġi Ġ/ Ġ( samples . toFloat () Ġ- Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ> Ġ 0 ) Ġtemp Length Ġ+= Ġtmp 2 . dst ( tmp 3 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtemp Length ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĠCalculates Ġthe Ġcat m ull rom Ġvalue Ġfor Ġthe Ġgiven Ġposition Ġ( t ). ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġout ĠThe ĠVector Ġto Ġset Ġto Ġthe Ġresult . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġt ĠThe Ġposition Ġ( 0 <= t <= 1 ) Ġon Ġthe Ġspline ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġpoints ĠThe Ġcontrol Ġpoints ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġcontinuous ĠIf Ġtrue Ġthe Ġb - spline Ġrestart s Ġat Ġ 0 Ġwhen Ġre aching Ġ 1 ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtmp ĠA Ġtemporary Ġvector Ġused Ġfor Ġthe Ġcalculation ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠThe Ġvalue Ġof Ġout ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġcalculate ( out : ĠI Vec , Ġt : ĠFloat , Ġpoints : ĠList < IV ec >, Ġcontinuous : ĠBoolean , Ġtmp : ĠI Vec ): ĠI Vec Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġif Ġ( continuous ) Ġpoints . size Ġelse Ġpoints . size Ġ- Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġu Ġ= Ġt Ġ* Ġn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġif Ġ( t Ġ>= Ġ 1 f ) Ġn Ġ- Ġ 1 Ġelse Ġu . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġu Ġ-= Ġi . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcalculate ( out , Ġi , Ġu , Ġpoints , Ġcontinuous , Ġtmp ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠCalculates Ġthe Ġcat m ull rom Ġvalue Ġfor Ġthe Ġgiven Ġspan Ġ( i ) Ġat Ġthe Ġgiven Ġposition Ġ( u ). ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġout ĠThe ĠVector Ġto Ġset Ġto Ġthe Ġresult . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġi ĠThe Ġspan Ġ( 0 <= i < span Count ></ span Count >) Ġspan Count Ġ= Ġcontinuous Ġ? Ġpoints . length Ġ: Ġpoints . length Ġ- Ġdegree ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġu ĠThe Ġposition Ġ( 0 <= u <= 1 ) Ġon Ġthe Ġspan ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġpoints ĠThe Ġcontrol Ġpoints ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġcontinuous ĠIf Ġtrue Ġthe Ġb - spline Ġrestart s Ġat Ġ 0 Ġwhen Ġre aching Ġ 1 ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtmp ĠA Ġtemporary Ġvector Ġused Ġfor Ġthe Ġcalculation ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠThe Ġvalue Ġof Ġout ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġcalculate ( out : ĠI Vec , Ġi : ĠInt , Ġu : ĠFloat , Ġpoints : ĠList < IV ec >, Ġcontinuous : ĠBoolean , Ġtmp : ĠI Vec ): ĠI Vec Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġpoints . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġu 2 Ġ= Ġu Ġ* Ġu ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġu 3 Ġ= Ġu 2 Ġ* Ġu ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . set ( points [ i ]). scl ( 1 . 5 f Ġ* Ġu 3 Ġ- Ġ 2 . 5 f Ġ* Ġu 2 Ġ+ Ġ 1 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( continuous Ġ|| Ġi Ġ> Ġ 0 ) Ġout . add ( tmp . set ( points [( n Ġ+ Ġi Ġ- Ġ 1 ) Ġ% Ġn ]). scl (- 0 . 5 f Ġ* Ġu 3 Ġ+ Ġu 2 Ġ- Ġ 0 . 5 f Ġ* Ġu )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( continuous Ġ|| Ġi Ġ< Ġn Ġ- Ġ 1 ) Ġout . add ( tmp . set ( points [( i Ġ+ Ġ 1 ) Ġ% Ġn ]). scl (- 1 . 5 f Ġ* Ġu 3 Ġ+ Ġ 2 f Ġ* Ġu 2 Ġ+ Ġ 0 . 5 f Ġ* Ġu )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( continuous Ġ|| Ġi Ġ< Ġn Ġ- Ġ 2 ) Ġout . add ( tmp . set ( points [( i Ġ+ Ġ 2 ) Ġ% Ġn ]). scl ( 0 . 5 f Ġ* Ġu 3 Ġ- Ġ 0 . 5 f Ġ* Ġu 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġout ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠCalculates Ġthe Ġderivative Ġof Ġthe Ġcat m ull rom Ġspline Ġfor Ġthe Ġgiven Ġposition Ġ( t ). ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġout ĠThe ĠVector Ġto Ġset Ġto Ġthe Ġresult . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġt ĠThe Ġposition Ġ( 0 <= t <= 1 ) Ġon Ġthe Ġspline ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġpoints ĠThe Ġcontrol Ġpoints ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġcontinuous ĠIf Ġtrue Ġthe Ġb - spline Ġrestart s Ġat Ġ 0 Ġwhen Ġre aching Ġ 1 ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtmp ĠA Ġtemporary Ġvector Ġused Ġfor Ġthe Ġcalculation ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠThe Ġvalue Ġof Ġout ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġderivative ( out : ĠI Vec , Ġt : ĠFloat , Ġpoints : ĠList < IV ec >, Ġcontinuous : ĠBoolean , Ġtmp : ĠI Vec ): ĠI Vec Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġif Ġ( continuous ) Ġpoints . size Ġelse Ġpoints . size Ġ- Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġu Ġ= Ġt Ġ* Ġn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġif Ġ( t Ġ>= Ġ 1 f ) Ġn Ġ- Ġ 1 Ġelse Ġu . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġu Ġ-= Ġi . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġderivative ( out , Ġi , Ġu , Ġpoints , Ġcontinuous , Ġtmp ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠCalculates Ġthe Ġderivative Ġof Ġthe Ġcat m ull rom Ġspline Ġfor Ġthe Ġgiven Ġspan Ġ( i ) Ġat Ġthe Ġgiven Ġposition Ġ( u ). ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġout ĠThe ĠVector Ġto Ġset Ġto Ġthe Ġresult . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġi ĠThe Ġspan Ġ( 0 <= i < span Count ></ span Count >) Ġspan Count Ġ= Ġcontinuous Ġ? Ġpoints . length Ġ: Ġpoints . length Ġ- Ġdegree ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġu ĠThe Ġposition Ġ( 0 <= u <= 1 ) Ġon Ġthe Ġspan ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġpoints ĠThe Ġcontrol Ġpoints ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġcontinuous ĠIf Ġtrue Ġthe Ġb - spline Ġrestart s Ġat Ġ 0 Ġwhen Ġre aching Ġ 1 ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtmp ĠA Ġtemporary Ġvector Ġused Ġfor Ġthe Ġcalculation ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠThe Ġvalue Ġof Ġout ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġderivative ( out : ĠI Vec , Ġi : ĠInt , Ġu : ĠFloat , Ġpoints : ĠList < IV ec >, Ġcontinuous : ĠBoolean , Ġtmp : ĠI Vec ): ĠI Vec Ġ{ Ġ/* Ċĉĉ Ġ* Ġcat m ull '( u ) Ġ= Ġ 0 . 5 Ġ* ((- p 0 Ġ+ Ġp 2 ) Ġ+ Ġ 2 Ġ* Ġ( 2 * p 0 Ġ- Ġ 5 * p 1 Ġ+ Ġ 4 * p 2 Ġ- Ġp 3 ) Ġ* Ġu Ġ+ Ġ 3 Ġ* Ġ(- p 0 Ġ+ Ġ 3 * p 1 Ġ- Ġ 3 * p 2 Ġ+ Ġp 3 ) Ġ* Ġu Ġ* Ġu ) Ċĉĉ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġpoints . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġu 2 Ġ= Ġu Ġ* Ġu ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfinal Ġfloat Ġu 3 Ġ= Ġu 2 Ġ* Ġu ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . set ( points [ i ]). scl (- u Ġ* Ġ 5 Ġ+ Ġu 2 Ġ* Ġ 4 . 5 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( continuous Ġ|| Ġi Ġ> Ġ 0 ) Ġout . add ( tmp . set ( points [( n Ġ+ Ġi Ġ- Ġ 1 ) Ġ% Ġn ]). scl (- 0 . 5 f Ġ+ Ġu Ġ* Ġ 2 Ġ- Ġu 2 Ġ* Ġ 1 . 5 f )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( continuous Ġ|| Ġi Ġ< Ġn Ġ- Ġ 1 ) Ġout . add ( tmp . set ( points [( i Ġ+ Ġ 1 ) Ġ% Ġn ]). scl ( 0 . 5 f Ġ+ Ġu Ġ* Ġ 4 Ġ- Ġu 2 Ġ* Ġ 4 . 5 f )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( continuous Ġ|| Ġi Ġ< Ġn Ġ- Ġ 2 ) Ġout . add ( tmp . set ( points [( i Ġ+ Ġ 2 ) Ġ% Ġn ]). scl (- u Ġ+ Ġu 2 Ġ* Ġ 1 . 5 f )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġout ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ