From f5d3b90992d990b43e2c74f9a5a06b5c5d46e13d Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Wed, 22 Mar 2017 10:47:09 +0800 Subject: [PATCH] added bezier --- README.md | 2 ++ docs/images/lib-bezier-1.JPG | Bin 0 -> 20866 bytes docs/lib-bezier.md | 28 +++++++++++++++++++++ src/bezier.scad | 46 +++++++++++++++++++++++++++++++++++ 4 files changed, 76 insertions(+) create mode 100644 docs/images/lib-bezier-1.JPG create mode 100644 docs/lib-bezier.md create mode 100644 src/bezier.scad diff --git a/README.md b/README.md index f47d115b..91958ecc 100644 --- a/README.md +++ b/README.md @@ -23,3 +23,5 @@ I've been using OpenSCAD for years and created some funny things. Some of them i - [hollow_out](https://openhome.cc/eGossip/OpenSCAD/lib-hollow_out.html) - [bend](https://openhome.cc/eGossip/OpenSCAD/lib-bend.html) +- Math + - [bezier](https://openhome.cc/eGossip/OpenSCAD/lib-bezier.html) diff --git a/docs/images/lib-bezier-1.JPG b/docs/images/lib-bezier-1.JPG new file mode 100644 index 0000000000000000000000000000000000000000..a2a136d04c4652c861963bf67b7742da71ed7b5d GIT binary patch literal 20866 zcmb@u2V7HI);1omyiwFTi?;r^LbKm!yxz78|+?jX2|M~qOJEtT&d+oK?TF>*GbI^Y<1bPNK ze)Qah*PO^5iL=^FN;9y2QiJcZuf`uYmB?%K}2;LcEv2GGOs* z5|UDq{6EXykcG%!g-AjU9Y1m6)X7s9PM^L25xgV_`Co4b??7B9e&G8d`!EO$I>dG8 z2d+a0A3!yrLx0^s|7YWL^YHN>4xQla2OZ}8{k|Rg;qZ~8$9@DII(+!>p(96696NUO z?K|d}ge$((5q*ZiUVbK-1HSXPgbsM~U zOiAZBui`C~(bMO3%f(!W{_7KtA3b*D_c&Kek1BB|DBVyF&-$(JF|}U+@@pm8%S|?gP{63B_%BN8Qf9a z>M^f?8D%2reo=*T7R|PoOv)>e74`VbPz;HNTP!CI5SdDmX6qh)~Rw$;(# zs5zmt?+t=V823hhHJzMBsZamqV}S=ho2#W<*DERU4x-J4@o*%^I-hQY>@(CMrND3I z$0&{iyyq|!86LT+27NCU!JtRL**J-MD?> z$L%K*`R*=zj&_YoF#ZpILjqzkJjNoT$s4acg)UAX+fSq$V2TyH&PAH0AV&a8DWAcw zW3ADYoJb?Ze!E3O1-TlH^8cN2Im61mp(LQ!1L&Z6XiBG=M+*{*`nNh!x)g@z*T+Vx zP1F`Lg5L4(GZr;vIHK)R8H$a*atfX|Q!nHBg$7~ux zp(b)P z2K4hEOtgP+=!d|pwj5DPTo#jJvr%Blq`7k$7;pplU@@&T3Hn?-UCQAs9)L$>PdVp_ z@>aEMjR?$%nQPpI@zeJcvoWxMX?z$EEJrnXE;3HtbJ5we>a`4S{2Fk%+okuSB+=cS z3+?Iq72lOcd%jMTCxa=Bw;y|}+v=37LUKpERAgW!wY}1|+aH7CyAD10qrOj-o8~z8 z$Ro_3u;+5c8x2WWSDFQub8_PtJiMn8c0Yai%A=#RezteT)~mQQuFy6#d_Ur)e$0IV zWVn+xkP{M;GfeLKA+&m@ePk>p&TrmgSHf8QNS^wN26Ty7#29@r{UIbL!Bc3YjaI2g zrPgQ}JSjI-R+mX!5;C>kt8bbTH5D_6j&LtnoVd0S-4+qq|D|-?HIx3Z+1OlG`_jrH zHJJsdJDT*s(Xe(D2FeArb+@A93&>UK?~bAWZ0CV1SG+q{sc zTvKLi0zXXk*XRd*IMinBnpxIZQ{-8{FS!NA)rhfL&F&xDuRk3$m+jfR{Y_1zO~wD5 z>2~EsRhH>4qZH{}v3>7tQ+`ixiuw_ru&aXK;p4W~Z zZ}9hdH|&NftLEH8J&k3CzRYN%YLiSog=b));w)3KF*5iEWyag`Y!6j;XRg z1b6O8mm!N_vfRzaiq#h!i*BDk|HVue)?)wJqzhsA3Eq{K6`ZI#RC=FZPVL*()L*cl zU505gmNb0SSTryQzS()+_0S^hAI#K$vP-byihhXK(*9v=BV zFnJt#+n3u{c;voA1!h(f5K=uWhK_S*v&l|w#Wyby${i7$@I>7rX8gXY-y_`lK2iAl zFTE6hO8UN#JJHj$S|z&noJY;LZi?FMRZj`)!I>>QqeJU0g%F{xM{Qeux_f`UH#TQz zp@!UvYAH{*Po&(=ypjAG7;GX@UJo%^OBko_Seb6bkr;iNclA88Z5wnK%1~3MYPifl z{)CNI&aI5gG96tuBPGVosZu^JX_msAJq)nYM-1&9r-RO-!4TM^G3>6-gZ?d_L-mR~ znp7dJecIc$3$J`O3H4Uhg$&-2&?o}ROvYlHDaZ^R$Pk;TGAXIfFS*!QGkz7Z+O)@> z6N{b`i-9#I;igp=-y<=yCn9t&EBf^oGnb-h(Qx9%kFvK|*I8@hKKfj4pMA5#>bSDTdi=BH<#w&p4OKZqYZ2*oyv)W?zoJx; z$#T>?MHg~42IgtPPHyt@%GwebPprs$2*k9ZuTZ=GXiGP&7)USx8hH? z;}W)o1M{43d@I=wFfF1xHXu%WmYYK?S^+_({J6#9m!<=d%qF**;}^!NV*XgVX?5Kr zR&B2WNs2a8<{`GpFc^16w(+<%9`Ba8miq+Ee%O6qPk3SIa>S+7AYpq(pSA5^Sxx?G zpAk6s^Sk1iR&iqf{5qC|ZCb3>79Fdjkh3pgvNsTCKc6>Dlt}lGdqu*7jy?GM8SzK& zehAFg7}`bA;}WP+#8;}e{=Ll=PX3V=-=cm&JdR$3qtG>q%I}lu6jDGudhh^*rO#DZ}Z}RfEE;`<|S6KLprv9HT7GeO4mVDZ2K;g^+SQfN;&p-HJ8( z^FNPo->MfP71cCFAB{P*n_W@6B0d2iOsY{q`KX{H&iaeIry2h7^L5)kBDbq&eUrj# z^L3UtxG3|OY!YmG_v^N>^VKJV#Yzryz{pP7P$6LPV^NRN(`I8W@e0b*(`_n*lt=c~ z=BM8>bkm~|{T9e@ZyAG_Pw1{zPfC?xji;e|T+GuKB`w>JLq+116c{ZH8XGo#ChfBd z3J_~$(=qAD-JHb>3QsCx<%S1DcMYW2$U?pzVrU%$FQ(_Rk3A+e*^BIg+cMZ# zQ%cQQza{o@19ruLgUnh_ck9KGj+jWJ`|a1Oy`bP-)mq`Ds3Z9krp=z2_V&b=oh>8t zGg_4trc2VRLCgV2Z1*vNip@ZYA{sppIJI(bZ79*`0E8|62BP}9ao!Qk(@Z1_N4WJ53qh$e89j$HyX=(WC#F>|U7Q(OA zv#jXrpRRtq+aYCCT(xP75Rb9d7kmivJq!BB_W4IP``f<5!ND7j6#&p}>WuOrUNB%Y z;Reb!0m?=@S3$Vfjzy0#B7q;Ha0t{d>As0N3?($Fx2C=v^mww z?o6g?BAM7;RqW3rHy@)YeiRI&B$LMxer4C$4S}J^kY0Vl8YuM3t-l8-N1h(@i=WeYvzJOgT*$l}jna`ySp^X{BeYl9QD6uuO zuLT3o;1E6UfE2*Py*#1auQo88TFu3eWz6JAV0)U6o>g&$f0NoR?5Gc9PR@Wf$zaiI zxD~tE)3tBr0iKa_-HM({z5%;RYfY0j2j3nK9zP+sZ}|Z64-)Pl6H|?ADYH6KL!#5U z561%huQOK-=&+6#_5K^q`3tH#0W<@|eB15yRHn;Dpyc$H_au8y8XXV^%N#j+4DDWJ z+rOfb-Po#jvLo`k_oF;>FY3(oG1v?9N?+fNsyrne6`{MIRB@qj7tg4&7X)ABvs^Y< z+Oef|!tFAgF8oMOzA`m6u;buJ>#) zN13?!KD9GC!O4k~3hm0kH&rH?NkVqrI)a6@CqjlbmBpOA4?uPi!&Q~ICGv#a6mxF);FFv??9^4GPpuh6q+-B_9zpDS){#7-80Ybvb)TlCx{;5yB z@KU3@B6?ROBh|M@2eP1sX*PWLqB~0ZxWR2|^=dbuw(BgcJtXOp&M%DUsJTqs)|zRjAOx z*2qMN3rambu_ak57okCyr%=ibpk^sQU;6X^YBK!wolL}d*nyk{u z2W*psMFz(8Eg2>kUJJuP5h8I}BT!wQ*g{m7p5XeLoEYH|Dbgka)xz%}dS$<1zc>E0+Wg%>duI$5-UUJ@zsHMWD?6vK#NF{0MQ2slOt=D85` zV7Ah->!OL@u!WGHdRs7>vPR5KY3hZ-bTgI!GnpPZ%IU(NlfDLI=kCT=jNQ@O<6%)X zM-3eE{9oG)p`W|!`}y;D~Zb;E3!kI1-IT!OsqhG+jhl+ zBpK>We-Bqr2kf=o4-pjFaLX~-;bMr-)qxeuNfIViH&OvEU>%xo%@<71H?ZY?$94YW zkBxc;f9bxa7M z@6#|FWzG|4th-P3NxrHIU#DY|q-S$`VtG&O;x83x-Box@31z4cZwrTta>tFE_55aW zYt;xn*K-1Gy{E+!vnEgjVz$bP?rDvN_TCB#V2ZQfa87TT3Zsc+!>9D?=0=y$jq@LO zD3xXLvz4huGTvTB4@w#3MtOP(g8Aqh9+#uDrIAC@OL3DklNEi{5SsjbQc^a%kPr@6 zf6w0wjhIk=M3`rovHGrkKj43zzW?%ds@wq3yD!#rGo{q-vEOY#)IBtII0BgP93JOE z@VFAD$kbQdtbA$N?p|s=akO`q0*$+JV@I>&hvqX_eSGzT5g9@eb*17i{CTQun1ejX z^$t=cILJeXJ~`2dgFH~eUO)lfQ?GYFv47@3Q2!)f(}Z%%R-j9|;Wq1SM~HN&oX< zhMt|TV@m1dBx|mGW5JPTNun!rXw^8z&L)tMyBGA*>j z<>~Y}3{4}cu*2g`KEwY_&BH#m1-Gz#9?Zw~BuP8#NB#C%U@Or_AK;E$&1EObSNaY> zdNZ{TCSLJQ$ce>&Db zi9aMMxqkv~W{Ze`FW=`bW{0`#yn6T~RJFFpSPE4b)Fn1g3%Dx0+O}9+lceIco>IB_ z+;(3`Pneupko7cnB7jfLgaf zDB^2ZcfY;$dl{6W+}LI!F}57zFT2-E54YR>$;)st3Aw|BJVe zJ#qSTZVB~PX`ldH6&gUP7LY}!qGLganfMoHds`iAx=ItjV$&JOLbj+?-Y>;+Gs^Id_t)B-ZRY_TTMP5M*T!!~@-z1Y6=aQflj;ke(XtO!4rm$i6o2yl5QotNnqf9FcGFocv zj3Yn)KCb`LDgN$+59LorRPnT!nyha9*6`OOZdo6B{K1N$6GLDxq{}(ovdYipuo{E0 zCxOqI9s&Wu$Pu~Y8lR`sgX27)hjn(PQ`{t+F5L9BQeHz;A=GLyVQ`-!*28&h6_dnCJMQn=@q!K%P2BtnO z14whIJCqqvYG+}*)2PK+3Hl`zsL{7Z%J@*~a0^5}TqASxf>9eXTUk$)`f1Bon=qJ| zGk}yTkw(x74h+Hp7dPesJHd28ej=9oX_Kr&>`uwNk<&zx3qjQsk4ii^DZTfz7W75(R{tF!j zL%Z)yanNDK3QF#Xi{KSlHCOJ!e$hy7fW(s8={7O*Z{E-tWT{%54;-H$a|`8iDw6z? zJLuZt=2D&shJ0&pma1M|bH)ByD_35MIq7;+atMJyYgnjKG_4md&U8*GQPc9X?ozJ8 z-P_Jg�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