From f25c02a37dc97150a0046ba52c45d18f2cd5b9dd Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Wed, 7 Aug 2019 21:07:31 +0800 Subject: [PATCH] add doc --- docs/images/lib2-bspline_curve-1.JPG | Bin 0 -> 28316 bytes docs/images/lib2-bspline_curve-2.JPG | Bin 0 -> 28268 bytes docs/images/lib2-bspline_curve-3.JPG | Bin 0 -> 29158 bytes docs/lib2-bspline_curve.md | 84 +++++++++++++++++++++++++++ 4 files changed, 84 insertions(+) create mode 100644 docs/images/lib2-bspline_curve-1.JPG create mode 100644 docs/images/lib2-bspline_curve-2.JPG create mode 100644 docs/images/lib2-bspline_curve-3.JPG create mode 100644 docs/lib2-bspline_curve.md diff --git a/docs/images/lib2-bspline_curve-1.JPG b/docs/images/lib2-bspline_curve-1.JPG new file mode 100644 index 0000000000000000000000000000000000000000..f0409ec0e7fbaffc282979584748f209670b658b GIT binary patch literal 28316 zcmeHv1za6j(r*(q0fGdAOSrhZTLgy?+}+(ZI0*!T6WoFm+&uw;LvRi5?iQTaWcTgP zWM+4E_nWuh?(fY_PSUq;-#&fn)T#Pc)&Ja^@tZjSRa{t17=VI;0-V7=z|B1BoRG7L zApl580n`8hAOJ8>Jis0B2p)VR?r#FXfX7hav20?}?f<}i06^{9!2kX^68N4UYykcS z_z%ME(I2lrB=Cm>{*b^Q68J*`e@Ni}M+t~K*x8#{f+L3wgZ_>rFhIocJ`CnB$K?^> z-;bf$SO6d*;;+YlMHL9|ZYB2zs`&p=fBqQr9}@UO0)I&04+;Dsfxk+CnURT$n~{^7 zk%O3-iJOs)o0SXrwQ~R<4mbdIfIVOW+=7ssc|;szdwXkc1_nzzdL4Z$T?2YOD+>l^ z9cugQv=9YHc&U_@_@6HV#-=1b5;pes0H{_OmCj93s zz;}Eke|{DxCntI*7J4gNBL*feE-nT}W(HgSMd?XGICi>ilI)-ez`uc2ix;iZSbWBY8I&?bvEKGFzEG+sQY)qWY zhD^F7f9_si?=QVuJJ_0k?^|Dw!NAQ9{Ts{6BN;3I{j7ggJT4* z;eKjspkr_F3~cZ%o{fc>m*I!&co}Ym@skJreV_avk`_O&z8<&U z?Xz3i{;7L81DpTZY@3_#{|P|p1hK6X2x4z0 zfu{gGEG!%>3_Khx90EK%!aX!Z5M$iKL_tMD!^XtL!N$bK!Xu=3ghxO|fQ3y$PeMjX zMMF!2OU%H+K+Q}+O+$Tq6DW8DgnM`IVIU%6P~&6cQ~%Sin??W)0cz^b6*LqHa0d+v z8V%~E1t08 zaX)<~BrGB-CN3whps1v*qN=BFU}$7)Vrpma;OOM+;_CbAwV(f+fWU~zcTv$Xv2pQf z=^2?>**PC_OUueDDyyn%YCku(w6?W(bao964UdeDjenh(UszmPURhmR-`GDmJUTx4 zc6xSxJ1!^y`cK39%gBBh7aBOOJ1{WNFz~nIg1X}bHfS^$*hfro=#ORKb!;AxFnc3l zJPA)NX}Swxk=?`8wH>(kkd$?vZ2xv>-$(Y34b10X8rfe4_SbPu07%eK;N(H00Rq4| zcOYfq9iKqT_ji8JmR4gjI;vP6!ex2q0fudd3{FX-AylA`YuJ506!GXlVC8yx(eoUu zUf>4sU2izMA6n%+d;NMB7!l|Mop9k4d;_d$?%e>_C|Nha5_eB!idw=# zbokZB?DZ4nfeI9wEu~$%hHs-P)3w+qi$Qu^o$DblO;>gsmOdDJp1=)z9yvs@!ix!E z$a~2MVF3S)O^L((1|XAodIJ=*r{4hS`FR&c4@|CO5$4 zTainW^M)%FP2wA%0oU^eAQ=-A;_>de0X{S2-2nZ^3n&-+**Cxeo#CX3ldDxL9b`Lx zCpGUZo;|f{yJWH`Dj>hCsxyFlHF5QQ8&{u&`t-NUC_0qu#);7DkkYJJ0x}F4Stucl z7yp&*=c6f%sHxjMqgExl@~$AdA~2AG8U)qfi!v<`_-|^|GzrEGbOx1meq7rtPw`8{ zy(5Gmu*!r8#B;u~1A_RomozCbp8ZMlpnhOB-vBKGH^9BsCZZz>XHY?4t#5#Rwn3Ta zTlcN5G5dT3)}G&5lY8LR3uf$-&G8ie*Hk7%(?kf5jeKL79{R+j8s74M5JS z9dHmeT~h<`TLe}KYR6PGSuO-`fG-U#{vpO64 zTSh-|IEP$yt)r=}%UB|1%1eL_KYv0*qKG#-E ztr*n#Ucq0^R^W<#MMd<241|WF@DeE-h867>j&$#qT zC%$AS;UcQW7919Zck;(F%>kijbJ>K7j&n9qjGS*4sCJ4@vl`^)8n!#*pA5G6L(-N! zgEd0d>C>klK3Ro9>owcdLcgTk(+aHbWFtUFD9kv-p8gt2qOm(FOyjkkEWFpuwHTSK z*GvSkS|Oc&=F?zPtLx@5QYkQB5yT-=N9`dAuZDw}qrL$UxPVoz{r1J8_h)XwO*OFo(8Ne?HT>a1nB}@@`JquQ z3lssl8^hDDF=QlH|EACUIgYT8>Y4TIlQl+?=5!*^IVxcgzsl{ij_@IZgsd}~xuLHFAE&fUKa^u&y(piPBg z@jNi#fg1b;Fv+<)&0?|4lS#iHyxUNhk^3ev-F z+DyiUu1pK07W|KLN;%oJJ|j;xr17c0VBp|Wl7<1RHKZsXFykl!%SH90NQWWF$e$;w zoAE^_tmQ zSCq;QWHlQJPyH0E$dgja^bWf{p$)^b&925;1RjD@fNiN=&5S@EBKN>N3<6zJj0aC} z9~<8lZBy+@0e1>aBw1@gr*T?ff7mY#;a}a@kEl{f?B{?Y%WEB+BS8!qA>e<#DX3iu z4@p*-yTvt)M7TI>Id6b~{llUKp2RrrI=Ks}@raB+Z9#dVG+vcWNH%ha zUyWHP+G%==_zAaRk`1(!37*6fXP|`c;%vaxltP)T+QzYT7rf==e5=lnR#WV+pBoqX-PJ<^)$4!!-HCCp0ir$YD#03H!vCQ z-jVF$#JR?gXVOm>Paq*1MJH-eS}(OyZ0={byb8I;3E2rbqhOZy=gxO^FUVK@!UAne zR&VoQl4TpQVmKY2J9eySJ_v9}4{USB=dD;SJLu0;H2bj1GUYrbR$LcvZ1iAOJ(fhx z;ljA;k@8(H#IRS?4uDaPtQa@9RtseXvaBuS^-<1yyuyN|L${i5+Nls9Y*hI@55iwEZ)_?F!;uU`=u zgvIgAMaR;^ryuHb!$*4QiF)eW9GYdq9kPCm`1N{tuh&niIFYruop>U@<1U}5y57#5 z|8efSq`c4FwIiO5hdNuspWs{-FyHDd^pIa$JYh@exB#YUrjXyr0dbh2up-2Xdm_B3 z&qo|TXHbj8-(Ty@N{W>c!qok%cgiW$mdI1FSZ1b{e2v`-5uQWyt$61rxAqvu0nUpo zt)}7hF>C1AC5S*UTtNgvlzxpW1-bU*eS8DFCQQ8n+Sk|Me^}GMxMY)k@^Se9KZuF- z5?;jg4pbn|S_~J`?+4_URP{PejwR~x8okfThqw4o2&okX-dsv#JL^eAf0IqpLx8&5 zsTYmdh@UKFu1H=rZ$|g>MR{#~@;d()97!foOmf-B%|Q>^IEj5bSL54ibLK|qZh)ee z>Vw%CP96dprPF|X_cA38MO<}ch|27^dLg;6wp%^B7(NxLpX>|oz@tfI_CAR!#`Ti{ zwKh>hv_cMi*s1mpoPhpeV;)*txNu2J;2SUM+#p!!_ji(H{F^@q+0Rz5a*%`8(moDE z8iKGtZ4gQa>PF^pAB4F;Rm!RRG>UszQE4LCr(y;9I`HOu(=HKbYu4;%uLA)3tvlGZ z@X)N4@hh1|3n-=aSUu_M{q+y}9H2kAY14kvE80cr4x(ChG2erAjMBVro0J>cp|whT zpr+n7Ab~?_Da$A<0@>gyq?*TKNuuaxpi7P(abQzmEw6aSEnH+#po~|?I1f{VqXLJG zsmm;)ZH@hsk#FPJmOJ~ErRJ(gOVGW|gF^9boj;o=>o5UNMMiGG|Or<)xg+_)Ao z_TfHw&|UYQyVskPF5oEaldIX5^l{;d&v_ym;mAC*xsUv$wrqD`(rM}b-Mp3!hd_A%ndLwD&Kz_ zvWxz%sjJ^J4ffM}mAXl!HoReVDh<3gyUX&CJOJ%l8v!rMyKBiuu!(bnMl~=_m_@x* z>8Vt^o1}xdNGO?rb~@(fnKn~ zJY!}wf?5Ewf|TmZz%|*azTd^Tt&|}Y%^uvQ;4RDdxR642&}dK5*LnuqU#^Y=9Wy-g ziriQsVVN3lMLQvcQ*Sejb0H$nuReWOq)K6ZsR5$U%|{rtLzz!QXG_Q5CsDFbaEZ1t z^kz<5lu*A_Y>N?5dw+<+m?CIrOrKiVbl*^lty*4*gHdIo+s=vATJ5u+m_gL%3{yA> zCSCyOB+pFC7vZ=85b?m!obwh&!i9mMxxDA+wmp%n`}{`b4 z-R2fZB0mB{^*r{;7FUWlw`OUayEo;-8SeK`eVzQ^n-mzTi?vzXq&)pas9yZPkj{~b zQSc$~7!oxIo6=B|whscvACdHdT`}i-e1tgkK#0ic!nPa}vY_sp~s7cVT!36Rv-SgOV zob#T=S;;w7Qy-x(U?Y%jF`jVuQH_Drk~zY*I$rDLvmrOBlzfOzPY;_tDVdIH490m5zt~+t91LgM}h8ZWm8NX852) z-pdydAZbW4?88zBwCLTFKFxPfuHP4Z%V@pm#PbgZS(C=+etAwVNJIIKQg^mQ_pA_JUl^^(t=u)J%=9%}Cn> zn}U;risAAf0!0XP+rhf=CglD=%v+E`W%d^nN{m0&*(FCW8~nF$}%c=&-vU( zV1=T?1Y^0+HQ<7~J9E3>)CDf3RE93G<}Jw2d8TQaRr!LaR1S9N@<~FTbr8=-J;s3v zP0fCfXAdTqxqg;R6bc3NrgmW7)ag3pW7^NN(K33s`D*pse036-uP!pJy^R&;JFPSTK&9HPIlm^T4_R!r!)Oo#2Gt08%IK!v1Hby!z_l=iSePS{t9pK82Xj6KKns z=PRTu8U_beil-#`^^4+cIJfJ_A4^fUs}30!k67r{R>V2h+uld1=6g)=W{FTpM>Ui$ zlYq3+y{N_}s{AGXRcLTg1&vTm>7HT(E$x@w1qnfqBXiFy0l~ zhrhZ3hHii}>JQEliz)+Z&j&Bb^w;s<9&oG1={+gT$V&`P^@i9$PDAW8ybNgNQN@pO z)`h62X11c@hsOHJ@JvJOepv0G#gnfa{sbC4^Zp8CNH++?8Z08F>!*4Ql0Hcm4dJg6 z2($F^{7~w!Py2nclZ968o(J?3pqn)k2Z#3hBbfU*-Mto?)Ve@g*E+YZ%BljjG>{7F zw>`ANpq#dyqricDMc)Oq$?Q4zNv-(Gmgmw3vy>CKp@t)eZTokOAjS>*894e0P{RLt zj$W+?v!SH{RoaF`2*Z^;c^6WwAoM^BU5pPP*s#J>y^8KSY;hbC!@Q2m&}_F99`tn% zdD4Pv`&2M?yR(Dulh#N@LXX}H_opg#5gRLy%exRk@LM( zMhn9G^xw0W)3P{nr06w6+sp+%f(Bf&EKM+uMbQp-;}_bL-@~xn&sc1L927Rp8MVxw zKC4K5Z+iInp?}U7jqI4^3)WUalxmdPNrmUm`0RqnQBN|m62eE4^vfB=nVQ*;>a2<) zj;^G0*U|#l_@9A>?_bX4(?o|h_hp|ZFSfWQr=GkPT(?4E;`NZNyN`YLigV6d5N8Q# zkw8kw#tL@2Jo=k;J1_bNr9cIwLX;Pe=K|Xb$k-hA=~4{k4XmE>JlRJsdV{_-(M~Ho zYKKVs{>~!c4?H*sbMC$W7<(b-hoo6SZaE?JUTM?(1q8X2X1>0L0yVjAi8txJ5!o96 zVCKwfq8n)ssi$L4$8B|@@GpwD7kZ@llrBIUY6)qzh>ew+gW|bbyORac`(*;I=r5bM zq9FdCNaFUpGzt5&mv1W@PH+Yrj^?d2$lMP1{ad&T+Jh>P@0)$SA7`mcWy+W%COS(C zKhum9{IzL4u&Y2p%#LNO%eH1E*8d5*Olh4}<=bPvY}Ng2e_q}dJ}spx9|i4#dy%Ap zq8(lI%1Cw*OdZFVB2BYsM<{qxGpg&dQpn56xDsla3Sp_xt1s@t+FD!N-e-mr_E3FU zPUJ-EN!{IlDV^`k(E2vt`0!0(RDc2TnO!>mJBL1Mca|o=2LVP;xI9;ET7~Fo+};iz zte{B8pP4L!1=1#Nhpq|4dGr|# zv2l9SbkKulI7M6{o&AO@r0=K(so>_@t!m*5!(ixdlmY)kw`ANH&HIc8HPNP1$4izi0tb{a>n+l-)WuGwf)s);BU3-#Vg)P-I=^{C5{IH^D5S**GNp7ib>E59+qA=>1) z8b~}$qNeih+ZY`*Nk)s1n8nzL4#-ZQR^Ko|E|VO{G1Tr}!e}I#7M!Kr?6uDFa9ztk(|Nc`rb@TIjI$9!W~puymh2=)ly~N5q{)B{N8- zQQHZ%hyDzaB9>pdZ`zs}E9hY!lZlhf4Pb0F=5W_zEQP|&5p*&t)7N=uNQ;mwFt1w6 zl59tISsUb3tGm7@LRTLnS=GB5n|h%CC?>owmPGTCX|ejFAb!f*^1AX>2 zDhiXyVLp@TWYN*flBn-)wo-(7-N(;dRrfNOWMN1nAV~oeU#$zvQjBud7}#%)u)WX4 zxtu379Pc!Ke)*O&-K$wXo6JS5h|J81Q?&>#aH6dMw&0!l7>8^=6G^egPCImDV<%)H zF2~q|c&{>(py-YL<|gvaK5=!>tFRBimfk@zOo)8A4-fA7gE_0_-K`7GOSN1(JBJ5! z?@$PNb2{5&C6IQsIU&Kp!#j<=teH4pSteRns$J#@OhhbV9GyJS_deyN8rPB)rY_Lr z`DUvky3pwaVphfA`7Fg=_C<;3Jc{90Ce^QWSQy+{yzZYZ+(5r7;(va+4Q9W~>aG+? zaN0!9LC|Dx#JegUxGli>E-_>2Jn^caJifs{-CuhD`G-%4AJQUaL@izovfA=m1{J`^ zcr^y)B5lD_kS0-?)02+se3Vi>pmFZcQzm)3)a7y(8~Y`0$$boZ8QFZ!w7=aIUHx8y}*tR4_X9pfW z6(IYq_0pO--F}tYpfOB#q3M>iKM8_YBd7EHXDmUX#|hVKy)L~`7*OH#!S3Y2$Pvzw z@_`E+v}5Z8MM;#a%i20ji{am15WTY-W15!iUJT|QyO4en+FP1zV}NgsX96RI%j8ID zfSmA(m5$G@gkN*trG*E%m|WQVeRt4gzSVMEa%Llx4xjk2LS4GQTC1<}*I=L4iNJjuYJz@`&RNHFKPJj#3Df@)tJ>Rznde3nHtsMXHr6JTwh$L2ch;_V#vcC zjsCnKWr#OCQbbY}e6PZXlwUGCB`zSSGg)NXnqQ_}J?3D8X=eRxb`yT(fd=y|PqMCm zXPBR+2)}l~%f0rHg=4_*H`VmZZ%;yz5TNVQ|Fv8EfxjlXdzroeq_iHX>Dpk9pNO2Zen;XFK37?W8{Y8kCLhe$160 z7DJ2bqeEtKpn zixfeT8q;>3_dS=QPnE74M?KHUsAdIGPKAy=&k5_nQiBI8n6(p1|6w-GGSZ?N=h>1t zG>0lQ?o1Hjn+3&3zdtF%swyUvSM6h0y2A6VCBt9!@krPD;j6~`B9}p$$Y4I22u!F!aYK04an@(61_o9M{5|alGeXl6kCRP|h68N&W-snQ6@_jcihTQkE%Y z=dc)TL&*2!WEf$43z$S6F8;7GexS%G{mIq7!1Kq4O>ay&pr7^}H&VC_w_EMsO%DH} zM>9xkyyeGKX9m@gZC;x~zP6O?J_qz}D{YxLh#{0$B|HxPT;R@T!fEggKw8zRbplrp zK0U(|SFc~F)-Uu!gAAka*A{oUUDjs*>5$YQRy*!|RqfEuPEznkzr6u5%Uq}ncBX&? zUPl71KBpfF#j)@|^7KGb){k~$P)7V$7PAU2dqR;ZcVUACM+jT16vqn*WpTCfJ6#sq z33S)Nozpb;nHq`YrpJEFCrL5>V=DM7np4V4k+nIo>vN=`x!aDrpl*umh9#S?cmjo) z%%+Qhr)v}0CRVsp)8H>~AmK&>hCgNkSLp9{-~VEeV_ugM74h8*l^ zQ9+_-0VpJF3X7ccBG5G}pVEr3PE+^fRQF@v&{qWGsh0;$^S;b4Ofw!)&_hgNa(c)m z)7HHLCsOKE!Dtt&CkAJIWcgurn7#KwD6m-cnIQGU4kNW`OI5%Ce}QTa z;E|7-#LLt>43e_4QdK~&IL9ZeOem6Cl#&p&!Z-7o8Ivxr6@GYv*DXQzxtL;WyzP;? z&D8NC?hWvxMf+I>vM}O9S>mru?cXp8d!q?OX58{)9GaYCXp6%P7J?x&jmX8*68DlV zLdo=CE>^R}$9`$=2kl_cEj~)=3kKbKuxj3Yv1FE)jH|^TRd88V-CPSl zO}HIM*pR;ub_?MQv?^`9Qv@AK`)vA5uTQ&i>_1o&iiJWkW~HvOS9VJ)wYIir_jmmh z&#LD_=i_xaB4B1y0q zn*mEePA7~%EQkYz0mKI5ehAqd{#)~ zapW_?J5s?y6zbzSA08!+g_j!7Cx!gQ_mY!HUvw2cV0$YB|5YgnvzvaX^Wyyx|H!b6 zib7VdP-~s5rMyAcj*QE^fi@ITizw+*cn9FC*2G=mSL9way`H;F zzq43tf|R?~(ik@Hc+?)=!L^xqSYi9xFncT4^5p0SU{17O5m6JuP!fw(;@Dfg7PETo zxrJ3a@=h3{)ZH)&8MDmWC z*Uj8T*NOBr8Clyn)63M{Cxw6EZFgUAK39du&ROE2lkwK+cVc~&+}Rr&?+FB ze3#w-ozV%;vDk2iW#PHSlIgkrd8Uev^@2~J?*caC;jD37c0%VHiUf%Js`-88IsIfQ zou3s(3L{bke_wfl_Tty}tw0I?MnpN10HeGwbu>HSVR=DgaNRq70}!6N^d$uCuUJkd zBAxL)XJq~G-DC$M8q?`9O*G?E_8wpc-|^{fjVtDfCXJkmFjf8A+k(I~^S-_!dSVBA zwJHwDwv`%A3?m3r+nLzc2i&~zxA)p8SUi1RGLo-fI%2-PTR_$xXJv=pi8trNoR7ds zOq7$y`U39Rrw4mm=d9e%Cg5Vo<1AN1&69gskSzMXd*2o16V>+@nodSN zjc127pH4jXkJ&IYBiGJf`^BZ1I6AtbPpY%}%&-ML<%q)xR*?6ChD!>;I7kmqcGzTh zE?Y>zX(+!eh*qMxN~*i&XWk>?z*+5{tm5Q6tPPs;GP!krG!N9v>dOZx_^~R2=_jnX z(*4baW!qP|cpq|6BXxhO=>ttz%@a9ontPvrx3+Ri7-@e&~pB+6yJQJvX-mc)VZ<@{O6F zc2XFw$ZKz?h@X@?7}4cW+_qE{d~Qwflz-0SZLtHbSuz`i*nz^=nI7|qor~y&j3T1V z{*AR9+M)sn8qS@gi&&6Y*W0OMy)n+o37JAWl|LSjH(l%aTUC|c*pu!;@wR^P@ULggnhQ%veei zRPm@>7elZI!2qX?<<--F`pH^ zF(cuU9;Y9yr$sMS2o24&?D_h+AjJBw6p|b>Zdo&KGnJ2DPEz0So8vi!UaTwIGIJ}O zQyU@l^8T5pG&Ygh?n7rEin1O)IioqP-?|!kZ%QB@Db*${W0!L?$j1pVEA=@UT@Rd8 zZ)Sl}K?o6Sp)oSE8Q*{E%W^A8=lCSEZ0^#r}r-WbaC{-q<*_)$cWAZL?HFfkdBiqWq-|Z8d zP(2sWdMd<6NB0)jGSevEq}UYK;IsO~6#d%r^H-ivP+$lj!w{N|*tq&7<(o__*H=ci zW}VteJ+;-O@$O0s9_R@ANMwh; zzr^kg4bMA=){;pto)>jZi3Q7mR1yN}Lx@x}GthfFhe z?qMgCY)Jz(lZhEwnV9kEK*~H+&>8$xtpCPiA=|Qw z{5%s<8+8m4Dzczj8a8jp@1S45*)T)}AF7?=+>jxti@zQEK z8wfZ>tfnp|({?}1b%@pXJLq9;eL`OOQrIM^X4&BIPR>O=1|JIVUgJl3gBTgys|=aP zcqYLXJnE9ty^(Nlo~0+hmTcMcSX*)mp=2w$N?qN+eR&pl0oM($Rd%)IQWJaD(EQD< ze(tEF)y&LnX|#N7#G%f`a6nYWhrhkpjRyCqu7s2RgA=kvP+VnSri+Sf|la|VY!p1R_Upbj5hG!cgi*^G-8Bb;FvNtsliJ!wo}De>_R6BYryU*q5_p_CLo zJ*D3)yCOP^KYXI~&|gT%W%!{7!``x2Am`}I?I-j45o#}tUWsBVtO~&IQ#uYDRwID@Cx>!orxK3k7uvMEXm~hWZTd=1?&%a zHb-y_hJ_nUFkT2x=&3y)d+^{eqbUtcx1`E3@em@zrdc4EWbcy(;E zq;F|M5zD1$C>v)w9&5wF-4}rlfi;zpqiho&RKm3|w*iYfD6zBC8{C$u*YA|rZKj?C zR<={v=8^a*&{RMz<-jDJwdx1cv?k-RFHGR&)gcp(WW2UuK=N_($$~rxQ!acg)A89Y zgDC9W0JD=8`Qa{J>lu%y)}9omio@{X$i8Ep5t6K_VoYFk9^3L%f%ZDy6IqdGbY+O; ztnT->Qeli7X+qzk30Jl)ZqZ$=n5AMic6bM%l`dEFwu$i)+KiYD=H#3gC^tCfoqY|R z5ZZmv6S>eLKx}6eyMx{PtOKfw_{_4#1Eq)1ZVb69cX|I(v_3*YS$5)XR+8pocSVSb zrYMJaN$kjDTHCh~P|z!LHkz;K<~6DVnM%3~G2HU)q6t@RR;SK~-+lU^sfB5DfMNn$ zF3sjH(O#QqQ&E^i`&>6(NbJQ^{0+QiB6d}dwti^u2(=*OZuX?TnGLZt3prV1y0i*E zPMtE1QcCsf_3jv?TqZwk(y~RXeOEG!`IrIec%{h0VFDBT{xAKPT$#?66B6zZ`&C|BggwU^OYC(RG40#R=)sH?y4k23sI_oJqXMc)`zbCC>;d?d^y zI#3Oxy>0O5-8t%Gg2(Ug8s`VNvFWh~-;X`q@R`A)FO07k{30#jszVXmyu!=M>U&+Tp$&@rK`p3B1_Kp$AOHh z>)cua_DNij`sg$Ji?+(@>e>j~;X;| z16t995C&Rh?C4NMOUvatqwyc0cvbeLg1~TJv7099d$v+8cY5&#N?F$7dyK zf;+emQlb)6M9EY{kC6}-At8712cDQvXtLO30ML&Ff2#lo{j{vP*tmb=(Cl2@)u1_c{^QGz z7G@3s>Q9c52UWlgaQ7&Wc~ey#_Y0W%h)Q%#`i%3a)MZ$Temq4PdakeL){~6^U22GItp}G5eCp{v0=UPss3(s0}H6 zzllJqVK@E`H}^K8Cp6ffy?&-9aB-L7IxzZ^OR|yhy=;6V&Z1NgzK(F`dp%1ALb&f- z3^}2{*(!ap+YI~It;^1o^SOFs_O;8%hb{+=@N>V%L79GCy4gG&h&HZPUNUh8G%gd% zBrWNbLP>Qk^0D^)#0g8tEe9TU8eNk%e(yD&kXw>y2?x=~8CS)DbjlPQ~XTiT+umZm%`Yd`uf%lkJ2jcrp8d3+X`5PfH?8__u zKKas!KDlymi-M$;&%z@Tegp{hV|W7-8yydnHzcrMrym>OC2nMy8OwtuRG-|zYyRjtm!$}|SLL!Gk z+%F^sx5_o>k$J=`CCnu3zha1T%3Oj7F|rfAy3gKn%%M0PzIs1+hp4C)bC}HsA=Lf z5mgKV@6v0s(iXSK^S(lQtt118-q0k6!RFc^8m*-AcoL4uah;Q(_-mKk4GpV*{`Mj?)@}?dCkxJ8HFGLu z0`G|K2}7w-=PX&nxh02ZZc8@KEkm(v7ilq3$iy>GW8)#xxnwju^Q1akmjL@Q6?RZ(`$ zy`IX*qvFvd>xU1pHyqL*wxWF$K9b4qLt-d1%7G5~@U(5Y{R_Wb6fJTR_2)0%8y}<#wc{)qMfOQb(-(@`FG|VV#aph^5mYur?#P1``u1jlBPJ7p zQv$3T08`|WoF4}yjJ*}R0UFmDPIJGeg}$sA=<&Y>X=L6E*U#F1{D!oDs|R6qGAG^f zHnWPpb^xxX@RzOU06-|lm!}%Yw==iwUm5OsiVmi%C8xDCOZwg799;N24an!d4Mr&w z>jdXPA`dJ(n~7o|CXeEvRfcv2%4zj#AC5ijrWY5nBkW{f+SdK31VOGSZp3F)?7*yW zhilh7&>dO4(0KRq?RZyi|MPY{)n|~^N#EB3^v@R%sWHp4zk*13yxo-El3tPaRm6(a zfko#;W^E-LmYu;H9NnG>D+&D8_}}o#e{XKTe{HAdKmHYe#)p_RF?pq8?QA;rHSHm#1&WzcPeRv+6Xfwuqktc$V Yz{!-m6eBn2%Kqj)s^8i_@% literal 0 HcmV?d00001 diff --git a/docs/images/lib2-bspline_curve-2.JPG b/docs/images/lib2-bspline_curve-2.JPG new file mode 100644 index 0000000000000000000000000000000000000000..005aa984de032917540effa50c08779289e440ef GIT binary patch literal 28268 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 Z6_kLZsFA*ZuiN8)^OS)4U=|;M{{tM52_r9y= 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 literal 0 HcmV?d00001 diff --git a/docs/lib2-bspline_curve.md b/docs/lib2-bspline_curve.md new file mode 100644 index 00000000..737e1529 --- /dev/null +++ b/docs/lib2-bspline_curve.md @@ -0,0 +1,84 @@ +# bspline_curve + +[B-spline](https://en.wikipedia.org/wiki/B-spline) interpolation using [de Boor's algorithm](https://en.wikipedia.org/wiki/De_Boor%27s_algorithm). This function returns points of the B-spline path. Combined with the `polyline`, `polyline3d` or `hull_polyline3d` module, you can create a B-spline curve. + +## Parameters + +- `t_step` : The increment amount along the curve in the [0, 1] range. +- `degree` : The degree of B-spline. Must be less than or equal to `len(points) - 1`. +- `points` : A list of `[x, y]` or `[x, y, z]` control points. +- `knots` : The knot vector. It's a non-decreasing sequence with length `len(points) + degree + 1`. If not provided, a uniform knot vector is generated automatically. +- `weights` : The weights of control points. If not provided, the weight of each point is 1. + +## Examples + + include ; + + points = [ + [-10, 0], + [-5, 5], + [ 5, -5], + [ 10, 0] + ]; + + color("red") for(p = points) { + translate(p) + sphere(0.5); + } + + // knots: [0, 1, 2, 3, 4, 5, 6] + // weights: [1, 1, 1, 1] + for(p = bspline_curve(0.01, 2, points)) { + translate(p) + sphere(0.1); + } + +![bspline_curve](images/lib2-bspline_curve-1.JPG) + + include ; + + points = [ + [-10, 0], + [-5, 5], + [ 5, -5], + [ 10, 0] + ]; + + // a non-uniform B-spline curve + knots = [0, 1/8, 1/4, 1/2, 3/4, 4/5, 1]; + + color("red") for(p = points) { + translate(p) + sphere(0.5); + } + + for(p = bspline_curve(0.01, 2, points, knots)) { + translate(p) + sphere(0.1); + } + +![bspline_curve](images/lib2-bspline_curve-2.JPG) + + include ; + + points = [ + [-10, 0], + [-5, 5], + [ 5, -5], + [ 10, 0] + ]; + + // For a clamped B-spline curve, the first knot and the last knot must be of multiplicity degree + 1. + knots = [0, 0, 0, 1, 2, 2, 2]; + + color("red") for(p = points) { + translate(p) + sphere(0.5); + } + + for(p = bspline_curve(0.01, 2, points, knots)) { + translate(p) + sphere(0.1); + } + +![bspline_curve](images/lib2-bspline_curve-3.JPG)