From 4a691312b5d232fdbfebde5b35ab6c5ebea8ec72 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Mon, 25 May 2020 13:43:44 +0800 Subject: [PATCH] add doc --- docs/images/lib2x-footprints2-1.JPG | Bin 0 -> 30307 bytes docs/lib2x-footprints2.md | 4 +- docs/lib2x-footprints3.md | 55 +++++++++++++++++++++++++++ src/turtle/footprints3.scad | 57 +++++----------------------- 4 files changed, 67 insertions(+), 49 deletions(-) create mode 100644 docs/images/lib2x-footprints2-1.JPG create mode 100644 docs/lib2x-footprints3.md diff --git a/docs/images/lib2x-footprints2-1.JPG b/docs/images/lib2x-footprints2-1.JPG new file mode 100644 index 0000000000000000000000000000000000000000..5315ff4c7ac77db131a595bd233b73e1f51b7249 GIT binary patch literal 30307 zcmeFZ1yo#Hwk}*a!96$xia>A)?n!V9?rtdv?rwqLQUrI0V8PuTf@^ShcjvF1?moBg z>At7!zBk4{-r0;rt-bfEwfCIMzWL3$>S^X_8Gs=vDj^Dhf`S4#L;e6yD;Ucn&L9&2 zKt={Y3jhER0kBZK0BA@K0dgYw83cfZ0xhX(%8z#kg;Lj(UWYCzJ#&K_h5ksK}(<`*P^13?Vwk+8q!E5T8} z(8_|z zS>Kw8g^`&Fz$fTzt#4>Pr@#lAOa&lsHVq>(jHDzMq=H_N%W@Tb!Wq_1muye7r*LP;Hw4?lU1@DaQ3~fQy z_8==u@}Cvz8(2Bm^HVrDfQ)!d^i9|ejEvYB4D{KI7+6@0^cnPx*jN~h*w~CX*;%+) zO;`*l{``0&!(X3n?O^-ymuDLpG8um~wlKD|w}WVdg^7acPcQwy^-PG0etqcQRX;>V zNEx2Dw#NGQ#_u3W;Af*UFtanTvMc?ip&41ZIr*4=Q;v`6r!xNPMgMo-{GZa60H2W| zkKxaEx3c}y;}wl<{tp9prnz zc2UST$^S1Le>~)0Qt}__`a@m+k_P^z!hiIxKh*UvY2aTf{73Kl|Cze}3+5VILa?n9 z1jIhg0p0=-;NallU=iTq;1LlJ5RovEAs7P*7aaoy6Can503R3sIT0!K3nCIKlIQpo zj1*KfujuIM2+5h)m}pt4Y3XQxRsw~9h=}wI2?rS&hn5(hnD$>jo>~Ezh)~(kx-d`_ z0BB4o7)+?AP5>Fi@dyWTRsQr={`r7{hJl5HM?idrgbXQAg#mzuf`NgCg@J>Eh4?9< zJRtW0u$XXIFIa@(vE}sKcYd#wMm8KxTIK4vtRFF0Ou``~yA*1_gtozr@7G z#U~_YW@YE(=H(ZBEw8Aos;;T6t8eesG8D@1zwvNO7mSM$rtFXqU%-d|{#T-4_%g zB@rOXr!dM;j>(0MLvp;=_pQ^J!LI=FA~^q7(rk3rMQhC zA%dd-$PA|Woz#26SSS#a#Rl3Vu1^^+F8-tdt-R%l^9`0oWMj#S;K9_-hVHkof_!%9(xTFjP5t+aK2m~jmm3|cM+eBU z7G<{*fO@PFR2wnvU>xylE{Z};XI+hNRYCji>dw=1P_=g-DORU84OoD=tnZ@yCd6>^ zgN54Htj%BwGV5BdB}*z7`IIxYKvAXW`I^0qMH3f&4$$x3*D(O2C>W;(3_%um=J8An z26dH*+y|S&K!wf~un6UgFX4#f>zLxtK4b<9;mC^s{!b=5FXIz|pt}L{qiYF<`aZbR zE-QO}XR35BwYaDW|*78*68i&6^&a9c+ z>Q#9m1#rcJ_dt;J0PI3^6^TTX>HRlpaPoZbZi(uA&}>aQmZX#7El!!Nb8C#Y6fXXD z_$OaaJ!{bz9H_x3fYt7;T;D1K(&~rtBQu^i51B7XpqOE{3bF4I!Tu<0FQ5YF#xLkd zG`e{gXipb!$Fy#o@WzUwnx7${Wc&Fd-Ue5wC4T-?Ik30GjwsTdlHcchRquWP3ug7k z%t3M-tbsA>FG)8tg!Mg#v8-!Cex$w~zfOJv^klYQYG|b9GO@7^N42Sk+Th%E7=2id zVEJOQ%j*0^SMyp{bI$G4q<+%l%gg<#tJvyoT)X-LV)zGh-faZXikry<8f^1OxTb?;;#AU`k^hv}>@x>X4s%qz0pb&{>F zhV*CElxu}njIQT#9*u#cb5-i2=lQR-S?G%sB>*l|V0CdOdN8j9Wic5F3ex_5X>%2R;LTD0q z7lEUF7%(h3VaOs*H8a>WO=^1(@|EC79eXHm&k%W99e zN;EOhP0HnN*7__f&pPs=4ZckV#cTj2v}nUy98z*1&CY_vgSQ z|C`SC_d4Kza_u*hqN;?}l8@lJcKs9J+fd;XAP+g%1F%E$JJSR%?%;Pk$MX4wL1Mh) z46wSfbpfFd_`4hcz$#H-o;1<2nt4L3@y_dHBS!}A;O;`*n82AF*5245++-aC_AN?z zGBfZvrSf!k-aIjs^{qz{S8^9CuGNxMqZ!cL}QqIk431a}>ol@1`JhmV|`P)l=>hYEt17@a`UI%R;Cra=c5JK)^%@tO zi68|)z)`1UI`&IhsBNf+&&4}rr;O%09^Y=7JBp6#c7`Tu7dCTOWi{k@Ek!4x98;Lk zcb@=r^|;Mh>n;M0E8cgb)n(cz&G6TAL{Z0_lyrKgxKUsC-kYE7XjlbY&}_+QFN!sl zB{NHjtGVol=M@-4Zm97j)Rf*vvb&S5(zTSZW!DmR}|ypW5UKTwW*jPL+lr%gquEIWKmjDYEg8s($M(hGAVFX8SLSQ+~hr=XU#UE zocM3TwSTC*R|LKVCghOe!cQ{;ms#)xFju=t5*Vo);vx3*5G1TFB6#}>7Bfzis4~;GD z@b}<&{a!64@#TKobu#AsTRsQaCIVZj;2by#snH*u9t4qJU9_UN|ku$>lDUW7qX zojQ>hS&vXc4Vr5`x^>v<383tZ`WRh$E%jcsxw3hzL^*}xOF)DTF-H$E^VU}|v&Y_! zE2UGr1Ec@fQ_fs8X*zY{Cviujiegu57Qb`-Qd6lgqpaO42zR$y9_PQ=O+fN(n% z*siwV;za$ZZ3+cE8Zkv}k3Nm|nZ`+_zDCVhnoHngq1#cVtyRl*j3q!sC|OmPpb`}( zhq{s|r8rUTh`@3dv`$K-CxGy^U+FeRAbG83p@Vh->I`GS2x>Nl5CmDRMR&Q%em+rrGcl0IN#;nrp#<8A00Vu0+SC}Yst7}hWePLZi&Uu>RR~Q^X z>cBulz_UrUa&G`qzZzH~@|@SztJ8weE&pRx1gG%COY5lFT@l4W18Y1^*zCNRp>B%? zZ!SJ%nw)TF1vL_*a1oU7&$O+lh?M!+sfZ=T>os*jF9Vcb0c~lF9VlTjoXNu{tBJTe z-;ZgO?%i&`J03~RKaBCCF(&tAMdUY6KBm48snNY8nDjbdvC+yV05PKZ@bauH%Fnc=1@&u3}GvITEN=V7Vr1h3g;3Ci= zIJvmk3V1yz)#*w<`cOSYS!lAp40k6^lE zys&Vx8cs@bHdzR@d2F!czNaMwrnB=*i})P!|YZlKZma9)lx ze&`*#%q-aU{`tiz?~6~#%?xODhsA5Q<#L3~y9BKiUj?cR@+EtRyz299y?8chN?G$T zroCVl?v`$ddJy0mc-~DH6SV46pdYaw3sNdP0Y1)n4SU_&w6xcm(a~&OS5`^fr`>!x zwqLR7ZJ3!M4PLZLw)lQQ#fjMoo8fS!#-&tWU?Q8v_}{ zsXg?^layndIXJ;>UsxlB31CSptM(4?xcrANrlBQzC#PK2xelVG; za^7d~nJGT|Mlj1;wljWzQAp@N{llXClS`;|%bMmR#u!|9G85INTMn!ddK8a0dJF6$ zY0TD!GiOjyY5DwYla6@OacAtY7z$lA*91lA761jw14ngR0$3D*53zFqtM_upS?!Cj zYB@PMA`Be|>!m{QFe{V6PS8kTDWhsmVlHjHR{36jY{)-o9X87 z+x{+MCXO1G6?x_uH}%^4&n0oyKglAKTPA&0<|9Qzhp)INdjgR2M%*Ep3Epb5I~)K0 zn&#Bzg;RPSNQ$Zg*Hi^QTvf4$0=_w8W5Hhzjpb@xzW^9Cdp64{;H($$?pE$i?1jJJ zsEd#p-JG~5%AVPozARtVP@BtX)Cf-^VmnYqLWxAFrS^YVN=Q}PCsrxWu4f9gd^uT^ z2d3+`u2|fOuBzOl{pydMxnlI8n}v9H&Q@3p3zZ+eTjO~kfx&ob+yP4ZL+X14=|~9x zS)(YL<2s6RlUT>CWr1}KCv&|vt&73#tW!;riNudh(f%%0yBe+`G*&q44qRPS`5I>_ zrysXnJGYLaCCMfYrF#Wb3$a;t_HlCNq{U9qA3rONn`)w}zsD|T4ZBNdwOV8bVZ8)C zZfzjVrNUSH(s}6Yk{FyRyB)k8N;o=ztLmg@Scw<_^9NNPgsB-nr`@%-tE-bqr5w8s z%9ytJ3><1-+!0#$R(7vbTldHRgaVN0(>H8$Z8~@Id{Jkv8Ddm75i>?NBUv*5vLfiY z@-{M_&n}p2ql9nvLru9Woy*Bnew0&w_+T@PTv~UXnjm5_XC6Bap!&{~tY1f#cD-7u z{ObZXpAnQ57{UJPrL82EUu7i3X0Q}eq>6bFlpW)n845Ndnw#0zTcW1-+(j!gPiSaL zynKI#+1jeSP1pOKP12dYzbeggF;9k=@2mNUWd`kna{#{z!Ar4#$zpv4A;gm1Q%s-a zvT(ljWW;Wk*zd2E8Kji_Wc(A~*30C?vP`zLH&ax(&eSJQk}O@6?RI147KK#F-YJ)l zt8&&LKPQ;$`)D_Wz_om)<#83vj@+uifj7E-g7+3Pm33()xKMv(K~pE|6f|CV5(h7&iBSsg9t(T$Aw3{oVK!9>--ItHeFs%L#-N*e3w(P~CNyLR4Q45VZM~T#C-b-@FemIB}XOg4HwNm92zcVyW zucIQbU;SHl=sE0Fw-|d=(c@5!-H*d@cM;f{S67s^RV-OXp&NcI#HQD>t~OJRTk6+u z*F3P@WHRKOFurt_t3?Ss*6J0+AqnmF^LSg!(!E-DcIkPydY|$H;QdmjC|7sRj(djg z@6aSAGGP=a)fhWpZX6@4e9}6f=NFo6WRrMl0kdkElK;_9P41f(F*+M}Py|e=@_K3` zfZOcY#zp2M?-l>X^+S&~-#gRh&lx{DiGV}3E*+};87^q ze1smD7nu81(MkH$^w}G&a)|w2L;iE-{!bDuUC`LPHTBWtu`1CiKPEUy2*49Wi1;4S&yrf?t+H zzLEe=*Z-C^_>41^C6l!YVQ1aBPN@B^Bnp1GR2!1*RA=|0A7606x#$V#vD$@>SCR!0 zK87)$9cs$gm<)6|Zp>9X)~yqxprson6W;dM%3F=PX&LW1YMOrKVl&8W0u0LZBQ+=M%bM3Vn5L9G9xA{0wC)mO3N3iQ0?K6VjR1@u! zxNi{4y&|FK0OrPF#o!c^Kabd8jdAIh*Z%H*h7!V(S`xC1w4L zt3*m>`r-&#OU}yB$;M#!J9w_Q4(SH4fsaA70mC(nUz*anZqu~g;KJYh1h}@V#xLCz zh$u*JsI3;PjfphnLWmg1ak2b-5-_W*)+lT;BCdumFku-1n+(q05W?T7P4$e~=5Z`A zF8onEmEb_~o#9@-+S(coaTg77`IN4$;B%)wmCMV<>6@$qNnG3-o)9YxI*b~5iwpa8 zhx1~*mTJ6Gp8k?RC|+6dVOd^PN)cBjyLlO|+M%(>7P39XXZo*d95VPf#uv3;53!^| zZ}E!d2#c8P);zv(VQ!|fY7{$;I4LEln@ajp^>KHMwzs&zeBk+Ekz~UuLGOxZYTo(n zBm-qf%_BujW26e!oN=A!8!)TK%pJOXvMGB@`Zb>+$DCL)KM?wBe(QT40Nw640@+~Y*SaAP`)s&4a0feXOn`K|-jKecd-@EHfD@kv z4G~B!O?=MX4d(hm}s0x$Vspg!)yMt>Q83zp>}eaxD%u*_(x3SXTPi6wwno^H80FGk0| zM(gOjESG_`p50AzVe~cpP7c6(!>#WP??N|MDOa-;~XH{{&c04MWbd1_`yR|%BDYAI zrm?viDMxJE+1j~NYi(=iiz*#H+FSA&B^$#7)j6KtSeitcy+(O{r%*;IEMaz3UQ@P4 zrR;k$0zps4p&(Cei&$tDSAm#`bJ*+s_F$T?7=I!5{*6y4MTLetl8|13n;XSluOTm_ z4T2CB6Cl`Dg5PYj!0mFb{e3hR3Uv#FY8051Y!MtRYtbnE(BjC$bjF{|&t!_~WJndG zAC&D?pY<|rh2ixs&!@!VDWvvmk=70Y!StTBaOa|dwwGD?!g;g$326wm2um>O1k_J} zVjX`&W3)6w+~RK(T;1?%V3$7X6ZRiqy`~&FbM{P#9*aHK=#_Pp`$Hhk4Udcs|KHdM zaCV-M)jP^@@3DiY^f8%{F1y64HSLsf!E44;`3W%Y-zDH}|K+D&q~ip^kB@(~__NN~ zO1<+*wbqwNsAR^A7uENj2ScoO!Sk76-OfxwUZ#69B%8;%>2dG<87|Go%eDORm906- zsQKSO^-xFaXnW-C>EKN9CCyl#H(Xa#u6NJ$DfD-IO=g~dhLCE$U+;U`KP_MBru}A? zsL+L_nP3eq%r7d2k5ov|-;kCC%mA4!2eDT#^DKZid$A{r?OZN~x{NxSrDU&Kd%NMC zH=7WoPqqRs#IHoYw!s`Ij4p73TT_=fU@(_JlxH}pl-F=sIwG$Z2^*4RYWcFUSz^(i z6WMw?4CuvDl?{^sPJT2(tu|=uC`E|YHdoiwyXo5*63G!Ydb#`7-3Y&M0R*Tj2B^Sv zb{bWhnd1)Z)XY1)#fDfv$+sKvpV(76IT`1fzN~m(0hL>jwiyZ*NZ!5=@hAr?aYCyO z=Q$8R^4ay47`A$%P8`O+%mLZy!@Bp5cgjbU2N0)u`kf-oWcV{IhvTb$w8kfUnmfg)hz_4Jo|!Hx2o-VQnATkCjV9=$#m6*zr{{v@qL990k8V zrl0cqO~@tcWW>4{))A|k>9bN?MH@UDtxoQ z)A|BF@jdvwZ+q#%>$oJmHrp{=#GcET+;7{wLQI`f^=*tEqCjS|A9*MDXw36V$8)dg zRhzXJpjV7p`I*7DZ$JGWpcsrDQ22Z&Ktgf5NF?P>)xOw9HBmu63s9H-`c{v)0s$B) z_cnoI5=+L!g8jgXBK9>FeW~T5bU_atO}{BHEcESt_Q6~LXMQe}h>^(3_3I`=b21bc zS7uYJ_Of?`_(^^~&yn)yJdI@%=GSo@mlOu_wLwpSAIFR8^E#E+;j5?p7!>}G?+LOP zjgY=O&l1!0+2Y`(qtepSl<1{OWCeU!cXPu0p1&MF_raowm!v2Up#o+x=Wm&J^~A~T znkr`M+ddzXTAe3An%q#O_7vBT`4uHBx%3jz)14#6L{t1>D7%!bu}0}Ff(uvTD9`g2 z#ylOuIKIQncepy2Tl>}B($GKJ{pKfwGeBnU!lexP2Gu9N-v>hdNyKlH(R;W`gE~fI z%z`m@U8BLFmV--hJ65n*yPUM`65TUb4nHPpbhb!5`1cBOGwE%Jy9s80G|^8p%bnm(KOt9v>$^Uz5KEt&P$c;%fowN&M}{dHrK6qf=b<-Dc=g}*#l zf(u|PYmVJPcEXp?sLr|2{CQwJYq#vj5j_~?lu*B16ki8ce4w7SCp-73i_(a&%&JPmqtlBn|+(sI#P&fJA1cvuR4%pLK5v%N|dRaMQA*#bp^RcSdecny7S z4eBJf8wDW-KE%o?$-6;1Ehng5O?Jz*H<;X+pM>}h4&{Kq_o9EfSNxD-_)zeWcggEj zb0cVar~9SZDyG3Hu7zN(A=#8*Gr!Zpf>Jc06eX3sHmKE~fjs{j0?}-pL>B&4L zv~z@Bcr(eXW1449izYq+I*)tOsVV|D!H2s{z;mK8nI-G8_Bh0zdPWFMn&hJSQYDpvS{5e0MBdGhVD~^*c-$QMx`{zYgkp0U zAr5%5U3=i|ay4j|N>~=HIxVoogK1^ygjPE*uw`H--xO&RuFsb-P^`%ry%?gY{^*7-Gf-Bh3(l__iU*|y|x$xppt{jc*kzP2#Q@xj+^k0S9 z=rw*{^}M4xrIDIWyN6g6L1p55S=S4Dl{@zvq|R4*=x>CE(|6?3Nn~*36`+2KrL`2~ zwd&-7;E%mo(-a`VZqTGM49C|Px)0Jifc5zz(O+Kf%W;AFW?Hfge0r-(i+}tKNj)A6 zfvm6)A*r<$D7a3ZcG2s_rcGk2k=!Sc^ExWILMz>(O+){BO}%`3U$A0roEhg}bpbWm1_W9mSvw8@U9`A8ipXi+eG7*5IAv=hDU8dp1S;juRBv5qqD6JG_hvP( zMp=P!b}{Dz*CV?dRPA#Dhv9;_>1|T;lBfGuCOPHZ#Ee|ATbSw{Tvd|rqVvSepDonH zx&yQ$6d&E7RLyd7b1YmsdRf zUvR3blTuBZj#Zji@EgV{);m;v3l@@WJZg^x1kf}#9IT6mFXTgiSvrxwE-OaA_p2nx z1nW;|>EJMyeG}}!;#2VRi*xQZW?|;1lK;oCOUM&5aQ{R|2U305@DF;UC~@>qMmf7j zyK7Y{jl_ec6npZwry|n`g8#@OOeO|Hh#U!`7L0O1rysvBCN1ZNAmSw3?fhz4#EP z8mK#40ONdPBHX$+`VDINRAQrWdvE8y_8p71=A8EYVerU2YX8{235>}GlXp>`M+({3D+VWV4wlR1&(`ehNcR34n42R9QtN4MQ&PwY3&u|%BDDHwge zc1?zE{6@x1z}*c>MDHZ=68a?(JxNn}2Iv=PP34 zEsHLFd#gIOax&vC`7lv(=WrKJFqSL;l!7cz`jLNav;LN1`XA$PORPj7!6iq5hkRmJ zMVX)XHKZaM=w+%lQ{)KLNety9MHxCW=$KfY6F1!w7~Hw@2C15+ilU!c>f4rUXj1sl z_d4HnNMJE>t9%i_r-Z4ouz*V`QkjbEfor6p45o>s6;0Qp^=Sp50ABrbflvjzPMQ4^ z-<|+!5Iz}=OQ6MHt3*+;iL*xJ^KIqLd%NC?d-J|Qn>6K&!xmQ!rpfzoi0usGcNF0X z2gM?4NU&9jap6*#XaQ$S3h+`umEeUTcxwsna~Q#5cU)S_>rDN@^mRSex z>CN~Xn^aeakB;5eg3B-K>jTE7=;*kL)A7TpkhqBNlAZX?%pT~T3F~inrx|t>2)J-V z2EX=8{r_o&_?_$UA6aI1YX;odW7;M1Waw3fZF7{vp)2!0Jpmeh`u)Q0JjDifAYs9{ zUDs(VV*ZVa)|QqQq}>Ne_HlUhlpt>4AuKL1w(p}Q7x7x~0ZsOpTll4b*$ETGKa2fg z=oIvVy--BqZn<4Doranv8Z6NZC50W{>7(VCRJyl_SDU)neYn~+nLt$&Ws7?X)z3`M z*$;1%%A#wiLKetJuyTa^k>@fFb-X96d_CJ6WyPrgwPusr(k41tm0z0gWzpnxLblm! z=k9-(pZk2mwEy4+)3}H;fwhZ~(>&5E7R02N*+{zc?T0b=(D6M=jZ%^!rc0*l^ z^TKmXj-Ml-RabLR3?T9$KO1y^qz2|OfbL3<#Ee+vO7h0OtUHBuh<*>{!R4Z8G=F#9 zR4^w&?7GqD^evoJZF(RscCV-3nw7;TmAh1QL*(a8P=f-oSAN|J$9Iy{I66&r~ zZ_84s%l*L}jS}T1yHZ>AB4e8HTWa8bvBS>VM{OwD=m`|&$F!|t^I0>M>Ew6UUWc3r zPk_?#DqDM1ljl60BV$$xE=Le}pYr{yK4`!KZ83Pm!oj>ydA5Xv#k<@tBIl##e|Hl# z#~~-{n{O}Cojn2g!wKWfBF|puXRDxOeDOu>CBMiiHMEQWiTnQ<11rD8Qm>*acJuJV za*aOc$eMC?#LX`zR=}ulmEQ?S2g(;8#H6JAM?Op|N5&1w#UDb=Vxal{60-k~ z_7aG_?z4g!c+sBTm-C7ykGh;t)lt;3!D)Rq5aa&zqHVk7!Rw^NF{du2q$E4xn$a#o zct%P2rdvP6x$$kmxbe1|66lUgt=Pk!!6Ly2YDOQSrF2D82W`xA*u;Uzd(oryg%ftW z>G(uc@>w_k9)etj6^40lhI-KodG8F@+|G0%DZkrg>6>?IYf52nC_-uTTVY028={t5 zHtwf027(JOF?MM(n~TmM()@cHLH_!C>5b)86BeY?@2dlL7p1KNoIA4g){W&5BGFeA zM}KMj$mM68)l<_L3 z!@bjjmB51m;79dCi+3+)Z{^zQYRRkjC###ukiFa%#A1IS)Zdz~&axbg3qBaA`FLR0 z%Y{!O)W^lX{rG#!7WzMO4V;qUy5pWuf4-8-Wx8C5?-@2Hz-C$??&{l>TVQAft~R>M zD!!?%t~hMz-N_65;+oomQ#Onw1ydB&n-Mj#p++hU>wt56)A0{H0B=Vgndc-6p9j*< zK0}7unhhIWjs`0w=fjY2Vh@is+hKlD%_;iDll74WGxnA==f5wP26LT=t;n_g$q(!6 zp1P0q8z$i3;t)RpZRg>jW|vdEluxtp5FRzhnjp z)rX$}s=v#C{4&8H>oie4_NKrS4D+RSKmr_Z3so++)qgbR5x^j!+s)SD8GKg{0w#my zG;SKN2zSQSoUIrh1ea50B(;W9&ao;k%u8QFVPQ54`|Y=E-A?WR)v}l<;gku0W6rvA zJk>?F{v%ej3qGMn5oz2odE^d)pNrj_(NXC|j1f~VOfrZnvW^!c?ZfDS{cxRm?zQA= zqjviOjnNwC^19gyd4%uZhxeXPQBylYSnFRT`rq8a1oe3p9p2fkOB1arr^Eha?PJ|5 zau_b{-M1DuL37DQTe#~2R1ayTdQM60iN4xzaB6;(%0kFKedX5K&g2V31maW~w@F;q zPsTs}BZRu3+i8FHh?kc{O^lE92iz>xtV-qIcJoj;p@p{+_wD6EW>YGodP+2V+z?kb z!rbdzEF0bPU?}kk))H@J|7Wt>#We5{>ce!D3}-;e=C~#LE7zHA}(`f+t~GiJ?@tq1n2u_2P9hN%Z`8iXD6>v$XTTP=`MYO77aAFv3bb)*oa@^Vt{NE zMZGxuo>iP+r?oVx(+C`1`3roW`w5?qaKlzKAEce%D%Ol2c@EmJKjwd%=QGfy5N%Au zvf$%D=i(#12+O#a8)0`;D>1U*u+5^_gJ!jsfV$N)EVLLBMKIgT@TGI^*X)dX;b@zm zA#7ss-T6=rEN3fG${>g7Yhg~HEeP2d;kkM6rZka<1Z_|H+t|VD0rAHkD^nz4Sm_Pl zOvXu~2x!U)Rx+mw7c!wN=AWbmaVE@;8K+*7L$#JAq;MQ%?ZLrKmwg_|$Kv z`XYv!&OZ21P6Uc+jmZ%MPk?ESZ-XSA`YR3&7x2w-=wTT_y7e*l^$$HLJF;Y0KnP`5 z)cY4!?r%RUF5JdJ=2e1IQZb6dFm*-dQ~pS@MVBJ&jJEQk0>vJe14ZN%TtUj~#L1`5 z`_{DnxTp)Q)zu(0R(KrJ&6d~28qUEb*)^th`1xWnI7hRZ1M%l~uR&Cf8>%how@&O! zphR~boivgnfP2=K9!pb08D!XA6eb;;#CBy*mI%F+F5*Y`N+_Gl73A65J7E1tm?bqk z;B@2F25}`0bWU!@(QZRVlUpA7UmFYm+j&)}RY5-;oN0rE0|vozE3%lx;SHfT%P`O9 z=SCtkBzokdwI5U_*panqyQKzp-17}vfv-#q#F4(HV}1Yr#vc$11Uw^G0P**@kuf_% zpm5+hiJAszhqMy<^(iv0X)KKstf+mra!LfivNv4E`qLD=-)f3(M>PD{;SWlNx`U<7 zuv=4Fx0G}vy|pF}^?#0&Qs>k`8{sq0l4dVO%lS0m;DBRAcw@)-V?&-s59&o9>#}cl zUvxu3dkHBnW&h+T1PULzeE$5%q@iU%hB@~DmbU_(t>jL2lD^7~ zy?&fAtIoeAm}3YHs*OarjhIx#I+gYs&I?q(*3Ri=6%uhSm8%r*G1_q)b}yDv3qX&b zPSlppg4b}Se3}(un-zR<|3h!9%<9%e)%g9Hs({@D>x71CRwu{t)N8n zmqjck9(iP1n*G{UGFyClNRUcF8Hth%uAS|H)kAIK=G$x{dw1d(RN6y!>2dFApNtH` z2c{p)i;nlT9J>wAMORPG+QsK@>DRtUBe1FMh8c=}FCJJFJ)HZ+11!2b1#u@-%fYD=h zM0?du^&q*0Z9n|>%VG=HV?_U=kH{?FSA0QqD9JU~z9E045BD2D=LDWBauQDJ~ss2-y9kiL#zOlW4BwF|$@ZtwAghC7ea zK(-w4a_fDQsS7+}{DP#3j-P*IeS{u2zc_r8(!}c~LDd>Hc1_7Yn#w3cB_+qQ&|NsXK=;c34Ggo|DaT473Gr z#gbP`V0r9czyN(xlabCX&{sWu3d_6fC_xo51kcqlqkYBE$6-h`Ep3^3Rh9qIgry_0 zs_VP>YD9jk!k;}vuM@`T*%!uToJu28YX0Yr%(m8SIs(+MGE_Cyuf$~d-epZ(YS3*y zAawDxe13_VvrsOoX*bt0NOV4=bj2&w+t%ZHo`Sym;6F~UaZspMJ({rkQoOINk1njA z6&|oK9o=od#X=zCs?o8iqxrD30ST1}l=48At7@*T_}KOWhMU$!@!Au&6ja*%1YnqT zF}>Sm6=cl1C@~m%9G3qykhjq0Kv+F?EKVZ47aD#aF;t`~K*rpqPm;mF%imJ^CQmd) zX7oqLYbVUl{*%)agy7oz4KUsUb~&*jt&K+Y?0r7;0{IuyBPN8?Z7<1NEk+MfS5>Xj z=DqtN+IR^D!-5fc<>JzV67SO-?Vjsr9rnYL6}rN**|cJbXnVbDHa3nBenc6Ji~D`g z+#EREE1c|_+HqE3o-)nkJ{M8(0-kF~bD`ySX-$hDfI**z`{IXdl6>9)wIK&6b=4{M zZLD3iJQ!Ev=crGes7m^(#qtAW6&w53x1f)ETafH*s)a{VnYv{EvND)@WM5Nf+I>ff zNYj>}t%owDFx(EzeK}m^ifg)EuK^-7(4=PcbkXFVUq@M+3-!d!(9JZy7V*!_ymCur zFiRa%h0HfiFc|*^P5Ng_^_RWspR+jfka}1(c`B#Y$yit91~xi|Z^ybEUm>{Z3uxa> zz~}^LT5EKcYD1C}=HYZs)7B0{AT zNELXRu|$w6Y)1>=)Ni30HVEe5TFkU!?m%{Re9+a_mdo`>DSio_8rxLvj1~#}9ts5& zB^|6vg8#0BHAe>YlV?gwAJ_to)m)lhnlM?$_0H9J&IKVPg`!`?pRt8IZBZAD{ezi6 z3i{%&m~a$y>}yJ)6OTF>vo>HnHIFLNh-!Yx z9zFR+2np+Z=M;V?-Z)F5qBi@|eqlk)yR`a0%l&eCfdE2{7D=geN?4 z+DPX}Y|% z@YN9 z+sDX4-0vX;Lik47M!oP725%_ zcGxQYB%R01RDFjAUJze)3zEsJt3Kl>{3?>CVF9eM z^GU{%^#Ba-=>&nyabuEIMo`4C{E5*#hImt}wvFPMK!O&3306W;)?`$YfsooiQuY2_ zaH=W@TGJ*yQ>^-?JV{>L=opS({o%^7j}q3DmQ*~(t_pvRKg=Gt%Nf-8)?u|_uh_Cj zEY{p5aSU{D@hYV#i>5rAMRaNx?d`jvxzir7br7MF!K{TnOx0Hx->dh=;8||ekU}vw zZ)w|dW?oxXM6vFb330Jvf!mGcPxMe4n+AqHnul?1e0P9n0`htvF{R{5F8xUR5#Lm=OKG`q zX9*;=WEPw<{656Jl$@I5lk@j>9hUN+Ftu4Bn-87+Xusv}Q-CT5ywm)EqyZsq!$WEy zKSIe}`X)14;*ht}z2)Z;O*fMB)265@8i&{vo3_Y$Fwd73AU1{fu%e&VV$kY=l@M5P z|L(>;{u*zL#W`@HHZ0F4dS36;WwW`n#IDm5`gkcgGwDuM`qR8rU!(s!y8z@$lC{{@ zZ6ZpaNE@w5>yi9F6Wzl=2#%i7W`*GBst^kZjy4KSCI;8eXOZinF1YZSG~Dst@rzWqt`pI(VUgR9MG?9Ec`N?uCYus*Y%&|ek zd}~Md(rs@H5xOod)%sSGtUiBWkZby>u&i&$F_LSi_27EiDVHhGUCark8gI&}fXKwz zGS|&s8HgE#s}=sq5Jb)0J8QT01TdZsQ^=pszLU=GVZ?!U&$aOOo|D6E&~^Hp zLCjAjW6u}VH>3(#`Bl~-K9b-64V?e!zTG476Cm;`L~x&h>@jk7T39PKjSfK!(DPPYdr7J@N1G!A*Jt-~8GE*@JT>o4sf z^j|Z)f1S^)15Hh-REBd~LSy6D_R15KwVFT$`?^M=@uN$|mcwdzLOc*UJ$%t&q`S%@ z@`25x-?|4I$hbvZD3@bUhVZR~zd>K7!A&-W+AJ+Rly5}?+g}huBAb-S97L_5=&j+^ z!_|I3nEx!?ly!~o)6|M!bM8neWBONtYI-n4`KW$pc<3#_lCgA*(V0C|_Mo~+`@1mg zs{y2*d@1-XdSyj;ZW2!uy>wIHNw}!}*WU>#k$z?t9*viU`X!`rnD`2QcO_~K9~zr2 zUNwEgkS1@QR8En&UTf6LG&juUA<4q<(;bfENjz1^1`*OS>%sds`^JDsachqFMs~b3 zv>4VM>^}aw2`2SLVc(aW3JG!PD@Kf2GiY)OP^Euw(EkN$LD(?I>f5Pkvd^fEY>T^# zMk>Sf=H%s_7WLb{&q&qCp;_XA*S2thj11R|iol@eKnL|Q04+vkyd2kf3&3E^l&pup!eDTOT~)=DHdZP5jvu2K_TziL zfTCSKUU=Pgrf(-e=5E!D{&Pb0-F?(gqpv#-mn2BUS@K8?^e@YnE5nAqfVz+;GdF^3 zFEmmo{k&G5t-kAjV>=kjaUmB!q;{TVD2h^48b(`Se_~sKIhk}5mki^p)&?vC{q9mx ztWdBe>FLy-mbn(7^r4;>y;-cZlMs943+SfT zC7+t!Fb{f^W)+ynK$tm!;dd+buP^P7j%CQub90{9kOy%AH@qv6R~84&&xl45kC>g1 zNR;iE97v0zSI5)x@feo^88-h@6hMB*A2bAB1^QCV4|lZp4@xF3`yS%np?lW2f(h=d zAmPw#>-3`e`aI7JO+l3@dRveg`yJ!XPN0Eez^{jLT(W*HXpZyTMDISu?^;JI3`9n@ zn#!GIVGOCC%68toymm_c=4df_KFqGN>Fs9omc~+<_c{Bqv#^!$`m0N+w0rTs%dO(+ z+>FxCG9VFBj9E>O-t5>ty05r64YA#HP7#5+4EwfeGGu7?_X~?9$rUTbrL*xU-vgL^}ACP#Nnl@C-`YU$nAfsnrW=*NGeHK#x79#kBzjb6=bwH%-Vns?X4T?F!h77Fr57HXS5WX&~9j*3qr z6o}6P6Z8b0U2DgIutxw)LJO5LDdTAz(VWff!Y3wQt$WD8`4rqTp!}No#ERYP3(ZOM zQvQ5-myQX8zRL;i1pr(?TD)-`|?THS2^IAAH_lA?DwY`t=((;y2zO z-ndx`dq;vQfw?oCHxQ;3mMO_EL_0y^MM$3>0WM}LLrDDJ_1uAwWq6d*Ime{MZX5rB zpGq;$Rl1;>@90Qml_4ARmRO90sYTT7j0+0^Bog5jTnZxV7!9vW(ihgTGC-Y;IApFb zU!Ph*3&mpXZiHaAUqN>3mnicn)sp1l7N|v@7WS}?%Y8xOH%uq~lv!fkUO;h%=>yox za9+sp2FDRq^1Z=U7WNZ?$2x$?8!|NFzFD_y|55#;x?qFZ9ERSG>G^S}mt}ttm)WPY z2~1y&Z|?}S_Wv?e&VTnT=h)DAL)H(^v!v&S-EnmTEp<4dPaC>mA-5oK)S9T)CBKsM z;j}PmDs-Z*`4(dI?7?cX?FAOZ!svz}vA@eqp_+bg2W{#&@dF z%jKS2cee!S{@mqFsl>zrPMpOXE4LDJ)9K zWop8a|IDUt=-L!~8kwf=#gCrp_T{BtIWnFi?; zBTWSZojB3^<C#J0z_R?H;LHob1+n9z$K zO{qMO-LNmXOfBK_pGulziCZ&!#1<3fN|{eM^ks8*=NxOKF)yxPPuS7zb}*Ph?ulXn zZ*a{54ujd!JA*#aHX+s_eVfu+2SVXG#qumaz}NK&rUtX6UNjoJj%|7Qi6r)53ll!L zge6|T!-_EiBm}Zx_WCQYX1#p)(dnH^??7TWdU--!iB$e>MBZE@_o(K=-6P~uwOo1P zKOnIk_ogO7&54c%F61D*@{lY1;8~s(#|THH^Z-J|S{gH_$tWI|Gn~7O-oI6m?kb*> zc*Q{#=n&PaLI@}q7z!nwz-z_}gQR*aF=c(rrud^jhHtOKo5#Qt4e&_^SkaW@nE~nP zY+qbagw+(bKtY^XO1Qic!K|VhQu_TKxx}HmAad3WvcSo!niP#oRV#k5q!~dQnbi?7ZPc>t7VCRkSOFPJFr-gc#v(pOwc4v`f7bh ~KCW}^ zdNJ=pM~qXJRyJoTzLPtPN1d1GCYIC6+zsfuV;`AzZ5>>KH67|k!S15xkuJP?xtQ}^ z3?qlB6=92A0#R@5Te&ti^~sHXyS(Tam9$#1T3v)xk3%-<;)AO+=6AmO!quK}xxod< z_V=gD=c`+SUpKUw1!X-`l4S8fOFbp<7p5BH2r3+9c{x(kju_IQAfeiUc2R6+QzBK) z#b-b=C7EIZ2C~s*+$-KZOJ6`I8w$fcyP#V8YLO%p#itmlH3!CsYK_5)-^Ute{xb!b*ra$vo z{Wr_i@*;-O(Zp}0*GtM6FD0X=JV=)>3`NLYEz3i#AYv)36b8%+SbIFYP zB_+hefbHr(bVC5Jw`XrOQ9)P*k`{?GlB}=Wqwjm=JEW0h3?T+j+!Q!soP%Yg`51ck z?0d=M4@F7sAg8C|+ezt<5{PR*$107NbqRFeqaS0*?!Xw$+CZT)V;=b>_Q1xRU*hXx J82;tOzW`e@EgAp- literal 0 HcmV?d00001 diff --git a/docs/lib2x-footprints2.md b/docs/lib2x-footprints2.md index bea5d649..221cedd0 100644 --- a/docs/lib2x-footprints2.md +++ b/docs/lib2x-footprints2.md @@ -7,7 +7,7 @@ Drive a turtle with `["forward", length]` or `["turn", angle]`. This function is ## Parameters - `cmds` : A list of `["forward", length]`s and `["turn", angle]`s. -- `start` : Set the start point of the turtle. +- `start` : Set the start point of the turtle. Default to `[0, 0]`. ## Examples @@ -50,5 +50,5 @@ Drive a turtle with `["forward", length]` or `["turn", angle]`. This function is polyline2d(poly, width = 1); -![t3d](images/lib2x-footprints2-1.JPG) +![footprints2](images/lib2x-footprints2-1.JPG) diff --git a/docs/lib2x-footprints3.md b/docs/lib2x-footprints3.md new file mode 100644 index 00000000..24534a57 --- /dev/null +++ b/docs/lib2x-footprints3.md @@ -0,0 +1,55 @@ +# footprints3 + +A 3D verion of [footprint2](https://openhome.cc/eGossip/OpenSCAD/lib2x-footprints2.html). + +**Since:** 2.4 + +## Parameters + +- `cmds` : A list of `["forward", length]`s, `["turn", angle]`s, `["roll", angle]`s and `["pitch", angle]`s. +- `start` : Set the start point of the turtle. Default to `[0, 0, 0]`. + +## Examples + + use ; + use ; + + function xy_arc_cmds(radius, angle, steps) = + let( + fa = angle / steps, + ta = fa / 2, + leng = sin(ta) * radius * 2 + ) + concat( + [["turn", ta]], + [ + for(i = [0:steps - 2]) + each [["forward", leng], ["turn", fa]] + ], + [["forward", leng], ["turn", ta]] + ); + + poly = footprints3( + concat( + [ + ["forward", 10], + ["turn", 90], + ["forward", 10] + ], + xy_arc_cmds(5, 180, 12), + [ + ["pitch", 90], + ["forward", 10], + ["roll", 90] + ], + xy_arc_cmds(5, 180, 12), + [ + ["forward", 10] + ] + ) + ); + + hull_polyline3d(poly, thickness = 1); + +![footprints3](images/lib2x-footprints2-1.JPG) + diff --git a/src/turtle/footprints3.scad b/src/turtle/footprints3.scad index 78ec1f8d..4ee10d2b 100644 --- a/src/turtle/footprints3.scad +++ b/src/turtle/footprints3.scad @@ -1,53 +1,16 @@ +/** +* footprints3.scad +* +* @copyright Justin Lin, 2020 +* @license https://opensource.org/licenses/lgpl-3.0.html +* +* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-footprints3.html +* +**/ + use <_impl/_footprints3.scad>; use ; -/* - cmds: "forward" ("xu_move"), "turn" ("zu_turn"), "roll" (negative "xu_turn"), "pitch" (negative "yu_turn"), - "xu_move", "yu_move", "zu_move", "xu_turn", "yu_turn", "turn" - -``` -use ; -use ; - -function xy_arc_cmds(radius, angle, steps) = - let( - fa = angle / steps, - ta = fa / 2, - leng = sin(ta) * radius * 2 - ) - concat( - [["turn", ta]], - [ - for(i = [0:steps - 2]) - each [["forward", leng], ["turn", fa]] - ], - [["forward", leng], ["turn", ta]] - ); - -// cmds: "forward" ("xu_move"), "turn" ("zu_turn"), "roll" (negative "xu_turn"), "pitch" (negative "yu_turn") -poly = footprints3( - concat( - [ - ["forward", 10], - ["turn", 90], - ["forward", 10] - ], - xy_arc_cmds(5, 180, 12), - [ - ["pitch", 90], - ["forward", 10], - ["roll", 90] - ], - xy_arc_cmds(5, 180, 12), - [ - ["forward", 10] - ] - ) -); - -hull_polyline3d(poly, thickness = 1); -``` -*/ function footprints3(cmds, start = [0, 0, 0]) = let( t = turtle3d("create", start, [[1, 0, 0], [0, 1, 0], [0, 0, 1]]),