From 10aaf9b320b4e5ba0b5b617529d5c0716ba0ee9a Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sat, 6 Feb 2021 17:51:51 +0800 Subject: [PATCH 01/99] clean docs --- docs/images/lib2x-polysections-1.JPG | Bin 28523 -> 0 bytes docs/images/lib2x-polysections-10.JPG | Bin 13020 -> 0 bytes docs/images/lib2x-polysections-2.JPG | Bin 29643 -> 0 bytes docs/images/lib2x-polysections-3.JPG | Bin 5873 -> 0 bytes docs/images/lib2x-polysections-4.JPG | Bin 7295 -> 0 bytes docs/images/lib2x-polysections-5.JPG | Bin 17586 -> 0 bytes docs/images/lib2x-polysections-6.JPG | Bin 24457 -> 0 bytes docs/images/lib2x-polysections-7.JPG | Bin 19122 -> 0 bytes docs/images/lib2x-polysections-8.JPG | Bin 23115 -> 0 bytes docs/images/lib2x-polysections-9.JPG | Bin 22706 -> 0 bytes docs/images/lib2x-polytransversals-1.JPG | Bin 26273 -> 0 bytes docs/images/lib2x-polytransversals-2.JPG | Bin 22024 -> 0 bytes docs/images/lib2x-polytransversals-3.JPG | Bin 14524 -> 0 bytes docs/images/lib2x-shape_glued2circles-1.JPG | Bin 17415 -> 0 bytes docs/images/lib2x-shape_glued2circles-2.JPG | Bin 21314 -> 0 bytes docs/images/lib2x-shape_glued2circles-3.JPG | Bin 18243 -> 0 bytes docs/lib2x-polytransversals.md | 42 ------------- docs/lib2x-shape_glued2circles.md | 65 -------------------- 18 files changed, 107 deletions(-) delete mode 100644 docs/images/lib2x-polysections-1.JPG delete mode 100644 docs/images/lib2x-polysections-10.JPG delete mode 100644 docs/images/lib2x-polysections-2.JPG delete mode 100644 docs/images/lib2x-polysections-3.JPG delete mode 100644 docs/images/lib2x-polysections-4.JPG delete mode 100644 docs/images/lib2x-polysections-5.JPG delete mode 100644 docs/images/lib2x-polysections-6.JPG delete mode 100644 docs/images/lib2x-polysections-7.JPG delete mode 100644 docs/images/lib2x-polysections-8.JPG delete mode 100644 docs/images/lib2x-polysections-9.JPG delete mode 100644 docs/images/lib2x-polytransversals-1.JPG delete mode 100644 docs/images/lib2x-polytransversals-2.JPG delete mode 100644 docs/images/lib2x-polytransversals-3.JPG delete mode 100644 docs/images/lib2x-shape_glued2circles-1.JPG delete mode 100644 docs/images/lib2x-shape_glued2circles-2.JPG delete mode 100644 docs/images/lib2x-shape_glued2circles-3.JPG delete mode 100644 docs/lib2x-polytransversals.md delete mode 100644 docs/lib2x-shape_glued2circles.md diff --git a/docs/images/lib2x-polysections-1.JPG b/docs/images/lib2x-polysections-1.JPG deleted file mode 100644 index 05408847ade247b074e811bb048cbbe237422f31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28523 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 diff --git a/docs/images/lib2x-polysections-10.JPG b/docs/images/lib2x-polysections-10.JPG deleted file mode 100644 index 656d5e4b0e6c00ba016d082d39e6b88427758f63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13020 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 Z;(;A`J1fYtHSW#LsXf}a0b*;N{|ETAmNNhV diff --git a/docs/images/lib2x-polysections-2.JPG b/docs/images/lib2x-polysections-2.JPG deleted file mode 100644 index 784c00be221b89ccdaf1397cb3194436e650be19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29643 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 I+U^ej17+(r$p8QV diff --git a/docs/images/lib2x-polysections-4.JPG b/docs/images/lib2x-polysections-4.JPG deleted file mode 100644 index f2b0125a8cd52a72013e72927d4ac4dc270928f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7295 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 diff --git a/docs/images/lib2x-polysections-5.JPG b/docs/images/lib2x-polysections-5.JPG deleted file mode 100644 index 99aee7ad9a75b79cc55d823e0b093179e522c051..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17586 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 diff --git a/docs/images/lib2x-polysections-7.JPG b/docs/images/lib2x-polysections-7.JPG deleted file mode 100644 index 361bb0b0e9f50401dc5d7f27a1ac7e3db80be757..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19122 zcmb@uby%BAw>O-+LN^6Ui|(Suix=N*aV>-pAV_fuQXpuMT|)~LXmDwf1Of>jnn0i} z?hTOOP+Wt%zC7psu57I*Kg9@x_RTqO~yOF-KM+G$o$|w<9#L;cD{!!Y&>jC_c=v4c^>f#3JEg* zE-E1^AkHTsC~)E0_3Jlp++?_Qi$Q?(KC8gr{+)dX&|SYUe=+nDfD>?m?!ra73uldh zHoyhI#Y-11Tmbz0@5900g*`QoK3SFimBxNzy>rAt??-M)SE z+O;d^6c;XDx=eTF?!&9}V%Hcr#h)^A8CZM1j=#q(A@j`8=Sx||cM=niq>-_W7b2;* zZ(aI15agZssef|gz7*IN_9l;4)h;0yS$>_*At(O_-Fd&~4W9Gs>cva{*89ITfA^u- z70#yy*7V}%Ept8lQbt<8${=C*eNxivdBVooFyQt%@ddhzbO2?*2`k`{_+LK!zf9ho z;8P;k2(C+Ube5Jg*69To`GSABD5qL;wgP_tFKhkn7sdy>Bd2#<&j9m__4wFe+!^5Q zi1NXq$Ey9uyMjSSZfAgNxX`WbiP4t-_s@BG?~lLY@VEQ_mkP!Qvb&fetJejm_U}Jp zHod8k^7=~##~nBR_Z?lJtK5=SpjBI*u%yUzz>g!483(qsf_9rRL&mkn5%%ce+j7bK z+sS&xiXszt?tFM(G`yI-$4V0yX z<7E{4qa^U%kqaF`jM!E8QB4{)AgDMDA7c~?BB2w^7Fw*#hs6h$hC~+Lu@el+I5J)-`PLsQ z{zLU6;E#V{`rj&G3@*(^Xlze_%bd5?mZhJZV9D z`M6l7qdYCRN%Y!2@q~qBWf6IF*87t)K*-foHogE@$VLdyz$|{*k*AQQA-m!33Gz!64)a4BS-=t8=)cZl4WdNB3*cJIQco~o-6)WJo^N1CL#SwLFS>< zpMXFABKfx-LT2WNtL;Os<{l*775eky-$LtOiRZ`?-f4JLN3#E(vhZ4yhs{xRzqdIj z5>iuuakrGQpbO?xRH*i_TLW@5gSQdOF989FUo8rBWT5tC>Y8Dh$?im%VSCzx3tWHN z?i+nolLtMQsarUeaS>%C8yL6+OVDi_x-X5CScq@nYJqzjnc9fkY!#C~r^?{Ma;p<0 zODsC7XfUE$pBb;9{-{9LTdn@X1RYf};0%z`a4(Cq@;(W` zT~pjfGt-|yoqSjYFV6HZMW)9j4K3sa*L3dN-3}?r;Ztj`Q?>kIyAoVM7g|)>J$-aK zZKNIU5%l1oCN*n#M2hNDg+&Q`j<^33*Jp@KaHI$UdApHH|NmEC3keGCkbVyi->ewcqHr^qtFwJ2jL z=>8}xah|v8x30FZPH}$QM8CJB`Suxe;w(Y*&*e$-WIs5_cg$>%s#jVGpjr7>`2SAH zZ*Z_&%R8LHVt}1qY_hlE^5!5ivBnL;rf4DLBd&fsfU(niELob6KM+GuN+>w?xEa%t zO`i*`pSmBtnZ;Fw9Fp=KmUE*;X1h#>t#cg_-<|>Fex3oG9VzmENqe1So*2t=U*H&9 z;W(g#A89L<{YPqLZOO}Zz@RDOMVID_%vA?Lf1cyQkbVnbbNHp^S8cBdOHuqoeXo}X ziJ)~WkUsN#hKQ5>O{zqjTyO$v3_I#NR*oa?|a? zt3ny#ZKUlpKup}zw3T{Mvi0%B1Rg-%wAm28(&)a6U9P4wKO~fk^mFltW;NJ1t>9iN@ zw($wolJ4s4u{&<}VwUB9l>7nE`a2T#S6XHhB>nT47h5`pnN`0zsM{097rz?-jjZ@= z(7qXP=L4CR$5D|y-wXTbztpP>4g@t4Oj#SyT;v>j zVlw-+hr8x!xVUKn6ioLz`q)sad_AGfgrs<>{ddHPN@l^B-(4SV+AZ8|q`VImLD`2c_(o&h{CX5KeH8d98qP0h8CfuQe zhhuE3OSFprsl=hg(7io_IrF$|QAfC{)u-mY2IOLo->jHY6}J_Qug{T%${C;;dbeW{ zsAqzPa8+2xOk>rEz$u@Ys_Hd=+sE%3xkx34G+jqoAN$1uja7A@$TBS}Q5xrwt0uB_ zSy%Lx&@O$sLpPiF@IE6Y3|7~2r-eP5Ossp2Q^ymU7}B=W)B9`!!_4<#`qf{nbM-$L zk+jMu&rL$#9fu+~iUT#p_bO82g;r+=2?X({10Hu#X zXX=-sK85|T#5A%rAfuu;Pc9Sn@v?YZDoYVbMrAu8j9t-azw+>UOoHxQ)5;2X*?N0| z)s5%z#170d6rq8MKE1iJc1$DMRav+vx)B!gxaNA_fTx6|ED>P9scDAYE2uZPX!!flaza}@L zf>P8#z8mYLENd}>NNt5bWS)g$$yRrBQtU8I1$MBq;L7(sIzQ!wyqcp5gJMbOhz#Z# zRg1u&-*yP1Q>>=G*qkShJ$ro{26Z=Lqpx$8y5%>Bjdp%1*lF||?`==zjiL}_qp?vq zkaqqyULY`VBuc)bR?(M&)sUm>P&Wa!x?zEc`jjcM_1=@ zW17Smp~Dy-v{k7rdZGvnIxsnZ#-tIycCF=!0CnvMqIE&KPeF8vm}@TK$@ zYk~*^g@us#=75La#jfYi-R)54Le$_|`?Gk>1{N?G)!Ii`CE=UAVy)d$SDpvNFy7;0 zCq6-qIz{IcfmP}w!5u#i9oeMYgvuc$L(sY>B)Zd$umJ#rrqg`QMNwFaoQ7UCfT^w_=VF@~ae8BA@0d~M3~)8YscdO=o=Z_@DwEN8 zZoKyZ?y!+Af4woJ<6N1JFLN+xgl z{_69ladEd?9i>>Q?`On)otPSq59AGWn0>FvTO8fH$XmWkl^aUd|a_r zz5@Tq0aRfwSNR`2tUB21QlH=W`xt5;zSitnFYwqKS2sdSRb)#byBg>@kzDka~< zoMqo@FQTmjTeA2BxXNq7r=@pEh8@Gx<*3nyksLX2~zhCN2}l7GQ{oW!j4(N^fNMd-w-QSPDQnL z9sHi5rNRY0e5;HljY4Bw$62ojrYVG8sYbgp=fvX;x{G3a{}{m=NGPH)F5_+Xmg9{^ z%1-FzSqGG5*gJSWHI*uVkICMb<4Ajs0=p{FDTu7PDfrt> z>^qUl#@i#)B+Et6QRpPESse7?AA_~G?&c5bW?&Mo);)Oql_QHuuzZ}ss4GXn8NFyn z#G*1Oz9FtpFk;=Zuzjsn1v2rAKMr@FVp8>KdWm75&4dhuv8hk(`AVCVHioBsXj zhC>v#@77pjioJ;et{Fib>|qH`;Kd*Nj{#>?1aHw#A2t-k;X`^8o>~g7FEndISNd)qAQC zk;q>wgok#rw5=2@Q&m5tO~$hy?>s?Tc2I54kX+0SZJ)PP#J*LoZdhi`814U63J{h2 z^FIl|-^*U{NX&K_L+mrh&6$|~)d>?{6S=aZ=pJCbCdGWJo!p!a4m|-} z!c!Isvc$)23Q)1=Gz~u0u~ssapf#qTm6o&LXY?d(wWXnOynl6M{QzUrKb(Qe5M(%Q zUK9RMtka{<{}A|YH4U4$w1jS&o?B1zlrr0M&@0JjSRd}rFhYM%I1GQi`(LPm`0 z#4O!Uj6~=KRh_H*=feQ%!?zuWd6xW;u3R;>!rB7`2dx#=va!CiYZ7tJ+w2DrK8(sox-`F=bDKS0!QWiaBwAe`f5tnytER%V%Y(; zSFOJ#3b`sjTTSy&I;Ge{v}(UICFCc`U2fZ}+!d=UfyAh81Ta-MhP+eeeqp4fvkD(Q zkeKhBr7UAkWR!JXK^`z^!CTq9dh784ULx8Dn-krEr#&U*sm=3_St6S-fDht-ht$RD zww@~Y_G23LEg_-ze}PS-9B}=TB{Dv-3Z~XJxa_%^4(Q9is;DO0k{}al57Bi@VEjpV zz*x>p%z7Ml;-)IdlH}95+FXq}I?#}HnOK!m=HGJf{W+kSqw%^k9v!y9PW~fSN zCAzw6Sk1^-Q+On(c%5@Y>Ejb5Y0^ZVqeozRykb90#90)YW3R`wj!6v5*D*nkuXqT0 zYW2z_ojij9+n?LQpN6~c2_R@DYpPO2Ga1^Tb=>PnYkTJxxD_d zAQS2OPXa6Uy#|wAJ~WqxF>v?PIaN#Y9={#VXdNwp<~MGzniw5fm^%dT;iC%WoM)5_ z<#~((eMkDfEQwjSL^EA|GR%N+uBt{P()xvXd*mkeqJn2a@6O9h098{D79G@Gi1(`6 za(D?Y0|KbH=8zzy*H+5F24?Z+a&4?l(1eqK69?ZjG<&qyg!~8^>LxULDjLxjJ1V=p zl&-d&>;zzY|Kjhd<3Cd~9%g1V@u8DUa6PO@yEw4){V!jP)qMz3_(B9l?}iU(9i4Kb zeJ}nBP+L89=9c= z6gI(Cp4sp^I+?{q6;QDD8|V^iMkNud;nmR2Rc;?u!&y@S`-M~a%7Gb$UDWPA+uf7jL9qQ;S~uT%Q;I)ymbLz{TE}GJYli}ConSiS>RBbH z4^L>DH!QKJHgRQ|i%G!j>UG9Ue+T(YP8n7}6v)4|9!6S;J_SmQVj%&oT(_BT1|N)N zmg~TDZCEU#2bvcSei)W@bu7a=Mp~rN(KCi0^!cv|8YB>jF@xebU^#}Y0eQfOfN#E3i~Cgvh&X@o!gyub z#&@a97*+kObLHht@g1~A_}SiHq>F_WIaHM_;6WbwY3OR%9TvoP*@5uF&#VTXHBVS_ z&a!B<)w%PuX49?Y$@iwvG`-IA7EfCU)*)wuI^~*)nYRC5tSkX8JrTg~ zzVn@Hf&GLNm7u{|g8Sx=EX01dC8`RR=5CDJnq{5eKCJG$s=fWLVaCpFEfyNeulvB$ zsXhvtxBu~tsqMHXujK((e2-66;LzPAVv(K7Cg**}f{?|-BZR_S?*3bY#H5?+E!n0g z_ZIUa_7Z&Vf9RF+OW=C2@J!lV?fM!5bR1Z#$gMp-U!vQ-rr5(r&pp%SE`&?hN0Xfy zW4`QGv!EwrKh8#0>vfdeVb7*xYmftATYL{9u`KxFNF#& z7(PkBdSH?_KuimV8ohJU^!bC72EO<0ZbfxW}xapC~)2?TCaaAj19T+}Z zn=Ic>YLCcb^XEi^JM?&cGIRX`XC{XZlp5GV_<4?NTJF7VG*G`R6n1@t)u4*GS&Vou z$0;HrYa_$uF-sUy;*)j~ugCKo(V1nUw^NsDJXZYzh0cc%@U~D3L$R zoe)6l>SGcn(OB1b2518gg`rmc0_uQvK6WG}{_TB_m$B%h{Be(uKOFv_XMS4g%i<%% zsmG^i9+$LQ@~M8JA-}fC;p5~V>|cty?T+(#ucIdj6LSZ*Ob$zv@NAJ%63we40)fh% zA0;<4dE z;>&TFu?r>O=oJEtAdq1O<2Ox8O$p~26w$`Lg-*}}E4b$V*eVK`eYUWCZthD-dF2m$ zBO9X~RF!pCPJ1SgB;GcKO+H?oj4NLA6RfeErFxCbsFZU)=8=TT!mYzKHy_CJF7 zpNQ_ndY|KM0Lo2y_w7Ey-MO0 zar)5at@gX#Q*IumGN+EOxMmPr@{(Avzk-^?;?z!NZXvm67?S)6c5)0BjICTav{fwp z^?B$*q<`V3A373$Hpo~ggxOxMYeo9FhQFoJA6?xFLIN58@3VC&>Gk>{>PN%X7)bD| z`VSFEdw2)yD`!8zYO3krBj;Frg{ymobeY3m!9k?RoJ$?BAyc zYe@tFDWp9an^5TIG{V!DOM#3Js91f%hb0kf%4#f-oD5quAO(aN?h#i|IiBk3Sw`f; z8@EP8HU+6${0QLA4d+hjf*};a?w@r&)Dv9LW9HF677-!QSjIQjUwPyj-W#;&4EU5U z&AXseGYA+gj=H#Wb=B`EQvbuKro9v@uA^Vs#H18zrAYRcoD#4zRi{PqSP5QM` zO)zyU>@5}1#Ccrr;IR{Fa%|7`<&;yP7=bjXP~m-fsp2HalI4YdWY(u0@N_ER>h3?` z^*_v9V2cLlOY$?gul4%xK!cRk5AO2V-h<~g=TDBOPy!4L&j6Zj)EM2$L(R0EEGtlq zBIm*VLG((uSBa*N)r};jJ{GwM2S=j=A}YYg^)OJ0L&t1_VLj0AQmf7_GVlgs3?xQ> zd+9#UuBt>@uc&Si(#P=*uRu0_Z0mX|77xGGO{22U0kwX04qUyr!BaAi7iACwHpYKv;f$%9j8V~l#x}|p zo#;_jsos!=sRA99&R3>$M3L1qS7NhOb{&U|Pq_)GtVSe9TQi&9jPFAOVTU3Tj+#_` zMFnIjw@_gIbf95~5M;@648mmXI+LuQgs|<=F#HA+ceHa(8^7Ym_$x#A8*L1fF(!xE zFLeoUdgzz3}I^Zl;VnbOr40|Gby4DGiBC9zl^(cXb=taYdOL9WaGs+R0 zTS(Clr)K~rbyZ8CLyI+nXe5@Z&t4^35PS}gN$uCoK+iXUDbDF>0TA|RiUn+)&spql zie0Etqgp?eMrPx75aCoSIFv4zSIR)JrZ1hn?iTt`o3SBa-I2aLc+J%ftk_C9a1DEh z@N}^7US9RtZ&fF5*3>EX^o4O!QV{QsoA4@ooXrtiR19Fp%CS#g1Xu?tnz55UTLen{?5QL zCY#CcRpon_{m}YsQcnlE3J?CIBvnAkg}CC%dA>4s|Ht0_Uw2{~>PZH6fZzUwm4B;% zQ##7SRQ;-lL%h6VyXXFjN()6sY{)Mq!vF^FccDHRgEMtTxU>uhZQ(YLbnSCHlGo-| zoR=G-r&`C$A6zG_c!l5g!}6?Ux2dIO4lR&8Fi~XRL6DJyy&R8(G96=g6>+aW0wu_v z&8vS^J8uWJ{b8rGGfs6`^zFCIJY7AqVbh+ZezsMc$G`@IGt|%-wADV}ww4V)c6?tD zJrSh3`k$)axbnf{Ygm_FPE>3Tx(PplB;g_n3WH1QCDcc`%E%2IL+_$x- zE?+r`zmEyl>xYDO(Fp7D8GhOpn$WiQHAeGB4x?*t65Yl0pVRxLR-EH3F(H5ay*5ykBav--ZZ4zq^_?A*c3IhL2z&e}3DwOuyM7{A??#h);94DjL2G zB$cqqi`w|lq|3KsAJ)Wt?KGg2p)m<2BQ*(o#O(!4S}on(Lug~2wLJ8V?H#)pAa@sz zW8G(Vek`0;Xf!b*3LTg!tt$on9+$kf;k^mw?g>yj_dfh}A^Ok$ga0kq_g$83b8^$r zp*C-1GeKVi^VwX`{Adt*I5eJQjKc(`-ebIU@RZC*rU+`;dV zFd8g4NwcS^K0(F0T%D zDd$z0@a^=$2RsC-dVt7#N7_WVO8;Ia4RCLT_m#7Rfl#1dwP@0)&wfX$bA#1e3&#LG zYcG+2oW3ZjN>x=B1}E3iH}KwGityxf7h`UG*+#Pn8Xx{<#!j{2*Lv37xZ_w0EdmEvg!n z{J5pK=gp{8wJ5)EY;w%5FWP0;r8$t|KTDFs4p=hj^~hfN57z}hOhTLCaR)=3T`HY- zRmX4^Js)2U5TaTNS7yb#Jak~vp_I3d7Q{>4ZO?L-`Q`J`gR<5bEQve;$xWURuC zC&^oe#&s?MQ+|31#S6z~sMl~HuzRj=ga$W~oGmpxF3g&ipes_6NCT~(R~K!48FWD1 z#hd|{gCZP)q)cnZpy?<=OwrE$30kgXBBg5hsG#pyH&nkV5d?KEuB+I}D?&B;&p$rj z4&>X3JVgGeU}~?!$Aw>38JLoqU>D@7nQ`@-m6nn|JuI7RUV7I>vKiSd*=D|R>W^uD z5YQdx;@0y`;OWy7Y?;Ad0;OdYCaQYVz>Otg=A=!;lXo>At(dMY%fTw&uCFoquuUM&W(y&1Ru<~3%t6ky@m)I71yznx zgubfL_iG1NCVoEy&;|}E|DwIN?xx&TnVf$V%ds%B`CE-(=!+Vq5zmG~>IqOQ(FrFz zEIrR2ItP){T5&`b7v@(>BRU6)f*HYjx4!%-eYBr85tQ|=f6j0>Z^PI(X)z*Y*f=c+ zn!lXH$6le7qs1J7W=UhptuxwUwC#7Pp`6bGtC``px+8}l%*$ICg87zD5#r9y3d?QK z%R2Wz#SfJuH|m*#9gZ12_51y_$Jc@V&hlVw^f130W>x`pa{Ng&YI~_0Am{eSKMCvq zJageo^vm;|41Ii)({y16xr^dZP=shhTMiHT$b6@#n@VOK*3&@epfz7T8H#vn=dL;0 zwftm!3Fm_P;xn1w?Fk9n3dq#8c+;aV$S9${@xjm2@C#M`tcG2ZkBy!(!xa@= zc6Z#-h3OIoQUo+-kgB$AM_j{(+f-4u`y=HHFTlEuaT9{ z)S+Y&>ZjhMm*WpIZb>kG`-BHVlT6uEMOm=9lY2WhAHMvax6rSi8iBiq{fOsFG&ptsP*0X0P5>Medm-C0O&2qlvOPC=Zz z68roW+3O7T(!D^MGXPk1{=g`5F#8v>C-gfoXhbV}e{CZyG?2+t*KYvzx}bVHG;*VZ z1f;M=*TZY*aGdg<-RrR*V#68kt>bBuUzHBn$B3Nd?cq0=t9y2F;9fb`{ist|^E zs#f~}Hd3W8m#UB#m~o9YULK5E7EU<90TrGQg{pM(311uy zQ`OEfC+%qj6`;bf*PerJdp9mS#H!_{=S&z`Js2VR&Y`rcJjP2(tUjS9813b5GL%jq z2`A`g#_wmbVYg_}A&x5jxOjPt9n>q=r7zU4Y8-UzZM_Q z$816>2es1^v-(>yAJpc9^SGJ9Yh3Ybk}PE^22=+P=0`ttK$aj&TspJ`tx7WM zj8>iyJ{Ti=E3{RLVS>AbS*iy{(Sr^}IIv?mvbH&UDhBN~xx9QWRHL5rzVx+yv5NDk z+~->w-k1}?W82N7HR3JU>cW?*uqrQ&)g~i-^@B9=nmW*k3 zE3^n-@bq3k`Zt&#rOxO#1A{wAf$(&}4uOUvBL zEo5PBGHX%3?n-IwMaJc`Q0rcI{6y40L)q*GFd77pM_0}}P0!QsOW8Hh zceC{~o9GE^##oamKb48~(ZPLe!vlOasC{I#H*DL}srm`<eN$bw4_{2G>r!`2D;bUIk5iFa_|N-74eO=MXGId9}YLJ?8(_4H?z7STHRGxgJw*;F#|tZEGIaI^maV0sHM#eo z8~!vm9(MT2kbcRhz^kHgojeEfO>C+kYHrtL(zuAIZK!Eb&=au{7*$mgSS?dwN^&s6 zUz%hMf{gWG6a824HDkp)Rmr1c3UUj+(}TN~dI}uZWDG3#0dnYH|7m3UJK38Pe+jr$ zd}hrN;&yG3{o#>U>kY>G7b)r!=}!;UBSJ>K{yhZ!p8|0&*l{hFrl7I=R92j27i*nz z@yDwl4uj01UfG|ApjGh^it7^0l-{)sqoXnyj&AyO?BAV@(nu8)Z|(QiXe*sXsVnh- zC8~dfM^Hr?+fWm{>^q_Nt&lmQERZ5dWyfH67@x-8a6qcPWB)IP!vGLT!)ASF+xMeM z;z4KoXa|D8_hu&3ZY0eQ+WRp2iEWc3TY!6S8lu}}U!L*0xnbRH_V^vf?$+kT>A+o1 zK9?k~*XDZlW%h{Cyrpm2T7U3^jO7>}%cRqA`te$j^6fU#EBgnmvl zhJ?|(akQI_TsJ#idIvs!5#o7>W3O8rcdwl5oc+AT!0#8x#{V5cG_1yTxwQGNl_|Oo0(*)q z_}n02xM4d!8P3JxCVW0O_Qh03#N;=4nnSMou-}Mkd9TYgLd@J=Mfim*#&mGI+th@? zeC<@t&*NBzXtG*PUi6Z6N0&O4(?Lpz4YH74=Uk41F@cX5s{%5{Wag&qVi4$ec$PnZ z4p@JM@Qd9jJ@AvZqiHCx&}1;+GGK0uu?xK=dPSuwVHnB{_^(6f|C@OGzQWudzaN<* z{pS6?ZQd;QMS#A)`BvgL#0z`>T})sCk+9u`3s zs4Ac_(kO~azS}<~X4b2$HWxZSuA6jXm3+S51TJS_z3{`BRn(6awT^g}Ka6pwF#@~N zMMODM{?Rtmq!SidItMpYo5Tg00nqM$u?R0zRz}?z$N&wkK&f7X^Xh5_bn+FNz{&cy`? z=Ek~`A?R8yn=hv$92$96NQ_?}s7|%-pqv3zu&VR#w03Zqz?ISu>W67$ZLdzxXSe3j{ z^3!DFy_!K@*3JZD{kHVJ6GkUb6tEf5x`6l3M#x{7X#w6JDMN=Q|#nl3%hduoDA6>CdX z;J~i}VgdYjY38b(^ZB5M*UEZqJCqI-IbUITDju{gSoBOHszEltY0yb%ci(EmI;qWN6e@T2xF7#Kizm`eA+rfw{LrHMr1xbvEEf1jB8-a zK3=@DOkY}lF+FOtsQihKpnYERdM#)*P{vz5+MtT6Eih-X(&<)-iw*|raqAD|-bp^O zs9<^e0e(8o!^=fjcbwa~(-!QOHc&pi3(>zF`|)NHN4p3c-a6vre;e0slda&!q>nbD)8|Srdx(QYJVD2Go;jVYojrLUZ~sygnerI^i{S?gZ-L zA-)#e1NMW9-uis^kBFpnr<$1Cucp32#H5LSWYGq0n5a8JTKG`5h)lMuWzvNWB?*CR z9=FlhvpjAt^Xu=)^G3p}$mMHv7(HxM(=WpEXOD~0kHqS6EXU99glrx+@LU?{I;4z` z+m9b*VOMu8nVvILj;M}0*@iRz7>cY~t}6_A!1V?0Ln`wib)6rs*!e|(e%3~u)a~Mi zt=_oQ**AVFvmp+JX+R$hg-J!%A%nRxCC0FrWd9f!ADHp^=Pg=|Tt7e7am`ge-&EZ| z?^wJjtwmpB!HV9`&}mO7P90Oe6w$+H?WleR;Nv*S-BKlJjoz%%_C4yat?kv#SY7ea zCM1~5&sF_qrPHO_Lr-m@v(v7Q)1oFI1~CjDDK_`(nC?B$)xnnZs4bAYp&$z`JJa&U z?puyh6cx*)e7pSbbSz~iOGVCT&mhqZBXP~ggXwB>O1xFB*!X+)rt#?gcu-Bfv|YI| zl~IX?c1}m6o<3%|u7~y0$8K_645WR5EGOurJ|U2wo<_a#%Be#{a4f|(EH-A}Hl=1M znT)Rx8(tW!b{XIUg93dQkzc2>S&pph8`gK-*E+?)#L;Pt8+B550Kc>*T*C7EKX63- z1ILe(CXfvo#dDMzXIzEc2{?-%_zp73Bm-8 zwd+8*7o?2|4@=(zs5L3c>^6jkPp*tjq}Y|f@hxT}BR|qhyvgGbOX=qfRr2RJ+J)cz zF%gMhu0w|Kaar5?kjqyYyDhO%jZ=ih0`0eIrk<874Xlzdj|SGJ38OkpS8D8lT2qZN zUXD=I7xn+opXsmwMfVNxN&Z+|T41@A&6RGNfRf`v+;7e3j3wk6t|B6P2g1H^-<Xz9z{Xt-t4f!N(l+2CV?Wz{ zs#!?1Ohho=Am}W zxk9n35Kg(l{9y&dCzIaN60FJoP2MSO1s-?jjM|s`b1Yk97siBEWq!H}0b;PtY~cfT zg$+xxZ>?c{Q`n@dKp>YvJAO+ePM4+WenD!YrF6tj=sSt4=%ytLHt7c}V{B}$gYVhr z?|L~deA`Zi_>5uWjQy#Ork!R_A?T4O&a#<8DQ@b%MIv)AgEnKTQt6e0+80S!k7p-L zvO#8Y&D8N*(nG2hFdxYsACK-KwkyE`tCo#k1Q}K0go94nu#`$2Itg;+BSQ+_a&YMA z%U4Vz&#J}2sSa}mC8;ZznzH~ABv6*ppM>()$V9(rfxP##AtXRnm-tJW7rBBF2Cj2I z3UC$*1y?Hnaw_dwQ7zY+?&lNMM&*|;9uw<_g_8$a*`va(H*V{hE8ot0-G4k>_h59l zvAJF~*W^&73%g-pP^}B&d*}PuQ@J8`7lm+h9`PTSA|fC(LF?-;Kn`GQN1f-{=<(%(=^-zqE!3B}#{Gd$XPV z`HQWT)uI+fRie}8(HouGXTPAIS@vDD(A;7rzC9M?Qks=L}ahABG%>ziT?c;o4zx;rr)S;u_JT*+!)@ET72W~ z_x9!Jnv17Q7akhW%?F|9H`@WJs2ZuLiHQ_MWT_CaMT|=$_R2R(L#Z1fWn09c+5RQB z1VMRNEU=d?L(I&O3-;^x6NoEnQu@wGohXGJg9EOoUpt*(T4tzE?m9`_cAG9qd-Yq$ zf0W-b9^v2DJ?D={^iKHZL4A2hI9m|88{}+x$SPNoTN4Ftqy}$tqSC)?GO$VodliqX zvzTW(+d)}o!LkO-kr*sML2rJX!|ZVn_@ET4s8e~&KEN>|c|O5Ds5M6fPz_&Hwg0|#ccHze|&TZ+wnvs*9v z%>>;BGP8!q-VdE*=lz%(3A!2L-n16m_-oMu1agffiNg8bR_U0O2p$QCgQNwth7~}u zHuAyhAFQdi#!IPS_=^^+YL)5_3CNML*SYyoX^AeoUN`+s;+q&uKG4{?sgz6Me2OEI zRGy0tvDhfz_6^<2Q!Wm48Au3Q80A7xV}@z=UO_!?>w6}{J4;>Kssl<~hio90!{!M) ze(!=8D>-sg!dI^SrLOxV#I)io6 z3B)V&v`u+WSY|1~qJLJ9?pt*wT&!YWDk#%rL&!!ehMb9YXrRgTMJ6R`=kN3TUh>~$ zoj3y!Cr&S%0nFSd4ZJF(fHip2vQMxBCZSI-gwLHWSh=7Dw^Jl^+2>ap6h?gAC>Ydo zelYv`IV)~YOwjrP&j5Yh9Ht;)U8`5~1*yy2I05ztsP+V{^V;o`^{ zK}UXP8&nip=VJw5@Q+t`j$b<6KAiZDNe~D$g|Bi|C>`&QPkKHSS za0(OBt+`%PjXZ6n5xue zgVv6moS`lk0Sl2VRo-u6=e9JcjHVES`6h^#e)dLFklzG*+TA^B&Au7rV1rkOybjgdA^vU72@njrQf9)88l z73`8)#ZoufHd>G>65R27Vuk?MXlDWeDI;bvK8%40M69%B3uk?hxI2tSo4cDGi)g7g zH~BueUHQ?Gm{l-fR}8l^s-SZ(&Dl3R`K|J8stsJdy^%%qvWa`MK|htjN6$@XWWn%_ zhJj_oLWyC*7|@p}sqgb8wg!3t*-_7?nd!~`THHBCRuk6mwqLgQg~dZS@E~{azJ&00 z7G3|-Hk;v7vyefL1IdPo+WNB)xG>9x9I9qO z0!(suHp5fDMxqBekq%J7*`-(gS#+bi3RbtnnZFB`5>Ohgf`v1vL_gOdOR@`EASa(X z1xzwD+9XAT41ewkDBKLYDyO*&6_e8xKxg`yrcS@!D3jBLc!$vKtWH_h+@3YlTJ;RK z@efw;NbOEYb5)bIb=6bnH6cIV#bez_X7jQOQR9i0(ZvH%NzveM5YOAnPD_44E$n$Y z)9F-Bn2=}dvT%I2Yt&pm70o&F4QYn?5LS{( z){HdrbBU!o$aXG_nZ|qX)pox&qij=2P;g68Nn*cr*PcTWecY{BfhdYBqWJwV>H=j+E*NYky{|>mcb8J9 zSH=2w;uv#ZFLQfNRbv*Ryed2EycBUlB(o5tdAtejGhI;}ckB$hN6{XV>;!{s3M zXu8>jKS3*vf8H@Dzvj@WGu{gWR?{hR8%v+4)QG-HR|!{CVv_ORNDHw3G3g;cK^EDK zFCZV~`r`*@)M}(RyK5}cjex%9Ot-QhgfpenBfxy79$x4_HW63y3TmO=6@N+DY56v@L?VYq7!V76`Ul;|u?^<0M@})9{$f}Qq z6S-os4`ezK1IDus+C`Lw`Usq3z|TA3*q$(?M=Xpt^%Mm5q2 zDSEs*yZ1cZmL+p{n$Hs|gD;=k6{ZB?_5!>nD$_50#O!%9a! z2J-+5ha;B9WZa-*WC$0i8(IU`I|JAbalAZ21xKok?S-e?t9!`1)s4c_hgUo70LCXT zrcXOWnx>NmSpy%CcbHR3J6W9gm&)pvs5*$sogT~i7RJjj>S-pUgUfcTj(7JyLp5~NVuAIa3Q4<{1UqMF?7Y<3MU)(JPmKr?Hrr~0vmjR-&4)eyU(I)pab$G%b3oBd7c$?m>GS2bMc=gyi`He$(Zexw_r9zB)&r5{lIg?yFOr7KuYc>rSsCOK*$lh-V(PI%TV~ z&&fc0p~48JJgR|W@4n`%>j1z-8Ar}hR~+LV*ilJM&U+%MD?M{4B7J1cBOL=TLHH-A zsI_&3_mueyePz81v`(;Imy3N6xbdT`%4EQWkPEW_x93H^`j6{Yp!(r2`Ueat{iMDw zuzGg7ktV$b_k-T<)>&=bV$Mhu%fGpXF62g?>zcgQu&XysZe!u#c6^!fA44evoB~|& ztWnA3Xsc%A`o-#9*}=GP)a>JdJ4M{GXl!SGyPM zh67Qn1ljty^_1-x+fVm7%9^RGn&ho%Q+?rXv{m$N-s(lxE>~+-&m+M;cu>_$Qca#2 fxY~8SjJ9-WZ`tZq=B_|Dc{e%W9#u!R_5V!(pD>TP diff --git a/docs/images/lib2x-polysections-8.JPG b/docs/images/lib2x-polysections-8.JPG deleted file mode 100644 index e87527f9394c2bd98d61b51faeedc41544279093..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23115 zcmb@tbyV9~yEdG5>Md&$ugANeJ}Y+L)j?tATh?dv`tJ|6|V0$jg( z_1e`d*RNf@cH{c>8@HHm-@1A87W=*XcbK`@xgT(`b8+%K6n(_QC(OsmB_Jgr{8&s} zLY(_YX*p@2tSC?%cd6nGZ;Ft4;2&?RKYr&BmIo;~`Vsm$wJa=O zq}5GnTluG=3WqjD2EY&}XV-v?qT<2Q=^5sWAusy6SgLFPF{gj_%<@R)s=yPoXR?2! zysf^*YVO{@a!KP&ys=Rjr4bWxC@L@E>) z1*0lH{URu`eLu(4P`c6d-OSz>qDb16$Vq}+O>Y6`gaf&MBElRS?z?^tV4SXNJ7ys? zWL{fN?N)BFGvoLQfh!#y0hT056lb*=)4LEg^c#jxTewlT3bn+O_bvE4VoKKZ0mW(W zQ%SR2Y4*?%mGK^KM|WvoISQVgTk(TQ5i9u>LL3?EN%2pTf1VTtyTd_ezL-x<$I#Mv z=Z*>gZ|8u|I^JEMud&uK8#uiBL{|{wD!37=-8n=mRF3cLa?zfxhsz&{#6q~=fG7pj zwywk%gZGO6D0<~&?X4Lr+jy-qrY3uDD@8Sx!6}}WWA8%6xtI(oB47N+>Q%0aF0Mhk zl<*t3UbI{7vF-%n=5itXub-qi1GxU?3jaqlKGE;(C{HBR17y z9BL|F^~-bnmCXZr2~>^PYn8ayJWXX~saEqQGy+(9`RnGSyN^OoGFzz6W*+5pNl_9` zA(UYHTFs)wuwTsmNF#9E$0^8*xKnWq8(R(f6d^p#iVzk}vdRZO$P5&8a;OT@_flT$l#^!&kKJ&b8h4b(V) z1bVP@deqi05|T)hzBS*mrXg87Kt51-1QN=e_5{n4CCanWL_Me?T(a?ADC6E8C77~M zK*%W1Ynsb;RaihMJF|2PsT%BW!?DyM2gE+wR+q?0D4n08i#MN*vMR!MDRn!w;ZDTD z%saNq&0ntfHp&sLX;-gAUM^Dy5lRY>sw;(lR?Ao%%6z4F0k^vUYK(`wi^=7CCq7;d z&(lzq>Ym#yt7y+M`+nDYqchad(5YtrZgqP{p;wAJK50!4v<4#_0;S=6iSEB^I}%iN zm@FdnUOx*=KV+3hW#y)C^aPRwp;zKCo}K~oB#*#>$u+WR>Sk2mR0Cyz6hUolo|J2d z1s#Td8OSO8~e^SJLClw-Y21x~0Hqx^TE_ndBfBzpL_C`gJ_Tr`?a6u4%%6kswlp^$U6Y@{bWKUJ|+ z)0>B*9plNSWp${MoM@xANvLnQq4aC@Tq9ABVqEN2gdRvs-CQ)+7z{xdHL@mjw3j{e z3pEg+&yU~ezP*k@fwL}=Ue6a{pyq8Y#vOYhYwqkH_MpK0pBn{8U7LoE3sLOn8?Ec2#d)T!kf0Mp3-2$KH_p~EpEj*n2D z%xR%<#$_d$<7LCY1`RsP7#Fwxh(?y?{i$=;cx*sfsTPR6Ff_=BbPl+@jIHu(=xkcY zP29^o2e5}N)Q9b6XCE{+F@I#w%zE-IzslBar`rk`8rank?>sQRTuG<;3OWYJfVsSJnNjZR*zg_;2yZ)g(J* z2TGYqifIaV!3{2b3&aWb6VDl?k*i{R@4*sn+v*Q}HcZKV6{ZCdBCCCIK`$T{t*OY8 z;IA$|x6L5&XaNBin0{uh-+rF==b;v(Z^UG!bHHPe{Mn+G(SnYU`O=4#lasSgU)t*R zNA{#|rxk>;149*u;r?5mnH$?;j-Om7pRF#;(gl{ryB4cQ`s|CgAQh$W4E*~^sw+Ho zgQ?PoV-p44jT<9cza?8)8L$t=H#Jf@&t|*NTqdIivr`q?(PY-T4I44XaC&^V&f#is z*r8%Lla~y5*vkeL3XBB09n^bws= z*$|oSp6n8VhBfS250{)E`S%b+=SRRb>%SLs?|{uT;L3&ZYe>B>^Mpfx zL2op$WZ;L1Ik928eDdA~RqXO6^XFU-#)E?nN=oLPeB}_O_nN@oB>4=LWRM_c6_ z6I2y|2>}p;I~B=;-z*Jz)L9=K3`R$vxhDUDJ*!mQhubFl(4LicAB0m0_Y%&0vAGS{ z$f3LsCAvcf9JvT%pK->{>D3?=+xN4cM-p^+nbJ^Nai%YnE!U`X!vLhcMhd@CYbD8A z3(CuQYQUjprKm9BFV#%e7-&^FWCsq4W(3#O7>Mj4#U$z4!8MD%+j>f-7nY`}*q%^Df2a1IzU=3}i($h*a7QC?tnuht<8u3>>c2XM-W z#zc81E*uTTG5WfzL{2)%rK( z39+0y&+k?d=K!1BrCUXNP{gY&AYSV+d3oeh7fdGQ=Z0Mu?WnI$bfN$>QQyLP@o z^XCQ)Cf6ck)v2bo!Kr@OZe>}nh$Ak+(BuD!cyk>)k{CIiv*T3Z$S3Thhtk*`e zT$b3@UXXk2P}K^3J;D z>!AsWqt7$!hM4O@cA# zsEd!Sv0E&6y$uIhIYQmyQ{Yb+Xitt2Uf3LU3pbxDy3{f%A#SWXMt={Al=m<=j7x8i*kjMHA5YYs!=Ft zGzeG`<|Ua3ij>+*Ax@YYNAwFc1X|N`Y)9?evBVuOgJ;8e9FqDdC4^DnPv?NuacVzD zXKue&Q>LZh@l##ul*LqFv*rhvNVfe0!@?-LF#{K?ElV(=-#f985t>h|Z44J0ky%zg zDyqMcpKNwLV@iW<#Up=s^GIPx2c<@qb%}~2;lO?kU__TBVes9~8%>tNRu3MFSj#rE zySYYzTa_tZm>!PtM6BKJa3I%q_$^uqj#>v0b^lxb2Iz13ZYReb8<_C*qt#fIXK;m4 zx1N9JI>MgSvL-(idB9bIs>*cpv^SM<*c;mCnm`8P}&)m|?;8zL_8Jf+2`v=?JdxwIn)L)|t!#M-7P8+lCJugbn_HbZ&^N`3w$(Q~ntI z9)>^CkDhS&7CtZY%|3^y31}HF0J_8wRC=4Sc({AUDR^l6P4vgTk*V-D%K?{C@4$(H z3Eeqw?3|zQNCrJoDlfO)ZDVDLsnA3HegId+u%wZnVH#-FLfvRhssnhH+_h}cL%F_8DULmzJG&Mpp~&_bYaRy7DopJf!4>WSfi_Pc ze0S>Tm8?5SrP1&&>EEd*cISY-0!QXX>BGY4bWciar}noT7u~L3r)w0r-%JEnZb6{J z_(03Os@z=@?Jun)n;d$_U}c~+F<4K|geXN%>~g5Q6RG|pm`5L+3-t8-7Hf`a|B z3r$7xw=V~hOZy6SUyLg}Z|YspEiLo6^y78VO2huqKW_d5T*N1V-!w`Y%sN(1aT|Dr z6pYu>OGaEW-R?6aO=A})_R+F;1&j^88cSZT4 zcu$AA4;g}x9J{_=^OMx$9gcq%t5yjy_Pu_v_O=@NVO) z{Dg304b!Gps7)6oXaI0?=FyjOvxdMGbBV1YAvEWG1;$Oc+=Qc{wmrjYu@bsmo`Bxg zC#iv?m7pQ6%?+kgQFX2 zyu%((n#GG@1+2%-ZclZ`7gdn9Yp}qQGk>wUt(j)k=MxGA;2c}Y`rb`Z{&(#-3{9h~ z(sF)j2?!;C_3xW1JNsD94&~fWkbE%5w-erT({mwX%tq5m%e}bPE+{>H_nn19$WD(p z9`tC%*P{lnw}m(dWJkwNT9}3Y8In)?ZRaP-l!5t412JGMl&~=uZI1Eh$VaFTPnhe7 z!~9a@vEcNIh#GQr3k{dMFO{S{kHvM|f9nWi1Il| z%8DwX-*Is5Bku{-O&CvInYe))C_u2>$v$#Xo#{a{5N**8R+Gx>v0cZH;ty(hKdo#C z+Fa@BBf%uf>-|KfJOYRnN53}|5`#SF9{aT!0Itsd`1jEcxb$yS)73x!jRbuu(0)gb z`otKq6Tf#Hw^ZG?ycrZ0{ZTVs%WQ-jp(v4=bVBO;DEZUGS+{UycMKjObl1MSDY}3A zC_0`G9B+_01?E*)p6DpUDE|qD>KL=;w`U#NQTGHc4x%qR_hLOP>|wVYCuw1AbHtT( zht{%Oe{w}ZDuLF;5;0$5Y~dL1frbW!4df*! z^_TdvFBo+4g5X1B@Rs#-W!NwMkh)=ncxIQx24!0;r)HlbUHk$+s!}#Ud21odIUCHH zsZrl=kvZts#J1!#;E0b|EE6taw@-vjo51qGLZq^*t3#HC_S|UE_k+s*V5C)J-f9_G zmA%4B;RzM6hZFJ-wcV&aGVlT&Vo=28M(uS| zayyYIghU)+%e|+3wo+xs2F^B)Giv;CPj_wJ5f2sp8|}kSPh*FUmE%JuUEdw8tsh7J z5S-kVnZ(k&YWno7XpR?j=w>xpk=sbsSdL`5xO`Z5Ng|G!x_)su?7*4 zF2|P=?|SUI3HjL5f4?*c`P*pt$&&Wu>7>LCnbbs$ax%&mLpDM3-e$$ut=(CGkgExH z`-0HXz?%DmGZqGisw|RWy~hlVRE0thezc7pKA1=gJvAM; znQm}wxSMuM+Y%IJls}0#r%6>xeDQ=3R0JttGm8nYEMQK4hH%iD2!k1Gr?18L+Q9Seid)Q}>Gg!d|Ga$}o0 zvAYo&j1^msuk^MhE|n&r{lBhhpP=5*O$=95rzN-E1Rj=DuAT!LD%!+_JR5DvCBqBa zQR2dK`+>}jCP5Bvf+J10AyKj|i+-WQHVWY51W z7kf@6YR#&wC-9e7rgv=_LSJ^XBJTrKfxrJ98(*u~-E5s74B7C`-@0>@s}i<3SEn6y zCW(WI&5nS8GF-nk+JrhERIEDKZkbjj=a+ieHg+gQiJNzHc5R1c%s0#tqTTnAe4xnf zqbSN%l1EWx_Cgh=e1~}Fpu&N8z`RT&bfMIBJF3=ej!k89EON}eCF&<2)%4hOC7Hf? z`~5Xpu7z!>cEOK54|{Mhj^kXw!wzLB-wUB4ea)^Bde249~EcA=_Y z?6U+7vrg0fskpdWkiZJn(!s}VL<=wLhbcd@(R4jq(+ADlw;;!DvtCBsMTgm~wIhYG z|AdD0`cS;o%wj@V+2gU~;^e)k%G**uNa`MCzTF@hig<4XMjYY`6-Fjeae48KCI}o$ zx_i&)Ft5pYw%&g1#w=8P+!Lf^zXEknAn|J-XnyxFuI^b1tgUZk2@`#2D0{oUSJwdy zhL*b2U_G2k6Sse>HyHg$*g>@Y|K z?<7r{3I6I~Xd!VL9POgamCRpttP>tAUtJg4=MWHe+GY8Xc}>>POoG_EOKdgK{qdf3 zn&j4KqEL4qwzvQO@|m7i_2h%mh-z<;;$(kDi_t=@=~aSL{C5qo4gc$vC$BQ*iT&{kHv4z34xT`1|E9ZK1`S zL-|43(FrFxE6@XoC~;-zlRZ|UN}ziv5f3(tBo}zxw;!!m)rlW8>Wlyuy=Ltb&{^-r zMA_%YHz|H7(YuF~2`So&N2^#<53|ceNi@ z5PQ2t=4s~OR5}QhCWBqjF}+>v?^T|FjZ3H}r!8pYemZ%u+WdfY;xH(JJTtFc5%HYN zQAu=mNE}Y=GaqC#`*{1&3xzf|gl_el3z}74TiZlGVABKP0RI&#WUAL^t@wLoQ42+_ z!}#@+?4BsM;(<}Age1o~OYk5>U>oX3`D?Z9_tP}S;R7?9+neZ$B#Mc4fc`2LY1I<% zDY@b1N=WSrARQ@5LHOW_2`Lqho>p&xH8(NckS-iwzqAq-u~)>``>an#5&Y+ zKwPQqtLgimQ6R!$l3Z~_`g+6yq@oAc(UuW>q&G`ps}yt(GWq%PU*7-^0;1(GjBzJS zZ3t&dg_kO}`LkWOP`T4TSz>3IA?XwgAC5JU5+K);c9?#Of0wMdf>M;E56Dj^7|iNV zB@L)gB=TTSTHhdCz7DiR=Nz7WqH5Iy5+psB?M7Uqh%nmv88E?Qz^jVK7`0UmcSgJ~ zwr39aiXSF-`B#^%_Lvw~ey$6{IcTVCjn7*Su?OP242&g4!tQ{-zWcg*SJ=!uN60dX zw6_r4Ab(`4jeIa-=| z+H6$Oj4o8@%xwVTW!qw>EV(S9O)9C}-W-I{df{+hMZ0IiXrzdSZ;fvhjmFu9-S+;3K|t$ z<|Ai^%mw*GyESS#9|pU_5!fN9&@n~&x@+B=fP|V_Y>dz-8m{#h3`QTwix2R4SU$NW6ekXX7JhuJCB4g_f!jj!xG(eWQ4BBg}gjJ&(;UD6L9 z34H2X94=qjTgG*8rtY1zqElaFyiiO3vtGI~64zt=dsw7G>@~DzChy6KrF6#rg<;;u z{dc|RU-ji>vNL!^ysJD|gT}fx>m2gwitYA=X)zi6NdgoGN;y*a;n%KxTcgaKqb=i@ zCL00fKZ)_`F`vWl{Ir*IXN6yi2!U<){5kt=w*QAe1JLf6X&bkc6x~VVbwknK5?6}1 zn4@3qy?83Obb9n{AB6loMNhyk1fLrI?$cLY`piKPf8^?tP^N<@OHp0`6e#T&vG;g4 z=Sdu7GSYIs)Fb$7m%RzCOC0j{m*G)7D_xFk=&j$p^$^>P zt=-C=6d`tngE(k&?MP2lRYP8?;AshIszg1*KIvdARW~L_FrWsMLV)c9T`sT^xT-C6 zaIIBEQ}WHx*&XUWuz_>5FpMz&xsl9f9=CHik487mshAjj|WxGAO^|Gd+vEB>mhK*W(Ozq zT8S$L6NAj&Wj9w)Dl!pe=e6*GwsNp??;VC(jN+i{Q2hH+x)VEBF-9`bwsV696%3d6 z5t_}5snPEmRrOg@ISAJvETrY0q#l+AVdw3PwF@l&~LIL==#{ z!8&OY7U_W=-&ExcU+63jQSBkc%5e#~13kumixkbTX+J+qd#K`wXA*SbfhJ}Fgy8=! zdHTO9$NB+Aaw+?~kSQzEljPS(M`)xL9)5fKc9KdKh*8*_KR&&3HemASl!jT4vrmd5 z(r=MgLfc=R4QU>7+W6v0QxXdPB|ahz;njt(!)y?7)gZM@uYr*~ux}LC5lO{+UYVE^ z?p{BBkO7B3Pyq?%pbk;YTMl{0X*KPnm8hVnqjpH2TP5VutH$cOicdIOOmluw3-LfU zfo8kAyL`=5k%_FTNup-8c39$mUYOwU?05&B)Y9)@rRXie&u${y#kVzo)`>PjSopLY zNA)KS^iroIGWRfb<`F#uJPZw0^86mNo_&&I-9g|jVzk_Qf2?hLCK$Y~tpht%)z`?> zfHmj0Sb&Gg2;qo8HjueR&*dru0l#W*j0?4X6>OSkyp%{@Y#GfI9m;xm@7mRuAGM4# zI|z!YF57q_D?J~#HmE)O>W^6-<*65?kB58ydRh9*>`CdhBB6R5E&#p__sD3^!-hq% zBB!#}G>&gpAWM=~Tvp`3+TBztv1VimGx<4_ZziVTs<_qYh8Wdyeczwrb?^bu-Uo`hGbn&s)5 zYU?&n6xuOUjnw6pau7KP_y*$(=iJyy(@`k0KdcCG&R*PFnH{SL zQJP^xc{6S=J8LIFw*!BxsBV|572lJHYB-C=aeRgb%pP$)eD;KpMY!f8J>auAG=8*H zxe?V1srLL_KY16|!Dr#1C%UpJyI&*XQ@R`%j~VzlVjIy^8dPA(@iFYE;iSa=g`aEwGsgeD=cdE$1GYNolZSE--7M$??&EQ@RGIRO zIcFWXKq(emzCP3YaH%#_Q3i9=4L<($$k1!gqY+$d@$7JvPs=WKu>E+>D}K_u)vyeK z50^~NtyTf90!g;OP6X9bx=YAhW%8-OB$-{_68g4{>NwTWIwfwsMh?&cUK( zWsK~l+1AsJi_flmi2LfVebI8hEe>p#&n-tOh{@lycw8TME$JMB;H!) z7EGFpx6lD5q2NF583go1Nrs1VsA)u{Xz^^cdR5U@0yd7${E+Z&?WeY#Zr9Q@9wrgZ zIwy&13JVSb(}I`Ny1MwtY{3oD-I@P9qWJsiGFbJrPh@?bIcKa8_*O}LxlQ7$0)n5G zHlJFHVp6MBhGMz{J}R<8UkUftjw)D+ftNEOf;qm7{EUcJ!O1lwR%NN|qyh zSo(Y4jk@j=%@O0d;J5hlKi;6xkk5JC>zolwQRjf%wRhnb!cy1Oz`t%pb5Gyxi>RX2 zy9DKC7L->GdIfc>WJruEzglhq!(MWbqB?rpwAdB;44BlsVz{br&C4o)xM?8ZT#ayD zjp(yn+nlA%?y08T)Rmq{i&D+Se!IQ5&|$OoM&jcMoo><90E^ z#&JUf&_ID%irGlnVMLqO^%17BSatQyvvYu@LjS>l)i>?_83d}}rYl6?h`X$@c1g&w zJRuq+XurL(t~wGKm1A+L`sEC!c~y0qtn&FWfb{0?c?AIQIRAdr!?wD2jm)3W!`1Gi z%eq4ZR^5hhzOjw$fSUR}Ch4aWO$x3e!Lx@dqxF;Pp(n(Yk^a#@8WZ33S zh+a<_6t;X^^?JD+=j>PLS-4mao3OITOuI6@Q2)Ia+KLjB;cm}sjp^v>kMhCXF?U2U zA~N_yH4UnQhhxU5U3U_Cx47RY)O$KqBAU=8)C*rr|OTXQGC9PqsmU;`vrS8Cg~LZf6o;6M)M#YgKFo|fe%hG3hy_oi+2^cD)T;BF(5pl2 zeexuHYyTl+*?Ib{5Atgj8G;qX$UD@HU>t<<2Q+^Oo6XLgA^}A!eNOI=W9@DI@%-KC z{r&2OhrF7rqr3NykTso>(v#lPDSx1G!P7?LR^SGBb;&nw+`$mz1p~x#kBY`aHDgJ3XOF zCuHQu&o}T+up0)C&Bna$O=9i=HxT*!DY-@ybzlFXbFq!c8|(k95$UwQZdv~Tne@#G z>1sISFzu`^qL$tTQ!&|GjB#`-2PppbcN{{+m@V*r^Me_$YJIBH@LnkdWZs#O*mL*W zJ&BRzAJS_+OImg5FN%1A!`Q02JJ^}!J*nQ*`KG7kIB)DjgT$%b_e}5s$DKg7!Ick- zxg-IsJv+0R`C`3gKjQ7KZ&~~WZPCMuk$I|*{VVW5$Or6&34poRuNeaEFlmN{;cBUL z(VW>1arBq(AI(IX-$)&sG1T{4-F{eD``&mJG)MsN8 z^xR8S^Y+p9VUe~u2iQU_OurNy{}a*Hlh$9VBT!oB0Ps7Nl?^T3qK9769sMOeOA03U zrhQD02IpIjI`5SlZazDkD)`WG)pmZ1wl5$Mp49oqcX0IEyV--9(#Y^*CQhpQVNtNCb!wE*5I3Re;A5XJ%$pNn$jzhmhw z%;92aZ?R}@1>UOK%Z+FrX$=#7-q+KAA-b~tb5!xLs_1_KK8?#Mt+j%xOG)`4zfX(l7fMT?I`6p!u>K10 z9{O9}V#wzI>A)?ird1G(cN+b)vRGc;^mQFj;?#U=FPzK2v^0L$`4F;YX*|9fmry~d z$e0}?(pE-7n^nKz-Jb`M;O;r`AG4!{btY^V+{#QsxX@9b9h5hXd zOoJV5!#X<)xqu2K1Q?rlwHHrMTz?+ctR_+wq0C78qoWx~t0@$~sw|Vn?Z~8HaGo%3 z5Ut5v`5%&!q{kD<3_sl+W|0gXG=__k!d2H_xtd@O5TAgk8j?+ilz_-KPRps3j zd$kf42}WIWl6K!jrd4V45E)pHtwG!TxEW}2q$tkc{JN*Jyx!7sVX~JdFirf%pj54` zvU+%wRm5k#s7Jc$k1=RHgXrOS>F&T&!7DTa^uV98_6E0 zZ~3L@36C|{ig2EbC85D@q0Gb3tT-_kqcNM_K@9eVAzM~LqqqHX4QU>Ro1tw3R)xV? zjG(-+%ki8gM3dv=H~y;fiDPb`M;aGYYsK30!N!vNRk2~t)4?@gIHj3uP4W##h~ftz zBCtl;=+ClCuS0XhsHW!3ecBvzJW9Ufcav85dd%7{Q9lHN`z`+%LFsv&Y?A0HP-lvU zki)xdO!l8&s!;7Tkkm^0m}9+>F0_7$6%wOKh;*q`S3L)$+G4iNic**GG!w50hGV#< z85@YD!zPCKdT0YmlCKeP2G2Qb*ZO#e39n}r$JcmvjL+x3i`JiXe7p41vQIL@6Yi_0 z_}+|WG0o-+?tjYo3)PUdce(>>HE}QXOZ-;LhQ!~fDs)aY><6+YoG9B(7}LpBur;3% zSh7>B=)}y-w!b8dM;{;z|2zKik2c)a8BDQG_t&eRJ_hEXdc1ezv*Xr7Avq9jss!l~ z>5iYv&n+kSzoDS?DJr`>iwc7$AVa~gIkAOEA6QuaTI|$(yFT-FjLq|5$5yT}MzD0} zDy9QmRgcY21dmmYg`J68)cs0TYzeXAv@uPQGq8#8Fgc+^3qkMn6EfD*Y_lGk*C`qj_yt`MXmFnO-uAE{D z4i5~1y9WV2{WOFtk6=FJ5K0Y4_}J7;Yq%|-jBz)8>7ny~RM^Jnk|kl-CVXMU_$yCz zg}p^(ABj{@TQ_hV3%aGl?cyk1wJ5Tew5QsB&D78OL~6 z`|lrpSG|eu%RhCS-uOI)MDq?>ew{YOc*$0QolW$f@Uv#E?&*NxE)W61;i>{m{PsW> zn?;AwAy=hWzo7pYY=)kqthjgXz&}j)vsZp!2(m!<;lMN(fj7LJ2v&d4Gf|w_6kfn< z9A4a;++F2|ZImUg4~_aTJO5YdSpR?88^BLL^%yeg**^bMk(T7 zwVCc}HhY3PIFTj*CFP{7vM7C2l(Rfj0`XA$)EtvEExR-OA_Gzz+!r)A?YHMn32bn> ztK779+j5;Ac;UpScdV0Np1>cBopI~+ee|x2GHW`P8lqt5lPtGgkdiye;|xY^Wq;@* zCF&Dh=s9&zLoBP~uj~Z6+(mMnC6!$n2;>kDy}FVXl}7nkw_o^d>ymV=CP=`83O+oJ z8c?Z84ZF3pxXftG&)3rtm&%obGt8F?m-AvKI8L2ij!_zu?~Zg$c6rgeHs2c{LFkg< zQ`RMos?VNk&t98bIgjte*+`itW|!AfeB@?xWhTtli1IoYx_~3ij|flT-mMG;5Ch|! z%6aVXN(!r(J<^x2Jz?N;l-09P9{>T=5B~+am|4FmsZp)%EWA#6yFX`Dz0Dr#cYbRn z&RmH+F#;0?1#A?@Zk1Bf;uZ&PPTHx z*$>OOlw!4*{c&M!afs*~dc0xAQ(-V2IAH{t=W+Gi#b~4p0e^O302m<1QyHhp=a4d|6NYgjiI7~*S zD@lrBg}9EajwjiP-Ai=A_2@CB&4kxndCe}7h%obB88?$~$!zltq4-W8H5=jk@(c2zUF@}6(_7vP*=j|8RllW* zA9McW(CKA(5-^(%M&&D`Q@vz$%?a^Bpl%d0=_E}sCm`G*Vnh(!;MK6+U{0)lKlanA zOCZAj;iJ1V9Qa9#9c2*|GSE2@#lxZ+>b01#xDDb|XcG5y*u2Qhphjgl9cTXNPUQYH zDSXANrF?tZ$mTJW;`0feq$gfvxLFAD37XVtXtH$v-$U#Fl-Ru_gg`ZUtg5~=9B2@i zZ}MU3Jr)#x{k1Xibbb4W+$4CzSbQwuVe8)gkQXYP-p$c)e)To)julT>Dzxugs@)H*rXJlus}&G+4umw7h9T%Gls{}|mUZFA(X7_Pr=pXoPBb-aDguf7_ynPL`2dAGxV*V-Sm zSC6DTZ=c2%>u&Hk+Xy*jg4QbgtCFP1874hy6QY75PL15N_V=O-DHBU#KBi@&(n8NC zp1BnH1(eh2K2fpnLpbm!OR>#v^WV@)1glX?zcNRu%Dttr5JPYPbU7Dw&-6PaZpZk2 zvG-}U7KEoT$kS#YF_H;;TBUnxUy91-CDh9G*4~Q*@V)-|e{Y|EdwT^D^n*d%uR8|w zEe|*j2j|OLu#eK@P@R}2r+!9AMt8HNp@4v(`PcAAFQ09=1eH;UNX=k&zAs*K99QRDWHPgE%%A(kk!2J$uA`ykzsAuA?WSqI!{xU+GCWXC1Y#~|A;%Bb&fE0b!(8! z?o5Jvj$q5<^04Jv(>!3U7>L0WFuR^Jno(oB3c`Pow0F@0Z4Vr5( zOg6Bn2WLr7@3$G=(qC(Jn$1@&V&{=J;IOWBZS)bqr4Y3(^;~Elg9dn^Za^7y?rry< zvM}>wBy{7Qv|Qbt zp+BIT0mISL5|478Tmfm=4AV`J_#)Nm39JD>R)(d62c5m10mW)=s!jeG!T(n%|CiCS z1KQZ^)i9y6$_ z)H_Q-3vkKN0IGD)9i~73UnpNDzAGpqI7m!Wnt=bG9P?{Be*%8{N3~m3(l8n+tkO?L zDbPNgl@WN=yNHJ#O`@YPn%1{Ga9SdKW4* zFD(aehz+l-pro2>`fJ}OE{Z?)EY#mmA0V7WLJ0xQC0a~TaQQ*(+?l4w+8I+5Cq%YT zO$)x5!!AioF@JidNb0e|F%Ud`ufZHgKxp2|G-2(tWrP`X6ZtPdAnIq`DIUESh-=3! zO1=E?>#`eR>=q*9^W<6=Fk!Wx;+OjKh191q&e2lI_zvoQrHeX~kky2xW#{mW3zb=F z0VrT^H9>u(nU07%2iOHgpNZW&b5gziqj+@ev9jp=5$TPs=F<0s2P@O?6L9J^_40K? zl+|Je)W&?5@;T|RqOEK--^F#!tG-^U(kniSft+(*4J`Z3&V)=gS@j>;as@s2IuZNH zP27%b_V)B&TFaOHx0}5N^fE?l>0~;Jkh;0oPyPPvn9s~ux~+Bd#-oJs_C-Eb)L5OB zfbEHXz0QZ4%f!L@$x|5P9B{BRx#Q$pzpDZH!lM~8e-6-DWVKp9R@*z`r7z5ndX7R} zf34xdy17V75Lh;N+pY0I%ZmEP0``7{@+!Xz_71zH{iB+Fz29@wx-2zc)v6;q7Tu>q zFnF6r$(mlUc-E{AVFXi1xw;v>yW+0-{_{Ct>1W30y+N01_~PQb%94*O*tzEQd~~yz zP-F_&i`D@4%5-pKbuqmEJya|CYljYDxL&4?Et&Xn84fjln2?C`$YIg6gm2E*5M$`j z#VOb|1)j^;K$Gh+R?i6c9KS5NZ-%wQ=COr1Fcc{H{}ghiQB9>=7R%Bq5wrj!%47)y zG)w}5GWskCh=9ltB11sKoP>E45L5&)VK7jHNw7!|NJ2n{5D5Y@Lm)B+2w^aQ%u|#> zFly($UfrvE^?R>>-23DH`0l#*Ti@R2>~r?1q@-Zj|NmZPQc}Lhdj&=38tJW+5%Qd3 zCimsgi}m-(FGwUB1Y+-Va=a1OiX>24>yW<`k_p5M(Dh`gO}pb#%c}@h@p_f%f-Pj^gQ8=~$NSV3+Fde0pw9 zl4JdS6%GIkfhf?9EepM$WBw2leXAV5lKDeuzIJB+`m#{WL!ti`ACAP8dis6jXaCmj zJ2zu#aIb_M8@vgO?%s(2o9h8q$f${s00&i}4g&hE_V8zqLY}6!gq+~wrDnyqSl|Wq zaU$uPjnvrnA40nOKZKzDMQwFuYY(SLmb$s-*?G zBu|*(b<>OEC%u4P7Ya-N3?%nuHB7uxO=+JD`nrO@;GBXxE^&Caa8<+Ehd zN(k*Gm@@=+tj4b;scD|}9X|(TlvsY8Zd0%|K0#@Mk`#)~7Z{!UJt-z$zQOv-Dl4zb zmJh=8>*^c&jJpdxEOl4I!w1=eACf86e+eo49TkOy-~}}s-;XN> zHyaqvBer{UwSicBi2tAf2k>lvuOTndNUroM$-8a7*i#*yn_3j&(2*}+f7%Oc>rCn; z+oo>oxYB!sKn@Kje+VTYFUe)wB!m$&+%l_2;#5La%U$q3na@I;U=N(@Xnv}F;&>@n zrNWnT9SYtuomy6$TzA)0vr=5>Txb>)GeWe5b= zXV<>3nAlf%gBA$YOX>Bq2bDl!0RM3FAa=mW=onb^V(=TkST_d4@Q<_Pb)1rIkMYM| z+xbw1tQ-+^8y7kM%~$%iI)L)(V~}j#w2mEOAODa$~z+ShMVhZhe-y zBdTb8sYmzxm(H(iU$RW9-LK>|jD?Q6U%^c!U5s!!LTV{$tuiz=bWHoD9NUGSreWNG zVT?r(4Yl{#Tv-u5m9pg{rSTx_@O?fMu7bx@0@a7B^?YcC&zlS>A)n3k zUF4UlU6RA)p8wCu7{{J|fwcuoEpZckb{`}BLuXH29-O^A2$HXW8fRFbHd)kRZHTQ{ zfEm|VqR!pp60CF70e;4idZ$pqQ1;5NWJGy9tfpaDCe zAE{FBTW(4##uPpBJQ7&y-+a(07%0PAZeHq~^IwUrOwo-OWq!vDC{d<%@2_v`RrWLM zCaJ53t{t%g*lu3*PV?5;Ood4g_T;8H*3)i{gn&R1Akf*HN6&v)AWK(dkY)J4k@8{! zSDKI5vh?M3*E5`^bFp;!`byJvL=if_MPV6%FT=DdO)Vxa{SZ<~(KYj>Suw*9W6IGW zkOt7inCI82)DNN4@@-zlEt$)dyc-@d>hBDmj64-tlt;sRLKgQ`;LHd5`xJk*@Fu2X z+g)mY!CtCiigjYc3-1c`Q(xFXtM{9s6(83jhH2#2J5n!pnaD1^on`JP_mYx7%N@^? z?p9P1+AhpMpFyshTg%okZRO26r)x0c?bnUI7UdE+XgOAv(<72A(&zHugiPviDmJ-{%{oUN`%vr@|PCY^gRv+d|w8 z(v%}}ByG&BX&1tcNN&VTLKQhyCh;1{+@c9*!29FzsF)t=QV?;6CUQU;EYd&iA!}=2r}2 z?3P$-4v3}OLGC{ZnoH98;D_*mKgMbvCpn*mDFn9XzO);GPmH=4uxEBI=}%ankOf8s ze;sgFt7I+2XjJo1qwXz%zhv5t%?CtJ#)v1@m!nyZO_H}38bcAO9#TZ69n;TunG^WE z5+xw6=)eQ5?&C|4#!k-2zWW)}cj^3Zl7CsdG^~B*EQPwi%=fQHj>@TX^sXvTSjk;2 z7<-_8OaX|{(D8U_w@YZq>I;#dSa%piJrusB@nJ~qugNc8eS<}8g7d?NgVwbCr;+aJ z2rzXmn-(IX(BdujWRn(!)1+r=JTE5m!mJz`ryB4mwa{!+sGdw6(r)*UH4&ch%m*d0 zZ=t@|4$^=7A+(o1zv^-ACEHc5#O78s>B0ieZO_;oU%%moSOk$MEQmw(;h!Y_-PZnt ztgRp3{RbKRvzw+qbh~VJ^2UN*TExM6cLx}u0CgR6A-%%dCk7B-wOvrziSc^MmDYfy ztt;x}0M#TW7&u3hTpl^Aj1!Qx9<3g+(h&k=0c@S;t(POxe@^K5%J(^$-icc}yOO)r z@Ud=XwJVmnGE-i#O3{wkhJ%tM%~D_YcU(B~Nq{-pU)H%+0`B8 zccq^eXHD`hz5=rbtD_SkRMu!{4w+T0Bj#M>cQnNo-lUgjLB24Pr1z}8#7iMxTehSk zJBkt#UTda&dCWQ--$Ev|l;Gor;29$~wnLFKvg!wl!--|jiz5c3`yjKh`*(mX((1=V zp_mybr(|oLBh?H>&+jvOT2n*S01ria-9Dr~+`-h;<*a&DhSp44bd7s5XL7ATbpm9l#KXuFGRCD&w))y;}b` zsgATnP7)tL8bQ?Q(0)>}8}+Xp2oY;edZUr%7vxl$*`-}onJJnCBb|%zZu=fG3wAIaJiS^{{6^*p>dlU# zu}1$10rPTRvJ`%>W%d)66Y<`D7GqBQ3_PjNwi)=s{F*aK=HU zQ}PRyN|j9^dHMD#M4uD_?Rxa4{z9WPKuHB66VpDl0ex2^53KYD1aO?h0=#gsfxNi6 zlWj9^X*T_CyW4S;J;%hzrfiqU7-bcrqEIrqb(IGqm8q=G@l5*yHiUJV)(~l|GtC)i zg+UT(kuG>Vh$O#|%9rYT)k5@}p=#NV*)^7X!H#J0hPS*^*UBXJ}p%qNdGPhjGlHS927mmRx4>*ChC@F^TOI?!`kX4gX-EAd_rNe@tSp;W1nkJ8!7C#=XL zE?*8a_c%zKkG|ZA{e^9h_M#TAgt6S$g1YoAM=bsGKt`+PxnG9@=@G{hdL&P*XN9W$ zOmS!mI8)#_rW1v#pD3%Z;M{3AY=EBOp15W+PuA7=tL+1PwY{)y7SBRq4Ndl@GRU4|cXZyWLj477^1A>S;dh40H*~{ zw)4mNN|YlQ;*d6}q#$ z_u0(9+CuL)Kir;LjGs@-SF2t9*tp$@V-`Cda`}FH_xekm|LJp2t(WcL_CT4n4dyAf z8>fUA@oI>X2fBF8+Wv@_D&%sexshR?g*;A~kgEVuPeYWT(U>p?nagQ^=!WieIHj9RwtsF@= zieKt`!Z^!wrK$N;hiDMtGYQ0ILcm_n&;ItO>O^itC@;(Gq-Cms2Eb6f-&(esPz$Z< zXZnB;ll9oE)#R5os%K_qzjdB}S`!)YvhdNyvaHJnMJu3Dz3$W4tq8jthX{Zprcr&Y z$__HH6q`IcVDx+g4!fF1l(KjrS-x`%IGjbrzjL4Ud%b3VwnJ0x^WfC^&$@Zucqd!R z18um2W!<;ca4^LBSkTX?H=>Hu8vTOQf-V5KER#@<0N{onux#}54rX#QR3(omoXwYf zDoRL~D1)2pAb$@yFk5b287-RgL%z*^XDY9jwm=+b|^<4EAvABZ#&cSJ;j z*waBwahG`quV$!AV$8Ax5<+t!!NlykMbQ5{%*h*xJ078)5dY@g#RF^8_hk=Io3SjH zu~01aWC)|n-NCUQAlr_ES^CO!1a7HI#ThEdPKf9S-gH0P;}pSn&2kx4s&nlgiNJxY z$D=a+1d;j`|HzxnG2VOWQ~UnC%I3~7p)L#kF~DlJ<@tY^sRIC~8E8E;PNmiWTyvR{ zDZ@Xtv_GUf3&^R>K>|bYBpvxMJAz|3(SNQo3u?)hkH<|Fl=8WQOXg2#*PoU#1c8%)_bUf_qwpBh!*J74Cv0bnU}to;%J#`afigt>U1@Ph>*dDP7{L|0H4*>1WE3-f4UIlOguFzijiT27x6QB-o z1@P0=D_5=n{`2|y+D})nUk>*GaOLVxSAYKb#*Mr8uV1-&=L+D;WtH~Y!^hX@xJ2p2 zo*CX?;QsC9>o?*?@n1`S^fU7CN=TVlc_DEFTTCj(V2JzMgv9Keiou~7NoyOAq-}Me zw5si=+_LgVd}?;~p6^2Qh_mywm*Zddd-c}!%aQ(l7XLoV!^fi6o*B|{iCy;pwSVjS zZ}Fu+X6VI@tQfgfvKe@ct=$v08!kwIyH^2#D_4HH0#F8=u>pP&`_F&z-xRLEqJPA6 zS8dZg4)6EE*Gj$Fmpz6Fo91-7xCKnDbdZMkDEO19u?s-wU`V3ksAstJw=55wW$bIq z9)_z0F7;Cfz31?>(-h2)@d9dMa$YMNghQ(7u(X-0Hpa&wb9qES(mbLDX(%$09;aah z5dCka@-O~$HEqJfGRs!);r7r@rP*z12~dz$L7GUHh; z`=}+am(S|)+Ee$>J<1S61BpipleEX?qpNs_GZ!0g$e`MAXKx?aStAr7^c9nQvvn@~ zMhj|Q(?>srQ7(Lv1;v8R$kI)Ql;t5wAGe&oAw&??83)w)u|R14c-?ydAMSsTeB&?Q z`G%%Pz^y}h$k7tR>CAI~xnHkL|JUjLOZDfoFxB|QsCUI)JGGfT7XV8kc}-G=iI9-Y zPHzv4KXwd=D0+R@DC@pGau#VErbMLD7~yFPu_4JJG?{v}mKN1*B_5dz9z^pcp%EAw z)iuXzO3(bYQAjY!QfRT%ZEUkn-@Hc}QZnR3`2mM)9d~qc2)vA0LZ4?>W+J!BvccB* z{$f%m3ugfa2}jUB$y#yZOjfd6CODRJZ<`oZ9ru2Q!ldEVs_Mv1RAFI}Sy`I234 zFj=h%HY<0E2u(BnHqaVhZonho=7Y#wAL^%tCO-s00dKv$(0uXsdAe8 z)`8+K*V}*Gy9P6je)$c@%tj}y#f{(^W9H(ebZT%H#gy49?U$WDsPu74ZJ9x)5ek4L zotVoWmg>y;{|adlVwwb&Vz$5yA~FNh=)^C4XJ)h z*c5S~Jp`4_C{wyaDy@(p`R%%(o5ZK&Og6IdI~i-nsI3rqy~WGp5HfCfU(yhITzQaQ z0e&*n`+R;OIItEGpi+@3+`?b*mS;i@$VpRz$V+O^OX{fH8|{=50Yy1#f?QeM1U7HI z;CdNgD)17ClhiDXOJ%EA0$Dugx`XjdN~#;(z07;t@S}wtM7KWc2EisR#X8{(3bf~$ zuYZX0_2~AdX0R8q1{^bijW!Fdf@@(S{%D7MKkKATfz<89Hr69D6Lj?NTgq_atrY#WOI3xp{bHe&%$cuz(sh|h|M?96~VUt z!p^WM=N(&#;+(WSKKAJ6vwJ7&a(RhmQ^UJB5}|;1QCC?}m^0j3!gI6f6%|oT64sBu zW79cWNpK8cd}PabFYHz0A20iNI*qmNtD<8>niI0w%A}Uj(O4l_f$Z*P()SAhF{WUM z=%TQX*(mtSYIp74HJUD>DNZs?MTd6~TjBc_4>@d??zEcw(Pa3nbTcYrGvU#;xn61Q z4go5QvXld|A|ah_vJi+L8s!+RBuFH)<27(Xrlh{rKduk|@;4g)Pgj0s(_nZ^5xBLTRUV{fy-i3kT^KpQ+q$L-QLrdQxvyi18m3Tdsl(cs0lULll=RQ(#fY7F< z#+>OgJnVF>&bE9*`>=hTOaEYyoABGl4mKm3Ts{0-V_3yL-mHtOAeJLLh=-*M8ttRD zz=>tRZuy*s(RC}j)xBj8@Xc7;pnb;1|0g;3Td|d*u=`;BTOLo50OVkmA31{PQeCsHW<4P=b$5*sz6Myjh<=a!??!(hXHp(<#C9R;-+|&&5R}c;2GbCPy?96Ks2k z)n0HdTX)_n%*Pc4;P2;8$0|+KIQ*W#OMH~w-AxZv_i`?Egc}M!dgOA-fqzF$bKx*% zD&1a}GT>T1n?3XvS`+jmNXc2&z39gDlr{QN#mZ_6&x04s@rK>H=p-;fz#C~= zowl0wUeQ8j?9T;!=WZgrhGw7PJNJkeNTM8~qa3Hak;g$d9?(jvlZy(IH>!XJ z<7VmR*d+}tcJ2Z&T)pDxnx6IShU|49w_dBU~B^LoL*|I;@19}L%mMTH+TfC3@<<(f;cZ9P0B<&Thb z`wOHji6-ylFA&$YS49T?2TMEgrP1h;8hy3(#UN**p}{?KnlSXE#b^T{w_$g`8(Jh6 zGwki<S-$8*YQ@@QKACD)EN2^0b2Pkh+_tg6*@XA$}=Paofn!oPc=25lehli}85r_u!55 zcC8p)1OK{2*QXunC(ED}*#I2qd#$N>p!cFZ-=y=pkxf!6 z^#WiQ^1l9C;+_Wayz2sRE950`Io%u;ecnd}t}K;OMuwttHJ;CkxL56cS4m$u>+ZnQ zejV&J&1zB7KvvgN>&LQYMAmuEX!k?Pl^ZNawWz>uybN}WkMp$UJf2b8tk6z__`7p3 zW`icAYeDtsUi=uzZ}XDdKmkWK{(J15fmu@v8hZ&r*8=i#t&!NgLZ{UF>TID4z-N1S z=Z`b;jZAniKIpmgnYpNPi*LZb^M|Rf9)`teTUd5MLzw&A_q$tl{H3~bn)3+UdXQ?M zCP8R``gN<-Knv+^+?z_S&dwIWJm&OU=G=-30iWKV1^!9;Aa_^(Q6`IA#OfF8)AasY z&J+yBONXnt0_L5aitm^Y`x@Qsx}lx5YA+z=kls2;5GjE7#x}`_uv*YZHV3w^QjVin zo3>QFKC5MxK(ZZE8eiJb~`o*0GpB%854&;&(c2 zZZ=4xfZQ(tqII=Q68BA?aP0@C1~%*WkeeUco{bUQK=&1c!uy~UAf#8v;`TtK9M7a7y3GI};ve>;<7@U`}#zu
    NiWzeT0w4Zw*-wHCDvkv32VLG4Wo|VZDKaB#f5w!g%ug-8ifjhptzJN9c)p zteeD>t7zsd z8$+#eb**Qt=`q9Ffwl@QB)*#{h8r*LiB=Vlc@c^elg0P8Bw%W1gPV)J9lh^%5>b|d z&XdsDK956(T>lFI)Zo+m73;Ptso22b!vrqN5s!TfyBncatUW2=#(F%(bBUfQ#{nA- zm6W>B>yM`ge=4??lh$tBL2nytM`8Dbx7oK}^vfyKi7La}Z5NyrEz?+5RypF27J+NT zlpWha3lAyst@Rl6l*p$>n^V3GB~LY_$%rGy{HgZY)DF#*!$+ib&S^3e zKNW9@R?zR8W`Av1oAoboX;zIF`E#KRQJcIlYAsU+Ee_!iXg1vpY$z^UbjqJ_A9ODr zCwhFXe2WO>8woyc}?yPmqRnaCv(dP|fQbY&s>1x{^E* zbvOf}zPq}#e|2)Th;{k|X3HYjs3obCA2HV}c&YF;R&u13c0>9`Az%C$#ok^|9Zeeb zf)ju(aPUdCf2_MK?QjCHKt3n6Ube4yqr-SX6RS4$2sL}OPqDPiGif_3+H65yE-%2B zP6tW`bJ(``_dZ@)8H-6sz^72rMaywcjD4WIPj#s7R!hn8#(Jk)_<2j@WJ3(^jEluY z>^cE>c>r`rPrVEAw~3v$jF{BSR2jx|b!~_kO7Sg(5@33o!}B|5%!D` zeuEYK#sTa>Dzmk%E%zM3PcAfBP9%7rvlC`EG1B)MGIizkqx@K1X@;*wT_sbMXy72e z-#KdS;1H&7KXC=qW}Ufc?i~y-8ddy0w#+I$v=F4jv0n9rOi$Xa{yZW;YD0y@A@>Je z6so5}4c}NjAU0uGX9A{OpA*hYufFIcYw)eKDOEV6tI>1R|*M ziHLE<3SA;DgOHO$jJKPxCk1mYWd zu5p|vGe&WGsfGD$t)ei{T8Ocjr3FiR%n9dAaG+vopNqGDlsB%l*@D$Wt2Z4L%u}|j z+TGaRffuadG03`;Ur@H>Io@k+R#-R1bJUw`pwr9c?d8%%kp~+4|Bku)DKdFg(=ICe z=3+s7LNmAFdVH*gWH*>#Hqmcf(RDgf2D6V^hp1*;6;h+`(J;`Eqy*$m5O*z*LO}t- z(Kh(012@FC49r(A{d>l>lM7Q#iwl9;r~p|ddV&Rmp)S7)sLD3grhQ)zO3lGy;NF4)U(ajrwiOyf05tWD(v@dzwOMTYS(Qd zW3n#J(Bz1>pp#wIHHL!Vtuq%uDHowSshApMjh zN9|c&p$}8LCnKIErO>6s&t6mbz1fd;DZaF6NwIB`De6E~pD2#Xl=HRV=~Y*6n)P|z zGB=8zMJzvdugpBp3#x|pFP|9)v%w9^zAZ_Gm5yd|QLE*BY^+)HNJD3kpgj7a6%mG` z;&mfRw~3Mpl&ujzZM=OfScR}pO% zsr;YoneyZrm{J|^zinvF71}d3r1!m35RPFe=d*Ly@JZZW_?(0aAFc#8;G`4{X_#Z1 zNNoC0kaYlEn=W3rSPcTv5Te-j2W%7$E*C7YMCo7KojdAVuLL!OdUv}nm*%C>HZXH& z?npA41y~q$RCY~u3M?n#;swp8iA_5Mp>3bW%|F6JXODuVerIP_E)%(~7@x{STPxgVjP-KKq6go4VQ_zMrHDbfO`#uNPwGb`Hdf^UG_V zl*uMw;2CfSJG1Vqe2A6i&0;izB#pL)@Ud@kHqfo`c+=6_#Nr-4)-yAas_iA_XW%4u z&l`B}j_=X@Va)MK1VpANk*kuEuh;V7*)>~LSlgu=U(flaB%gCtvqb6G5nGf-J5vbm z49GD{QibniEEmPU*tE}+@4Q|m=v4SFgj0!!h&DCub{_v>At98KS)#uInoI@GBW0>j z=u0(9Y@Jhu)?XU`WWYJYSD2eR_I?)(9^i@0_<;OZd>G(8{9P6ajG1pVj~Lj%FIueYP(nq&~CRS@(vbp&`aKNozc#^KbANn2_Z;O1|j}A5krR)n}#W zj{njr07_4Ss9CLK2u5LS2&Qg%$l!b2tO6igeUTuS=TVC~I)-eewcG8i@!JLu7d)Kt zYHIr0roRu7(yLS5VtJ`eoXn$HcghA_wbkoZ{ zD3&?9@U1Lr-lkM@D1gU0zS{#LoP?JEQ-n(AOEh;4UEs`i0IC1aO9-03tSK}f7Z2z* zyfNE7pyP%wd!B!^Xfe}yXwEy{b~cPTWL!G>7>XKR*(P_P<%Nl{8*8T2_Q5#rrfy=XA7fFl z&E7|hW0^olk9LjLL_QU^QTlmP4VCYrqI^%5|3%fTKd#+Y-ytuJ1HX4W%6q7c0+*Pt z7p<$DSx|h`erq39P$t#9qLp?Wk5~;_uf;X^(BxIwsjzTbD&|&ztU-Q-N;U% z+?4FiSfsNT-09-YQ2EGXbt{r{elqC=uc~vrh@Fj^1;fMTLUj6xp`pnA_8}z1*MyhB zn^Szn$#F7O_631F4+i%edV&Yz59_a2yHYR>>;{qTOfjgS{^EW+yCmep;l)a@zRqOI zgYS)nJDEeUxf$<2e=>gl*9GXGDPMV?sKI2hviljn*9r&q^sfcbioJ=R@$yYt`a1VL zjJCQv?W=}9g+g&2U(V_vnN18I4iM{&j_S$7eId`nF91lPtcU`N?)mG7rt|R%Im68~ z1r(a(`-1SmbK0ZcKjmYTmzIoa7WU-$KYtw>EE1{x&fp2(e3n;Yf^uFg%a*hrJX7Q~ zFO}nGh&>STXLYm_XBEw4gotkqCLm*-J})>8f)_&*gtHyez~lg+)nOXOm814iucWJu z2PA>dZan_FKUBp>I!ZZcat$b3atV3p8K-h^?QXywYI7qpsv4O?ZTIGrC~A5)69+v4 zEi3~_q3L^7u1AELorABB$S|MATcNPg1nKDW7GFKj?=*^Pk*cxOVej@oPowtKh^7)f~)@`ojldEMR;G@;O{GhnJa`g8d3^uSxe-a|OkS$zT$@g*=mlKY$ zsEk-VSq3ck{WI$IpR~T{7{nsn42^yH&{^$6^-I0EIv#F>q^|^Vw%etyhIu%tVn>%- z$AUhnYGlhVkk_-kUF=xHKe6<#pu2y4MRJz3o<*(4&IMpq?UlxqRzjtzygP9EjK@dT zt@pEnY&tca6#d$^qC?GzwtwZ_P&ZV?@N2r5zWT#`y~y@^4@FoqTTKj!bN(%M6^mib z7WZvGWutfZGRspU#9agAgcq6~{%D^c8G@z^=Cs+h+WLIiDN)!GPQ`;orAm#3Es44W z{dJ^9u{V@ivpH5neBgJ@-+Qu!qr3PIywQF6le8yNNnBb-`g8eh!GdbZyfS{u> zBWydr(Dxpe0UhmiDfB-wjA@R=OJyzqM-hC~UOu|^5B*YKv%(jv7maGWJ=lu<-4{dS z(b>F6)MgrWbPVRwKK~^j}IM|(9(t<{tJM|pFDhm&Pm3x$>foAU?1e5(wvl<7)wOPYXYEDa}i z$Ud{~^F=%Pnm?Xd#oqL9KJEHdh0mGj$<3Mvr_)+jEVSG7urz$LcGhfQ>XY-w-Eq_M z_-pOR&Se-K3nAXlKycF(sa`$==TW$B4RMlmu50FEyzjchB#zIjz)BgxHT??{)Jy9} zYdfcWwF??C0y}&DjvOPF(IU6U2MDYv9k_R{n^L~GC_A_ZQQ9%WS6gW1b$4{NBUyB} zlU;GoCw)^rGW%2^T23*har(q@03z3sz9XF_p*k`rv~^&I5t$qx?>y9~4D{N3^?uY_ zgT5rO-B|E0VbSySCJ}e+G13=4!0&)^NJ&b#IimxFR6=3Mk<=5tg-VX*V*9`(@@Sk3 zxHpGJ>D`Yr2|vq7h?4!QW0^#d8!4)WsK{?Cr_ILq?%s)df{drh5}pC+X6wFMf9omZ zQN{OHR0j1*9azyHKk2;q2W9yevMUzQ$Q%)N$@H~=0tvSPbt2;1%Ijm@@`_;RmCLX4 z9-aDq%PS85{r`7z@FUM&2H(7w}N^oKm5fdC2TyE!rmHm0}L*7?&uCO*6R9 z>DHOu$RRMdG__qU1u!g65%dT63VisPSvpy_A~V9`8&im%Rk;28S`E53E({%&We+4c9m-*J+T23o754%qA7R9!yJc zg7m24n8b?XX=M|#8`f;=%}!$3rA5#f4r6W#)!R?JD(HN<}*X zHyYE!?d^l`J7tO@HnU*(CQ<8wGme!lHe*K*y+sB=M^jI2M})g?5e(TobrxIilh*Xek z<-|h$&)>?Mo=5l(r=)Y_7$+Nt@F)3vT8=1kfkuS=PWvMK3qaw!WV^&Gyu^T%6uHNp z%lz(->*jW0f>Rc3iv^#f@cSZMY-w6FX`gv~wvluzRb`@Zf0fC+S91-aM<+*RYKhfh zYdfi9Fyj}CEv-E(k~3BUvOzJ6E+v_ibm7oT8JI8VLm}|SHj9BHerUj{8Ua}B2drob zx09|+qpx#1$=JZS9tLsV>ThM`ieaW>X$ctKkz?l^J5BMf^qYyJxd4o>B?#;8V+D4> z;FCChdlZ_%Xeetf{Kdcu@hxaa5FFqLy;*$ zpqleh%VW9f0EO6|biFCl%7u0bX{bhm|Bhcp^)cd?g35D;+3wAWEZN&GUmCx5FW_VA zAu*Pbeu4JaYJE0BhFM2~m(HxcJRz}VuNuE4BWAnj`P0u74s*Qrc{`51Qwi$%YEeS| zU3T^CJw5>{MAwlb>;{W#SVJ z$EC=?`d~y{(L^kKV+cN9x_4Kcyv_fr51o3lQx3@AUGTd&+BT zL$a?s&Ew(GfGe+}*rpnSdWgZY%^@;i_Q&1pzzGU;E*-iX`fPaxaO02vS0DcImV1(3 zubvNR8ACxS=h-cJEC|2EVTj)@Hszrx7WWo#kNtAxagUF*-l9x>t6~xi!{J zA)}5rX0R`KjMXBzB39Mq1RHG6X;DcpDm!5BrJH$DIDTm1wXiJXh(P2cd*fNTYfly| z<5cdgUjV8!&bZDa+Y!ZyrY^e%!ppH)^|+VXBWx}-u{q9Y+e2o@>DgUpihL3^P|bWa z2Q4%J@~H|st*SG+eh@N|a~>a}`eUC#wvOm@0f-hE2t!Zj1wFDSm<^R54u+%;G7YuH z2NTW_dFNa}ZS>i~8Tyf6qD644_}~KT9;>fXm4fDq=LMiH@96vw+$$KRN=b}+F+OIt zk@Ykg*cFC{v?JYL)>s@1XFX27F#?RN6;LL}9kI!QL+UxVWQslarB2l9`{fsnuO)cn zJPd*UTlEGXdfU(3{hG=>`xJfA5OSL_L&E*Z!DDo&f!+n+HPe1w{9wq0+L>E!XS>!V zRlj82ax8pJr0?Z`>BQzAMP|tszOe21*MjQW=2CuX!%n`QwMb93k%4@#MiIW=*Xv%a z2E0NKO9C-9iBnX%!5#l&^)S74!GuZgoLZ<#MotEi{y5Jg{iMWRJ{9Hiu01uz+N&lF zsVKFymq-b39~>QQmO^ekTG;6t7|{rn3vB-2uEcCADB|fZ+O}AWA%f=%Yom;ww^fo;zt|3GIENcX9(aFz~xa zGxR6D1Ebop(JG5(m{^rdyWdV<#ShYvo8>Nd_}pxqi)7uV^x%(&iS)U}<-a4v#|tS; zXF>1F#yPZYu?)ZvE9Lul|F|mk%Rg=<|Ams~PD508|F`w(?iN4s-OkkR&fv~*$=bTa zMdU+`#v0S=pibr1UC$ASF*(#pD$SB$R&`t8oNhi6joj98B4 zSUX8FU>}!QlRM%l1_L4sBx+2Z8XJzMcCyaJPhQp(TmU|tk4{4MB8-Si%|KR zzCVH`#=jDBuq{BF+NB|8-|%FIJcVO0o)IV2DL*<^SnSPhJe8E*<=l%+yuUR>?g|-j z_Q>xj*}iLDd%_TW=K&dH<6qtM@N(L4S?@f6_#L)oi7x4cY!&S1 zQt$btoL*Jli=*Bg81CN|Z!U>EJe%}8c|OJvxpDe=BW-|u%75ml^v-Bj+|Clqi#uNO z&gDqdI+=1?8Qjy*%01hZ-dmya1skj-_VAFI4Ng|wmcAD?&ubM9D0Hm%?(LSPXes#B zd~$Wo^wD`ihP=@Gg;;Y`EZ=_x=uS>I9TX)dmm;%;5!ciC;r;M#PfzEWbs7* zZK@tc(4Z@}YY4J`fMm|eRx^17O3cyh+_ooBk;;8p0>?oA*x)GtqdbqNBs0W^_SSlo zr>RTFur;=~zb#Qwzt8moF!tFMbIJ`o`dNN1rQT=mUcAHDh|yWW{nN_RQ2p+ZZ>u4X zMlP=;8xqPLCN&s0Z#R@J=!nGd>YD{0J{=41+*jE6*wQNf0pyd0$E1==@(5gL-hs19 z10&i3wh?yxcI?r9IoU7VQ$Mc-wG(Asu+-OAqYF zPe&B}Z=(Pp?vMXsb^mBp0%ADuZ?0N?Shm7gnI4PsIM%Us_WX8b2<=>cTy`gtg**=H zq2}O@*dliirip$WK~vo@kWaWPlN!J}y>MU@x0<#M}=X$%tDl8*l*LK}K8)K-*@3rXhBEO3w%uatMhfH}iuGo|3 z-i+me<{&HK7Wt9+y1__0rP>d()&z6!^ZRuIam({mJ?8|!JntoTH#dR~w-Ok4#w4Tw zvpDI!aUMy2mTz|J0XmJHHL_bS6#)V;g$ZNd_Y#Y0S=^I8(@2 zp`YbJsO6iRWy9?t_j<41uE=7`&hoQq zn!MuPvG+T1nMGJ+*HUz+n)HHsjv}@+%Z&2t7Ap@#MAB0P)KaAH2aLNZMiA>!44R#{ z?V;)!8E~yN9uq(37HFS#!py6knR1r^5{YS4HDznhg%E2(Jqh;s)X1}Atd@r3h{2Zz zTU`LI$BXNecMri*N`2OTbV}Z2ok>_zI z0Xgedi0NEu!jELn-MawTt5J@@MPr^?PbONu0_|bj!`h}Z_3O*E^#aHM;K3ze&oX>z z-I0ePlsIDPc&2gndbDCaSLl2|7yXwk7_p* zi;kzJ)Ncz;$ZiW`Rj`E~g1~BRz?XIFz3#pPUiGN-hI@**zj2CeoO4W9vkracI}eWK z$v+EJzEVy{rAk7S>K`4STma~GKU?_={ouG=*=|=~q$wYyR6vuTX?zd=UaM%>`y)Wp z>L0bqzeg8t`u^qjxD%E8dFYw;g=wdw0GvKNPOEd+mv59x2paN*Ifl^Oc&5KcTEF&a zcSJhbIOB%odyi5*t!tUOdc4=GsM9gf@P6q0%Fsvfe4WLfUNCGIH>d($uH3Vq;pBru zTR17lq+QnT_w3QW#k&K^PU z!e|vPTROF`sJskDU_0V{+M9-MhG^SAp;_wDg>)$@9g!S+gUX7ldmxCE_zJ>#}9J1gcb_7+e56i_Q=ErD-fnH!lDwyN~Z%_xlU1TmVR3 zmmxMF%4zk9^-j{%k$0ked)ik0cumPT^0Xb^w!+P%t;wn2(ZfCeE`ma7BHM{|b0~%}CeJ!- z7VKNcdM%h$UVz`;)nVR#%@b_Fzyt<^EwnTmwhw2O?o~FAW_INo_RoqIuW*pLmVi6 zUlZun^T8#B2x$=z7p%%TsY(mIp0PdNW&mF~%(EWyh?Vr(HyS`1eh&z_eLku8BK96M zTyeYwG*eH&N#F~rv)o!-tnz1tP1J!RhOMijmJHuTShYKnqSd#?uLf2t`ta3iRzxna ztvOo#R+0;%Bi8*q4cRo7n0=+s$Q^XukPq$n$#2{FyGqX>HzPjk_sh@&a(0C6i`PnY z*-_5d)8tt*kWYr|Cc!3z<>;-z8y&ELSJZrnAy`jOUL+y=28L}sFBwdf=%eyY3`=1j z#-^Z0TCXxmD-lXiA!;Az>z?WPq*{VCX0Efsi}hDI%sz= zTs!oQZTpx1Pe9<`bPe=6D5F7?(i^k2>W|{z_4J$S1?gj)2>f(W(hkun=%}cOLcA&{ z`0LX+a@w;CfZ;6XT;|T-AQQh*-!~`+yWBX_hzN;AZ24T}_trP_#iu-OE|u~#W#>L8 zXO5*WKxG4n|CTqAxijiT;{o-Oq4{0s(D{yC1JBwV}=ivTK%i*3=Ci0OwABx zhscPvTmTA6%Tk15eTu52p7AQ#>9&d<5{0_PS^U(g8=l64t%fX>Ce-S|A&B0uRH!V) zyuT##(|)?L!-0~8puV=>&}nVGWSF9w8><1oBV>p)G_3+Nj=WdXzCb%?RQKi zq1XGYL29gDbIQ>!Ywat0SodIzbyT~Eng{>e{c4(R2pqe5NpM_aK<#%M&$7`Y0h z3_Ia$is3Hq-r3_bM8U$SEVt2+TVPgb!dq0v9j3`ePvQPV0r(or)LJ&Y6Act>iz;YZ zj7v8zSeyD4l{XkEE>8CTYWvO@Awgy{y^L(2AFaQGeB?F^v*f{jnh*-B`k)qQp5{m^ z=?*g|5f0bPPlR}FC4)c$4hSyPo5OZN5e?ihOb97qVfg%eYeJPGJq#L-c?B44`kxl6 z8(o#d^|rR8$ZshJWxA|%0gtGpa2LV74>>VL-IEQ8lF^_#9xTi9-QhAxccXR z*X3W6E#*}Hnupmx0Jsm>HWVZ{)btzty7~+F`F?IVsrO4nXg^I!h9olb)XgAwuG+fP zi6KKhRcbuFb&XTx2Z+OT#fDeZeJh2Z5p6Lc?6a#c^;n>^2D552)w3}_II4oljV)n| zJJ+c;)GqSQ^XVIGSm+}5Hj>9y>Xk$92xub%oylI5;Z38E#OWea0jcF|R9;eos&ip_ zN$k2&Sy={bA=_ZCpvQYqg>8F2rEqcLYw?$a_%$R$zqi~(?QNaLlo<3<>Yl%?ySLNI zFGB-@{54_6!M_cZB=XKj$^-ZM{30Myd6s18z^q0!rC$b!-xK zgp$)3Cs7m01l|}3eKh-gII4Hxy{wgU+a+esPF~})?v%_d_AWAjF6(_9F9JIA*OeuD zSg<)zqxeNKg`6v4rk5Mqrp}m2t9Gz{%>IiY>&q=OH6bs#-S8?gmMB>1?$quarL7NKFDP%Yq1_5LEn)~009dN}`ioc4a zEeP~DAo8l|A4)?#k6=l|!zXJ~R9i}2(hX(POUxskbz3jw0wDKc`4+RI*&thMpquiE zu0m`X;O6G9|4si_|EfrTKcN>g++3BoWr_B`t-Yd9CO!ph@$^kCh$aJTaJ8V$B^hU{ zyq8}Rb$gKRfePoKEIEoEgC}*YSPqsRZ~+J!PIa8c(jW5As9~EqrD~m4(-X^Qg?(rb zMRq^+zZuwAnUu2B0G-#bnxbCCVVs8KS&)C$E^M>`Sgav*9TK13Zyy`=t5LuI73M`lYgwrSi; zQxoIfQ+b{g8OMMCeO}n4s7Z8dkNJKrw{XS2bdwN7x$!t>WF}N~d%Bra$wV@gUj`e* z3l_!K)+B$6R8&&OW^lUY48wI;?Gg4fK6Rzn);+~+ee8KRFBQ~|DS&QpXB&ii>op1r*%Ih~Y z=t>wYpoH9bIp`}-TCM#|x{2~B-ga@O*yLf|HI zoRYHv*Rr4fJ!QBZQJECx%;K!~(JF(3DTl3fMp7@8>h}ORkqHU*>+(Ad>;b;5}>62g9TT>!8ANzbCYBc~& zqeC`cX~&r8aTWJ-$MpDP%p;N!*?Q5A4t78Co5rs5_s{r?b_LUc$FKz^3~|2mvwCJk zegEakJFiSSD_*EcM^nAI4OIAmuHo05s0!s|kvrB2J>5-1CZuI_1j@ta#W0hSxD+i7 zuLd7bzbOI1r$4#pG8oxaXQR)zidq8t(!DWc9Cltmk{GR#IcMTy*58Xo44Y_F#gJZA z9d<-FO)><|Z%TDm`0{XwkmqCqgC+34_JVs$Hj~CNSoU3MOmLaco9pEl09hI7+0+Zb zxfgRETg52yoh2(Fh9-YRms)9Pqp{N~cT zM#^)P63k@B#aZT6AqWh_=%8$T;C=dKu7C3dAnpQyQP})6eT8B9?}_I>+WyBBM7gb&%~^EzsjUXwWgJJa?cNYOVf8Ra(mK|KPJQTB z@yN{*A+4Rx8{dFv4sRP1rm{|$HNH(2N#w<+ zW)Z~))j`p2pSvbm@b_a;=*4U)Cx?v-fN9(8BhOF0P*-Bzapl5_!L#wrw6r8kmu@f5 zcw%Gx1)$vr!Ou(k5t5(h;!+`;t|K2O#rQ##q$=hB*C)KYt?tgYR4ayP-Sx6`72P2hjJtyP3w? z%wPCqe7{*WqGcJKx(m4sXQzX}o79A!JSBCRp!mO09R+NCQd`J6*%kq`vIqjF>X=I+ zDJZTG6U4#r7Frir?7VAL*05MA*%6}+HCyYAbZg8HjZJ3Qg%M}_6Z&5S{lY1aYN+Au zg$R~f84ikRVDO^W4{T!BJe@pVBG!OB1oR;ae}7E*7CoeY2z;bh(8O)KYYbkWhv6p~ zBwx%sRn+deBQgp-;d{Vf8n-W$dNNJ#`LndsX=-NcszR|H$?AdbMuo2ngWz+2u}X&p zf5)C3c^IkP#^8n~4IRUlsa7mes(`I!O;jLEl-n8i*^Wt^Gz0-7Kqv;6Am^vpYmb7N zz)NS(DLkL57>XKan*8qx>Uf%WMa7p&V#qEG<_lm5Ec2w*o5pRG?&jHX1?N7;<8vA6 z+aJnqiH}fmiPPv-kX;m*;xreC9>Mv6%%h@`)znmexJ1p#1mDmm6OfY_s3YRluo@vc5;<-EoP3qXy{bf85uMTRJ0flJ@@*hWX8N8 zFv-G*WJrCn7VupXYAdEZh|%;_YP-~%ZBdJ=KYtJY(pNrIeCk=!XxHVQ>i?rDa`YJu$wL zQdpvnE|5@z`Mg{H<23;Af1F--WW}Rk<{5!#mgS0}4B$OXR7t(}=plB>XoGaDu+TBG zpavT&0dchkGX8j{_g-c8$yP^rZla-BWOWLA0bNS6&=Cw>khUy8Ek+iaEj5jpi6OX= z#pgIgKy-BCifn?_deZ|TOq&Zo^0qAq*ZslNfiV|CwXYDe7UmVC7NkGod?q}qCwzZj zl8-lPkUOWvqp8)XX~^1~goARE(ULEQ(V(4qa18fUmbRpt-p>#9c%HVhu5u*k#YZl% zBUw{A$;e_IthM1iubt8rU4!bwB$B>NmKTfjpH^Oa>*^AI0+A_ zSJC3zVqHi@?qgQp!H>E@jvx!5T2E}|b+ir2CAqylj~IoHDpu1S?pVW_k320BxXXeZ z`t-kQxzeB}kZp}`#*yoS!;Y*YtLzFBR*{)uHwHx#P!UiF0YU;o0x0Vp9Cip35RiR_ zNXP<=1W6!lvhN^-07+Pe#XwjEAuO`IydSUL)UBy^t6tUn)z#hA)u&HY*Xi%;b3Vtc z(k0g)zpALfBeQzD%SMt2BtaE8t&anc9bcdRW%|!Le4W zUnQJF1E^bDQ&jV?V#~=sZe6KfpX$8x(n#GmYeX@_855?+JcTwgfK7wLIl5K36jp?g zqPEX_fAy`H7uA=m$EOxMNOHxj=<#9D9>jtH*ljU{J^B5@km25<`dT5) z-jZoZ4+&-%ZbNaS17`Qg2*t z8Nh%=X@*&>;*fdr6M8-nh?^F?ial7=#`D(-)``7BZdzhE#V2Svjh^RH~bHy+4QWagebgmuX{?zC=*EHGSDf8HjQdJ;J*#1EN z4o67PU^qAT`m!n!RTB`K%>KL=l65h|-dk&n=m%A7FG&;30W?btUs@JF6iC3n5md3* z@@HMO4tfeTky3#8;k3bDtdgC2lNr^j`N>(dXgTyeNgK0ksTyF9u1?$CYFl&xLKsTel zb=6SGi~xUvnYgDRHYC_md)&l1!~OFlF`Mn@2>Oj2jg}Ze3|;3pgtwHehS}X&Qr4>N z<2iX|%jcr)`7_HYRX`DM=z~CAyO*H5zzm0nkC$+z1&uN^|9)C)8@5a|%FS_okg`@8zJ zYESt=RpzUpcKMDeh5>dk55sT;HoDZCu~o$L1Mu%&RdP1Py|%`CYl;nrnze`trh5jo znpm+am=>qNV->bo|9o+jhPa7J?RHZ?H$RX%PkQZL5G~#y_B=bJN$iNtpVe0#Y`t(Q zbgjjyW#3Do3_80d<}@fNh$#EhK?~)VVS!3E*{X8RAD%TAB|X_UV;93_S}JPe{$K3_TwU?X!0O{;U4n8I*s!0 z&e|+I0$!I+#%Ch5FTm6%@Z7xDg_!ttfj{c(01<2z>CAwt0-qAOFG_XopY}F&8J{Pb znv}@V%-`KNi^ivC9bNC!RszH-4_BqSSCl)iv|e%%ZNw+1Z9MXa=1VuYs`~<5#%r?) zxE1p~1sq#=Z#FPGx}CPIO={M&CIs} zq#(5}JGKhX@NmG>!TSqv)^1~gw&MzIS0hz2$O<0rpn^m6tV`Rr?Jyf1!hH(jpXj$~ z71ehI-%h!iGPxX}j#x{FI6-=~*)^s?F^w4O0YXwzy0uLW`1+rWr)eb;%bzV2ms+Gq z=m`edptlkJ44)pNfrGTfm2r?3iu^miXO|^jIU5vwTM?t-KrhE0AQl^w8XC;@A`F1H zv~Ab=GlQ5pR}>9_HsF08aqAnvWM~xgoj_K`J#+A9F$i|`qxb-=++_w`cS&_df7s|M z-;7iEI@<~*xQ#4c^GZ1#)=c9fQqQ*i*#+yIYxi5|SdqaFKI)Nc#?qhF^9P7+0%S3^ zVIf-D74W7NUl}tvj|JQA1o$bb=^cU@$)qfuFlNNC&78Zbhml6@*rbKaKLm*n4rgr* zb}%MokXuk!lJIypb|QUGf+@cz%d@U8N8wN^lzM}e zynH5wUn~8#0gsQvX|z2l0dRD*5AMJv(?IkvUp)`HletSA!rN8lBaG02neWdJZu z_uE~)s_4*nrrRU{N+*bbNOv?Un;KiI9dU9gzx=5+ZXPhg_%YE-95u9Z#Xnfu1_~Ki zCaULvk!w>dofK{<>G9@!`B~^9-OX^6sK|SWU-=C)5N^<%0M&L7EOz-~iD!V-BGpski)Mnaabt7gefR{P$ z=&=0fjmsByNAL9vXg>*?$^Qd1Rcmg-!vzu}t7~q!g3Nk-COm)+UjWD^GM5q^bCQ zTFxFI34$9&S4vZ%A}xZ9NJAap3HKQ;e=27hhdBAtVPd3|5VXA+A*p?J#;2*q$GWMC z+7gjtTd}iUSBa^iZc*3BT()r(U&r%uCg%2J0M8Tj6{^=97HH4GD&@IHDnn83p=*@w z`{DMvvr+b8zaXqce(xkeOFR8|t3);Gb}?SPS8k0!46B#?9^6v#acS+N@A2KljiMu8 ze!U}BK)C&iPLAH|h)-NYRV%&VSRUvpjVM(Qbwn>APK6fhVy!2C-@a-VC=VK@%0!Ry4EA$wDdcA>ygZw$JvV) ze`EFOSC$kP-^T0S`BnGxvs)0<>%6K}Y<7*vqnRgA@*0Xby4j*B{n|Q(*`$=BoNK2--pJy;$>EQO zn_KCza|76uH!&Am(*B713g?|gNaqt*-Lg%I=6oa8W^~$#XVs~YOiUNYVzauWe|L64 z@l+^LfM>@t-k%sWpFi-zz@XX5xnm(R2z=Gh!)SOizUy zCB)ZQ3@=xY+34ILQ@DLu*1OgXqE7m->7FS9DM57KDAUAUnwc|Vk%1~)UvaXmAdw2e zt9UYWF&PR}zM6BZo#|C#w7Y+l%=9j<)-PSZ{3O5m8#MQrb@a1}B^tnuts=J=c6V^U|;u!t4izF0tPX6Qevg zSN$x16Uf~3<;q0rWuHJd(vfyM70*B=?bL|uC+*+$7IS(PIu0boCLjlyJ-Kemk84a@ z{<<#XubmubB^<*$(=~zMPIN;Y=8-iOk%rvjJGW(BtLq_>a&$}{2CKky1Ip6!wYD|T z3bZeC0#U;r!`MQL=e#q6JAWBaIEOsh7vQjqvr9t%Iwg&q-!3*~9ac2DWk?Ku!=DNK z{H8_i0M_#b)wl5j`kx<3!4~wmoQGblD3P+Q>c^8_-5-b5GMC4>Wwz5V)R^K;_lWKM znl>9G8ohh#BJtDyY!nk4T z_>;81Zo;+`7_hP_e9U{Nw8Oo6B6Qf$W*H&)YBEiV{io4?nLut-*~5Q`WxP(@KO3k& z7wH`qi&|Kjvbs3SokmZ|QWUsuo_ce{1UZ1_iHDJzlJi&d=)p$2b*^!huig{gK|i;qJbkwr(X&k0>YIG9q@}E# zEoY#%4sH2e5Z?)KZ1qLymOmP*h@cEG6CoTcZD`;V1OpPI()xr$He{CN&vdc zWjwG9Z_|%+lT$@tfOK9F5e+nT3e5T8{48aAq4~a6M3kPQ5lGU-A8vxov@g1pKjsQ+ zfHqCebcRSu)CEp}UV0sCT*-!}=Qc{L1M;ii}vJd@EB)SeZ z=KN$#VywZ=>O=X}rt4iN_XPo(guMXnG<1^2_SpQE4_!ubjM^P4gYd*Jcw;lk4$5 zDg}lL_^RCJl_8<;Y&Br?0Fz6dss$DnwnHvY0h9cz4@Wm9nBX7nc?P=Jk;SQvLME`3 z>zy;?4uZI;fLzn&WE!(Wo)2I2vSUQ3Y2%4O0UmolRl)TYM%6N=75c4y`zqK;aqwO@ z#LcOt({P+(3*u$Pu%7fc zhDQ1#a(0Ru_c{a&?+?>E>5TYcs*j`8GMQT*Y;xw@`POHR=d;Hq73J&_7)`4xrMREp zRu6#%>Hh#xeSr#^u;brrn4VA1&%Io5zM%74hqIPx+K>1S!%^Ay-wbi-X4a8eABd$P zzz`8}Jr#gNv2mPTTF4;;EqKcm3jH6;RsNg*{k!%*XlGJU zi9r6{u2>JId2E5v9j2Jx%AO}`&)oA)4kZMrjDwZ6bKCG+)?z>2T{u79l&L%MFUH@s Ssr&nL|J{cFUt_VStp5Z;$2}SV diff --git a/docs/images/lib2x-polytransversals-1.JPG b/docs/images/lib2x-polytransversals-1.JPG deleted file mode 100644 index 4d46eea828177e10453c48bcf65475b4359b0c0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26273 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 QkN(}j@gEM|_1^~n3vFL}K>z>% diff --git a/docs/images/lib2x-polytransversals-2.JPG b/docs/images/lib2x-polytransversals-2.JPG deleted file mode 100644 index 8da7cf5760bfe64f2fa4f07addb506f68ca6f2a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22024 zcmbq*2Ut_>mUWb>2#5+u?;z5og$^RpL_t76x)7?NgVazIrIQFquL_6)p;u`lB|zxC zM?&v}-V*-kckg_2@7$UD&HU$iI2=xZbCT?L?Y-ApI~U^@Q-HSs5+WjEB0>^kB4Sb! z64I+wWLK|Txk^oW{TkJ6YI?fc)VFCFn0eS3n7Ei|Z?g-sbKT+P)z=pd!6gds&YFzz(=Xb?GwIrHfWT8{iUv;L@)R z@b`_7h?szc^zyG$m+=q%{WSjjrOO2P2T862E)ibF9}`_BA)zECCj0%1ghW&~Zn6=x z3*VyV5K+{&Afe$Dec&3yB_CcCgUhlqu1%)qVJrJ_0?o9A{g zoMO6eu@{qoYXtbaqqZ*$GU2pwzljOrJ2X%JmIp! z2CZ9dz`aHa`PJ%{CZ3G9rPYzm#1i6zp`p;9C1BNWNW&dOgsi|zW3%fGTwO4qz|u!s z1!orkso0LuN1jKLwXyoHCpkdo2C7?>v~b$c-NR2IxpcBJA98TQIuVAT&j^k4RI}Ti zn0CeS>s?rb&PJf|o@Q-ar7ADUe4}8S11zD^WJ%`fy^AtV!nJ#t9SF>hk#U z5gD=W73xe+glC(~Q-!_DhQ`nPSSp3Hm0RVBJH~|Tgq)`GoF7rkS{skoUI1>0#Ba>k zk8Hl!l}RZ^E*BYXhwDvym*>sIR0jg${oCVO5{0ZF0ugnI@Qvz?!4RrPN=#0%@Dg`e3*K5widUE7Ji3{VUT}Tq?b4das9@OgN1pq#_9#wX0of z14}LDQbUQAoVpzI+q+Nty)iBuYQ+dFEU6hEX7iU zjjdl*R(7UQr2g{dIHDp+X0TqFwxY&QE-@~PEzO77BtTy#Du+C2l2(BU|Kh&906<;M zH?OYYdh7)C5-Mvz8TH-5$XkUJR?!^FMI@z!o~(sJ5j((=<8K0ORy7vby(nyV2H^0! zTqA`*(T)+wnWIr?4Inm3I(a#XVgI2Xk#_vfr~;pTbtBi~G>2=E98a)(*X%e$5-HPP zBNCs?4a5~axjS=R@drAq`GxRt1T^LVbC6wdGnXSZr9I>g8o)4C6r>yTA0hC!V4!hs zZL0Ii+R2t3*=pfTc9MtZed^6Y+3yAM7U^Js3G$&aa+ z$@xNMhOA!j7!M4EOwKLYyQ^_4JI@nsQ2xMpu#lXUtJF0lHU)R3uztx?nJNCdzsOHWp_`PqkjlKt+Re*kqs{TJ5xWn&*YMj!t`c;t9E z575h+3^EQKURPw!%36z*80bBAKZ@h`hB0A7jITL%T>$QPOz(_#qY~?j!3f$LCmO-Z z2^_7ryO)h;Mtz=`!^|p5ztR0%Y?M>WAeiX5tjZk?od9?%#1%GTOqha_m!Xsv%DLCcAKRrWWfij(t6Fy-U~(kY3ZR$B0`%Yf@P_@) z|9!>(1`55}K+1X1bQbT?9z^bydL#R)Vz0&a$rq<--t+cIZ`*n3Fyf z)}Jry*h{L(#X&^K4mzPKnWD@RGtf&d{Xtb4Jr@8{8W(pzJW7C;1B!HSx0{7_9kmNR zG^KN4{U(1#F5@f&tj^;%6h*h4sZRxR6=)b|4^nC4fZDh=(0RfIV5ts)ehi+c@aTn| zjj4Fy9N)oB0}^p+r^V9?`$nG%&n?<60FHrcGZ%o^_tUu~B{Ea2`zRlPLP=re$cySa z@62B6G_Un5cC|`2WDJKs*@>_{W+vRb5!*=R+8>|TdGCjXk%k3@gs|p@t)G!0qN97(;yLvO0QeCWH zBb|!EJ&l0Xq(rp5%`o{~5hFLFy;LPAHSaFjG5e%c3KZnd((#R4u0Dm$$9}lzs#b(U zpN(X_TvUph2%Wydyvi=Zpm0pMyn755zv&PpYAmN(64NRh`E4XCPyg-+8}#ZJA zSE6wx+13~xD{0Z82FvKR`i2Y@HC#e(71vuypnf`7bL$cp6jU)6-tCRX0_CAj1#GYL zB6lmua*FSqnTYpZn&|aBQ5ndx<}=p)`Z*)bT+J$%dlzTJ)n$1aFDvjN_JC!mAiiW( z!CbR9{SM(q9FKv2$}G7d|I*8b4F_>f(5e;P`>dmZvZYrkeGYHkhfI`Gr+re?P?k!s zM?cY_%gvRD-N<*IV?&Y=oI+o^fC(I1lXPpD{x(;hw~l4cxLA>XOyNj+K4JoU;Y zqIqQ9D22~Z3((uuDj_U1y)$RZb{BvR$!e^OK9zU=+c+0LoA7$ARzDJ^H!_}_8`~RW zpd)9-$h^oZaqsixz_h>+GW*iLCmG>pn_#0upZPc>GSWn%xZd~OjL)aiytF2D_$sm& zhR`HI7n=NS?booO-6}Mf=)AB#o^#dF+aqT4EUiF zYt8W!FaJ2PqjL2A>WTDt4cMGA?g&WU|2%f|GEz9M3w@HkLegxpa0H2ga@LJ?kBP-0 zVqEO5X1CHAo3-d?7|@ApP<9T?aWZ7o9XPSSVzm?KA6usH$>>>x!?_i>w0KR2o|bgh z$h=M2SeXTI!R)sXbj2wcy-DOV#lt+8O=gfv2l<_FbE&DoWpu8bO``oB{aMXYHNv|y*@lA4D z4*N2-u8qaPP*e5vmGSW_j2TDQN2~p(f6C`egp}%{OL~rivlDsjw<-gkAGPf@)dj0x zYKuOhL)Jt`IS=S42FQMPr?wT4j7}Qho42LpPhg%+wH9O%x;-Q6ePqA3u~J!J)u5lL z7pbesuUnT1@yx4dXCHt1f2@E1{Ih2`!4PBlE4_+FJV>#cvujYvNt5N8_D!&9C(lX| z)s5riLD4Ux?#>e1kzO;C2mPnT+B*tRx$?Y-9*q+%n`VpUy(W-JVEQ3T@%q6Kj;4vQ zuv=B$tEEzEYU}KScfiSMVo9LFn(C@AOrqx}6K?^|QuR^ah7QYtiQo3Y_Qpo7G@MCv z=nc-Fs~pBT>LdTI0^mFSm&q(gm<2R6Qv6myA z!y!nfxa^ZxqRr{>RtQF}t@~8W)gyIFi&8mxhjxxwl8Ko?REYFo$11h_js`n}f2CXT*F_RPocbg9E5u6UhipCpNj7(Rb_Yg@CpMD$-`Yr@ZwBS&*kb8Z%Q?YBV^yC}7IQ}bB zf(nM;BqZ}%&~?t}mTp9Jx?GN=@0(lU9p(Ov+o1|RB8V^yYTUY{eY$x6T67<|L(hp{ z*I~V@tI&rUF+)pP#i-s_4Kud$2J>TZey0#`DQB1tPtc(o0Vqxd;aWOFAe3GZywVv1 zZMmzCOmBZ^PVEn_&#e=#Hi2n>7ycL;m%50`!1tE~81FZ2QDdQuT@$oojYesznnOox z6#EFOhD=o^XER%&XZY5QEEA-7JYOPO0P8ZXMdwl^Yx&SPiT416B zB`Wk{6_)m=S#at65kgYOj|FCTdot(WQEmVOJDo28`*j8weRdxP1~@6__F{5wQzc61 zWRyirA3p?tQ^v*!UkIWRQVnJ_+czCU_~2zKI;@5 z>4DnOJoFFvXzwb|)w=Y&&$5<9?*h=F=H1!g0Oc7|S_8^3uWNB90wpm9ahzu5BQL`u z4PE~uT8TpmGFC8OeNbd4QWCrVh^;eRX2FoonD_>T1qC<+;s1sqY4Zg@j`;5#PyCv^Sq zkMwFGNGkW7np9hdfv?7H1I+E+*1ua{&QuKAa0)%RI}&me8V%x&=5}4RW@3E&3!C6 zM9MP$b$3jTUFG+~0g{K*iy7kQv_DrnjRjz9EsPV7t!VBvY(ZqnJCdaRTRySX8v*2i z7rxRtpqzY74ep!(75f|y75)PVap3pY%9lAyQdyOcOpIiIre zWcCD}P!W~XgZ-tLsfSE&sP5drUD>(u_~>A}ZAo6`5$etv@uX(xth!0=In|u6(8^3> zr(_1>G{WojhGaCX4s=jFHmB)e`beIoI(_ww3sNl~R|q8OnAdMH9*W-rarkM}hDvRW zQSvUgy=wIi=E2}`0h3RE?t73MUEwz3^9vcm#?v&Mw>C8)z3D>8$?p@d>J7S=vxa-3V zik12Z5oz5dXv5T#l&n;Kmn5(3;V7L<`+6+P=T!wk#_bq{3o|ykp5MnLou zWhOnZi*R`Z+QsmAPpy{Ys6HWI(A~+v$8E#0tY)J}8%%3*0dMUJ^#{)Nql)8~vD-Yy zJlL!0{u~MCrEvqL@Rzm6`Rn3VE$uYt!yoM(h66D zp3;ZP>(c}OffN6UU;K;bh@AdCNrO!I_k6Sd8ifHltY^d#0$1B8lL)t5klpFHbXjd$ zw%dDRXi_Qk3!7S6Nru?YsC@j(34U9hw`I%1#pTonJ0U~q0Ti0CLUGA*-9c9pEj~e>Sbl37zF1P2mb}Y-FBf2srOT?^d^Fu(sRE%COWGp1(Xv)A}2c@;>;F%*cfJ z#iUrMHTBKqb)6CJ3m|k3rN=7uW9=RfxCyIMQND232)$wsm-^;)bDEq*7I_>X z!`(z7D;hfcPABl$vCwIs25zn4@B&akSjU62jWj;bj=1&&SygJN#*S%VV8-mW7$`t9 zql-mrMdY(BBV+_97Pdl}o!svq+AH}M4_nr2ygxK+x^w;{>fI8ro!f`LsSQY^7pGFBz0Cj9~kBE>tG423?=0L4I=ZKN8~2Ib#gS7doWD?M7MQ!;gHIkvtVMaS*~PA$#; zBy%cMQf?mHM{Zj$szKx%x{!4IP|T#0X}GYzmmso}bLG;+6k)X$^&ScuNZ@k;AW`0o zZ}JpwIC&1g89aBXJ~GEPKwxA09;c6AOvzWV)dBCSb>}NMYL2p%RqrGqoyk&Z!uYK4 zsc$E$%TrF(2^UQO9%N6DnzJftC{yK7N;+goV*VL?K(@G8wPPDCcpM)&-V8iAX+JUZkSMw#TD#pren-6CkWl|qHu~=1i|t34TV{iE z8;53^K_RXSKCUOvw?y6pL3Tz&UH_V^uL_f9{mP`TvGWdA0HTeo<2U~>+&%9rQrT8C zv^_>)Kd>jZnp3giSm;?b8pDGLI3z(Is{{sP+Z!xqk*MmHK$1oZR*6W4nqVU%4tp=) zpm%ZGGe`8we6jK`23s_0wZB8WFxJ%kHR?)_AkhP zfukIa$Du^?U_FNLb(M(Qn0OD7{jGh%hfifw5lun$Hh$^bSNC0|2wHaiUGjHiZnnX> zprdtA1nl#)N&Vf!n>=%8%*`p;;(Yw5miVT73##0isuC|&TVAY}n%nYkN1f9_F-5lq zJ0Mc?Qw2s~&tv9*CO^%Pse`jHBFj!#WT)@Mp84BzLr{yC)*WnTF1_1T+8%h1`QT5U@1iK5&ZB}W~k@LU)6fKawe0m-eb{uq&8B5QV`~$+y(#Q zGy-iiWZ)N}6gm&AePw23={3>#n+75hVtOCP;G%V%VzaFW=N`~k`%u}}Y)ABg3LDlyqmnDVY_Az%W|ADk#6G+UHXnGm&3uvf<0(+LE}D5gLwEMt{Cue9+2 zw;hbbG%N6q*`YmD(8CX`cUJg)N_%u&b@PVspokzSHD$1W`O?~bAv>Pc4#9lYyQ42^ z_4$5lA@|g8mC8!RibaQtK_^)^u78pJQx+~tfbbCN=QhkuiQt#y9)Dx^z^^6QnL_Yu zNoLH7ycgrNd&bPyJ!>Nf6_SFMQa3^78JH&fr4INpO_u~I>|H~v>dP>DKF?RhJG#kF ze+ei5<_TI=t9~QnG;C@o8)tckUXiCfvWfQc6NLR&Nv8>JLl$pYu4A`cEJ_%oakC|v zLv7q$Z9|dd#XFAt==U9ZZQ8MmtG-VW#RG!w;jH3tJHpytS8{Sd;tc@d`&;p;SW^%2h3dHZB08fF0Xop$-*Tc$DHZNHLF)rllN`EW}& ze_z2TpCEyL*Cni*UwGZar@x6W(MHi78=3YRT@ALKWtbD(9zONc=M=js&EPz?#Y(-W z8VO-Y+%Z%Cut!ynu1*88aSc3@uU7|b-26mJ=y`fwYwT_@KH?GHd1SvLUgwIufy8q7 z{J^GyD)|KGR2vP}4%?;&I2ggvkGO+)uN+~J}<>5)oVJGumn`ccr`}Cu9FDu;JcGXbF zEO4K$A#eQ)K%a_1U?6Saqyp;WQPGj*T3!82Pdyxa0igL@z(Vbvo&6{*azg4Kg|mM) zM_dhejYF685AVE!n90S@noPn94aufvdZQaeq?LQI@rlO;cn zeSYB5GV+40#x7&Udw)_23J8vd3@_-A7FZ%C5obSMdhwfjoW(ZClv8{V+Pg8@aodXA z9TuQGm#r8iM*LOsOxHA6%YC?V=am?U%SJKg`LKAk+YWr?cPX;hhh zW&R3#7wgQ&759R)1(ukMicekGlnnB&)BO-8S%?>@^hSScRI`?e;d?EtfTRWcJ>hwf zg9`=oTO!^0CiJE`rk4-<(ez2zF_l16Cn_ic$kG-o~` zbW=OMYHaxXqjZ6MlOCxZ*DZG(X0@XZ0RCn-**0yf#EVwLWU^Q>J3GzTbKXVDRttm zLl{^hOB5(G>v=1;zqUq8wUU>-xj$6%y6NM<{w`ATuYU2@xIj3vFTR z#sBv$RfbD8eT1+et#Iu#mm}7o`P?98wWm>$~g7y5fV-nrV!pg-p@wj`X zGrUX;`zkP6u~0GW+v}=d?y5f1yU_<~8MpJr?f1F(tUtGMIY?=#reka;CLxASgDiYD zKi6y;fB7f%nXz#6&7vXLI7Di_yM?jz(f1{_K{2DBe%BQTh@Sc-3cbPIoh%mTK2L&# z#@-1XDCurbd^j+Takr)?2N616MgA8`)J=R=XC`T?NcGFl+x;z_JyTx5$|OO(h#vK9 zydC7mA4UNVi$8nm+8eu*Y2D7NVOYWr?+w*_^q7Uo*UZuyc}zu{~XIO5t<}jQeSzH zMd02`y7gn!=Q;K|SL}5^DbtB^BI&Y;YB3jscOmN5@pFaISq`^C~W ztv;ky#bEvpU%k&34)J`#Ic;PJXGxFPhMB6dM~2nJVqaf-8CBd`Yct9bZZ@MKMMrQG zmjPdAjlLcS5C@Uv|D%A$Og0}#j=Sp}`HrShT4&9uXaSOP;LLGgf7UtR)Y~w`S|` ztgU>)qEETWlC0F*${rb}eMPfyBWJsUThoD(?M-7tAn>Rsh2ttjcPMkDZ)7aZaD<9B z$1dz&ApV~TfGj@so^F9as=F$Y_j9WRLo@o0Nn&K0)(ZdwXHh#s9nv`6ZO`pV)X5_ZM1911H2JD<1j`EmFGl}v_2 zkBZL5Ial~N9}*Fp0OcLJrEG^`v-e6`ryes}tsWgaxoj;twoNlt?G9Czkfw$4S(e8Z zY+rHP89RJ*7F%EOEmnh1wpYM|EhkjWK07kQ%=5le%d@nAM|h#!%hiAnFO;8p@;$-} z<>4fn_IRN@pd{yul#%FcKFYF=i|=W@24T-sa>r$H4j^F^$BT-X^{Rv#@tzo|TXb$h zp`zrp^IIODE#_ZEfj?4i`8o~NR;=dix+}?%2tE|+{i6o@{Zf%B*#78-zcdMbw*;en zpS-vS;ZfIbN%K6?Ff9g|?5z(Il{vzR+UhLQ6Fbb>_Z#ehs9H(Er0=bB{F-9fw?*As8{rBxE24Q z)6vhpRsb=N8(NLz^BJDL<;V+*=F1q&l@8=w2?`Z~<5_8p?HcGx2@nxFX(g z?=!kyRhP?tm>c@oQy)lY)o$Vu&_8|%cuy?V<45s*>BrJ`mzsfzJ3w448vcX7yV@>TRV<1dqYbMI zDM$Y9JA|%d0?07ncC^ueYk|e=fH`u}9?R_s@KjJ-864SM7n(np5y_y74ai))rDZ1J ziDFTW&dg&oZO~|OG^$Rg{H4f>Xc6KPOQeoi>au3utA2AOuaj=|N?-Cu_Ka*4F zeo$gASLy9|Z$nj*ib@Y(HVTBkgI{rl23Ox<^s_t9t5K*9ECr3A-obB|IR!V-O$KD< z$ONBBoEhkrxqBIXJJk{@K6o)~5Xo3Y8rCrX{;xJn{5aw`xgL34x=0w2pJ0o1zXn6a z1XD+u`bVPRe5FubBUgEyBVzHct_4FnH}4C8RfZ&Q>rtoke&)TOMjhWdN*1=PzrT^T z_{O$S{#TdKT3$g)Tr7AF*;k>ZnL|(UMqvw*(rs(Yc2m;IEI<+B9Fa}-5BU16h6iv zh8FpaHVFIgCCVX?%kSRaSay<3nfWry*Qt&4mX4m*>pIHUNN)Go(2p-u!CJk*;|515 zJ=OxO&w~hHY4^xqvV`|HZKoON+i`lB4V*Z7p4(KsmY_LwzPF{2oqG@1^>1lkO=a!W zLxt-<1B3a`PJ;sr|CQ?*C~__@ieYj{2R=WNXZbqdA2E1;)tT9)3CUrE8MM_7Ed@s{ zczQgVYV|S1)Ep{DJGfap*N-4nfu~NHpO4<`k`B?2N^Na7^0U>sf*+>=?_T4kuaYjv ziHV;;6ac@)$&3uj21&_narJuE)wW{w-Yz`U`=`=_sH@F;b0nbwCaZg|baQ(*<`YnU zapbypBNG&1BRHSOzb4$4ma;u)!MYyMq>H_J5Fl&*WVng+-qfD74Bmwtr({u2=5?@7 zcma4zy9qfmkNnmr?&)eAfsge8Ydp24`J<=5M=y}sEP(mjNqy7yQ-hbWRSo0Z-m;*W zA_b?{lgN;1IMEuT%yy}1-YTo*3yW98t$6gskP zhsv7meG^-&VRU67MExUFb<8K0*@1<8TEj;SOGzu~;LoT!Lg-+2_u4a0U%^;|$x4B* zxrrvT%XPjyN)~W*`}RN-C?LY^S0lG*Q$c$dX*4a2r;BedM(C4>sKk64Bf!(eVRx&H z3^0;*;A00>>mAv1et2hwwf$^!`iyGD8%4sJN2hm|82awBL_PtSCApdvqn1~h!hy;%{|*BiQ?-GIryRCb+90Vr!qC< z{Iqp3K#|9K;Taqety)0duH}G88*-vh2t6Sj7B|zDhJ6MNK%f~ZcdRo5pW=oZSgpTI z9jYqiq}W}8e;|?S<=V?f-S7^kOWWB9*eb^qEV;`04z{n@1}8kA_`?_K#h3z=iGEjQ zDD;CyIy%iva5LrAQni+7^db1h!!dOdnS&D-R|Y36MPr0-^h@@>V&Mv_vo2F#hTcJkQMh$-Offn*bpUF&z>1t=&Q`C>q=yhAhy!eb zAVs-oUh;WlI>*d`AZJ__!To)((P*@I7KPqoM`v=~*c-{xfimvV032tTPZV@RZ7!QZ zWq<2Q9LPjHEeGGCtuEzPk!{3vU^v~BMCTHC?4XZh-pYk4_i*Jn7P-iUUlE9k@=3C= zCS63RwR8>fL)3D%AOi`nTkcalarNT4)MD(C7D4#Z=dKiUQ{9$9<;IY7J@$$b?gRWJ z+Y=VwvPS7zIry)M@?WO*{ORJ5(i7t+4Vb%D^DnFn>77@fgYeI>2C_l1=P}DfC%rKE z(QjGeElzm8p|Sc%m7D;DGd2CDf5evk*=9B}edwwZ#_f={Z;k;=YJ36UoLv+!4FpO+ z4$g=xKjsby*9~*#Yf&F3NV$5r`sCwQkm~ph^0H5qaSGzx+<7od*=lz%K<=j!Io|tZ zc8Vo7J0Y9tk4)2;9x+&@hWey9l%gihVP1Gw3-7`G)2XjKtIB3@GqO6SLu25pCT*W= znnsOqw4iH0VLD|NgI*&eVlr~dE!pmy4`bSlDxyPXV$M0?w&#^G8lSZOWr+gLwmePk zGV>AIFm$Wx8IoFz*12il`h(-nebRk*v+*S_m;0;aQf2A(c#h#;`ktxE^ib}!P8B9T zJ!JFFLQfLj;|rKHJ?t_iF1l&OEUUhqI6*(Wh}ouu;EXnL^B88Ups;`%I0zV^^6@p&oio>V1iDgCP^gK5;0I zWTGTCCsyk#U;b|{ZqbI=s6fESH;vl@^i4-vVkMec(4NBnjFc7jRL|kl5(zn(@PU)9 zw2**@b6KC=YB~nJN@mRFG>MXFiS$G-%i7QNvCY*iHgM~bfoACJ#YZa%`Q05ug6NUg zIM8CA3`E6tH2*X)r2-L7(;m#BCt}24N&po`@yyzG&0OFQg6rAhYSv@=JUbzdw5$KW~v zW`>)u=GWI7)2r4B)YzH_jVvhiPolZWsJ48C*7`Q}Hy)n>H+JSn)0+zKJs3O1nn>L| zQ`a3E^cb0IesuaU0LrzD5MgKU&H67)<-f(f$oQ0glL7&-3qsB(36#M5oUxN$CDMe_ zl2n>Cf5Np2<8AlSTX%f@Oa_^1Hf05Ig4M2+Hcy2)1Pu~QwjWZx2V5d+`=QXuff&R4 ztf-K^{H7VfoCz>_{uHDS!RK~_n+qpN2GzE+op5e01wqTse7WBG_>Yk~STIeOzlu8L zqHtLqCxy@AP@r@M-hG-gtZoSsJ=^9M}4hE$>9*-U{H2_|9$#MNO#;jlS4mqyE8_q?xrF&(Z?J*ZO>A_4OJzx@7`m z`Wi(O-k5+p?%%8sbDNT>pz0~~oD>}XAHC=~>dL7{`sSA~E?$LJE9J{=3!Lj3#a}{@ z(~OLs%P%c=)WAxgoLwcT(f9$Sp)cpZG(>Yj>3M0qhIn6)9M59Hn6t^Uc_1db7EXVY zcmMQp5Hb$WTocH{EH2Eg7pEd|2XBlrX~vz)n~ke^WWKIX1H@O4HgIhTW_(qdw#0SXRkP2+dgz|CPImrd!%`-&OzN{`2GjklLJ!r}_EoCmdk)u>+ zfOZIMM&IVo$eX_GN=5ybo3lU4(>o$VwcAOKEpajNMlFoP=44C^SS?_k;%30{k)XhQ zX^ZXqD;-$_T_OhsuNo2-?ei5Pv7hQv5O1_-MYLjmzHZ_Rclz!Et{RXc;S()`8#-tV z&ykVM3`P$s+;_l$72RRu0M1iDfny`(bvLqdWy!U31nu6}G}IZx0?lFth* zlVF|_J-?H?uqideYrMoL)zIs1>F&8K*Zi}gS450V;eD%o{msBwh8zF5 z!C$)d4!VJTtfdv1@lz_Kf_OEe%OrBHyG8l?m;&UV?VLv_TG3X=pF;mkd z%sv`z=(>accvOEw%Y61$O1tX%DDczux?xX;cTfcvIoL-skKZCw*{n32*qp`qatA1m zC&mvO;&o4Id>JU=w1VYMI+U#ab_|QIPwsm^T!;!$@Z$E0F{uGWW+8YnK=-F76~m3ZcY6n60+ju5{uh>lbE*FMxCDn)?pZ8 zQK`|RR~fqhY%>MKbY_EU#F!^#_~reR>_IrL`S6$e{RgZ?9xsbW3Hp$ORXS&bNQKQf zO2>NCXX-8OUd*3q;;^yQI;*lprIzX$B)p6!0X=b*J&-Bw#D*S+jB>$6zLw{&sc4Aa zKD@8eys6IyM}`{R?={+=7(Kw=$w9LnW?mnLB{B<9?xT=P7XZ%$hg z43$4`%U^dw5UCj8hjE!cwl0;7hG3$4BG=)vg4>kI$BT%6{Dl)H#t;{YB4T ziq5-?%>eN_FOk#-eGz(wfb+Vc1 zP!_|o@eV|C2+dQdiAR(yTm;b?p}E{cXU8Z8SQw*qb72&(CY`Wtj%icfs7+cGuD!Z> zn6yamo?Y>M1;{AV&~q=Q$$%<*<;~1*<*DZwb_C|ddy#N9&Rx5i+8c#l2|T{AXztXu zmPoYq>xOqZdNmHJ-x?a#Z4V)VM4*0D+hZg13(&wqHq{-3F@3xf)GnrM!{oi?rnk9VuOpZ-o0-}y{!X94$F#Fhi%nOlf zxjHVf>H4%9#Cj3O(Adx>E*`PzujQIISDaoOU}`M=($(B&B_u4e<=ZDAe_tqGSle=U;=Mc{q+7^^fY1Y z$4Ema0gElfmQEH`0^aH;IW@2?#dxKB$<%aod{Tv|&Yz>At#-pN^S@L{6Wuu9_2JXQ z?tvVmF9751bseh16ew4&?5e}uFSjoM_`yw&%=2=|@2G6c2{sfQo8~X$O6XW8xh*QA zBaKUcF4EmQzP_xGXI{OONJuqW%y?a5uJwDnMBsffl2-#%R$*b##{*PU6{KO|cmR2( zlgNT5Gs8fya2`2+T{lS3{rrmF*R3H6^~EJtUh@(vZGItOhKE;BMRMKmGwEW2hBnZk z3lgJ*bgMZcfe@t3IQK3&xGp?gWCuRb7#N5-&Og|g+8m1L-U^ZMVwjpl#7s4HdHQ)C zFs3Ga9sX#xQ997@-ooRSL(lExX(PtNAV#G~)t=TGO4IdkX|-BLWZL_iN{rp$2_CxJ zj8ekQJ)W>($;*`eLC+`(6f$yOeScMRnC(q*uP7fFzs_;tr1=ft(A6a zhkY!IXjGBy9+E$Io6mVMuXljs)bV6CBnXi%Bw5{Meh}mN54DcXx#C&FhtQULINLd6q(4bnqQYC# zGnoQT6O$R5q||$^_U=-~Hf|*r_eR}-shm+oy{30w4JXe=M+e1pZo86$y=Hm|*0R0* zsO5q1uVoa`Cyej%rm9w|TVgI1g478tV#*|2YN`{pVgNN?Y1So`w8IK^}!k06va#sXDpG4C5?fksFeq(6YeA4m+L2`b<4%$;&5`o@aWl(TvFuh zcOM5ve3@!smfqJFrc?JC`uHAf$oY*3k+YPj3QS${deVm$M}}_{4POnsfx3mUkvmzQ z3f#cO;5nRqEb@xLDJGD&@0{{@F!lHW?w%rk9Ksk^m!Rj}J9Idij6PAy3vSUg)pxVT z`U(er2*eMhwmpo+CM$dp*lrSXyt7il!Q@X@{XQ1$cY4H$eYU~%dXon1d2mCbI`BT_ z*@uV#n(mpn$U8_{*Ulkm5`Ma9`U0RbEc1NIj0t0Txf1vYC1gA<*^s{L+l$iLU4FUQ%lc4xW%9w_i~;{ME6PtYN5V7L zRr{!-j1J{xBcQb7TYIw7OsI&MSL;}cl4*J|u;jD52?uBNoc0{&d#^9a^75m28ZvRd z`a%6nojfH3wS0nil{bY&s|G~(!!sA)aO&tq_8gZdA?=o5&EvRq$0vsCIDgoV2M1kR zQk>|G8%rE^XAREv{shX3y}Olw*p8%J>q0GU02ro9(fy+vz8KVqhS50M79sb%q_y`% zU|HdZv?^*|gk4bI5^`W2!Mjj+a@%O)6ZtZ8dvIz8&4zFE8~J{H6)(JsK2?iP=$kPn zJ&h6xPvq3-h8_I-^f0@OVRnpf@7MO8a4?_+`f2%qFY@$_flI#zay$9U>VFO7CQ4>} z2LRPg^^{j#Pomzz$fw?DD8z~Me1??n&#+wsoxS;0LIH4on3&9Lo;BYswjum2EiB8eY+^>=+$vVG&_#}yE2<&dvyN7b zCK2F&pCi!jK(B1c5P!e6ZB?s7dr7$!y-$i8&&`%)Dips{^txW^y++|9AXxp7$T%Ys z4vjq0n#oKU@iI?jhB&D1RF|Ig^{o4!tZU@dEH{Z#Jm7!V;eD^nsL=1RDD>P%9M7N8 z-mIdD8<(sR|MnHR_@zhZxqD62TkWyVK`Vci>Zra~HB*G$e#}NjT;#6yY(FVQ#g;ddjnc8D|b1%nXSUUi;HzkFBIP|M;j5!vC@J z`zjYKfoFSE&*te->kOmjo7z|tP$@_H@cu4Bu)a@$x{%y%@Qzek;qAxbY0;lMIrz#G zA2Ge+_R0pm;B@nwRx+A7at}KF%IuTTa6EwS_%gr#Jd%S+cqH3NKB{zeYhhc$_8yCn z_Pc?&iK4rvLIA70xy{%Xy&@F%cIwojClhQFpD!N_XzxTDOPVqB6q{{5n(k?EvpZ^+ z@dqM$NjyCu^rNLvrwjr`&ZfA?)4b-uQD5^Tz3po3bFK-6Jy|2vBBKEin;Ock-s!mP z>D}kVlo=6lxwZLhp$CjyTEYpSCJ8)L*Cq}OhB5mX3{KhTjvPr$6R-j3ueE*``1cPr z2oMkWJ9~Y6!0t_H%Qo$1H@*dwDd4JxX+_f3J`a&G8{Lb+o2=(FVG9*P7+A;A1Kg~w zgPZd{g&?-c$1LdUxq;$|&{Y(iRxnQ^)w?=TkW*5OvH~-2lN#euMIYshhT06!`?id9CVMpr4RVy2k{aOiSKT!ijg= z=4^tyx0<`I+VFU=m`rvnFOWF{BKHSP8#O_pI zufCBfv%2G0!5@+*qvG^4EwQ_WNH=*O345n2xx#|x8!=anXxyr^viBgHLMu0p3e$q^ z2tL|Q<=T0@5lYf2#Yw(pKo`3Gy(t6bPr~XIFJ&S6P=3}Zb0GkKg>rq?!a%{KJFC8W zUeNoEQ^OClpLd=($J|C^xi6cmVx(;&+E3EFwJwbb!v_cEN?xt4hWbp9ddu;6(;QlJ z4gP^9g}B!FKI2&V*z>HwT+7t+sR2Vy+-R3HoZE{=t<7Lp_dDIJS)63u6vOD$sfQmM zEML9LH_+tJDP9K^T@IaMBGBIrV6A>L>^)3OoY|GB(Vw^U{J4O|IH;b(Gia4!6=zq+ zWfF2PQP?OYKG*fW^zS16T3^z`3tHT2067U?W+_}+IrU;OT4KmNj(D=*;1V1bplO=o zknW%3E4}#YP!81FFb0Y~T+l_=+vUrbDa`*+DZIcg?+;X(gUn?Z4atES$2o-HfAu<& z_inbPiy~@cF-cp>o-IDVJPhqcFEw#W(mw`bRzkxfVp3WZZkUe*Mt1eQ)3n*O|V=dW{4ug zdWyg`()4z#R?wQm{2}IKS4h_$K%V8ceqv3h)o`O?#XN=3fPIp`wusHs6xVP*Y;UQQ zo6^?aJ>x)aY>V6qsrJgT!(`eIN3mkdLf3c6<9;OevFC9<(zWFe+X{|ANMIva-|D%vypI}shF~?2Xha`gY65pn<8&^d zaC}>Eq-Xnr?XFsxRa>L#$RZkrbe@A z7Ec|o+#8w{1J%ZJbh9r9FD7h?VF2TAKK}v6hHuE*PPI}b6W{3koV*86_)Q82x;WV= zFluUi91+|IJaY3SNa%$U=r^_l-`g)8yQOmJ?(JvFEofFB>PlnFoF6SQ zPPS^ab47B{DeqYjyny6-80kXth7ITO^2OK7*Ze4Ptp^c31K@%tbQrPvE^4$Vl(cMJ z_w>ZZB(Xb-id1U@!%QXjZ7yEV@pFdQVK zuMv!tP=7l>vMB4ET>jlo)ovP|^(vLZlaEZ$)>$wx6^Y7c8p4_ zw}K_V{mNL`ddzx$zsm{FI%dSbHH3dQIz_}`&GShY`;!L{%?6z`gRQK&=KA}kdG%OrHQ9BC?(K2*O2zg{ zCX|E@^n)W$zr5gf@i6#!uFGn(Su?@NO4 zCb$s2k8vU6Ux#p59-Vsicajw7x+wD_t}5n$d-T4preRL=B4nEqLoN1-6A zM!Jy$6|vs%XV^s>2~-Bn>B*N7x9NA8|I3Ig`kd1GWyCd27H@-#;aUm3e_07B5`8wm zSOS#CZ4A~>HXc1s@lqoPBeNp=d=i>b7S(M|;v$wON$yRW(MhSQj-zF!*pIzPndlpG z61-!yTW%&b$9WD^XN}*6e`>$u2c3_3^1GMtRY?EiW%?8R;Qb33IX62z9iq0d4)X}G zChIT;1KKGnPqD92tb0}P$0|4omn5@ufgg6_y;%V(WSLKO7^9(ZC!QJ|^x{yrC%jN9 zoJRnW+AW~Ck6KFuiF_>?JHRau4(f22v4dvb7mL3Aq7(rFfC;WuagY2Jfq}D`x%>#X zQ#_Yh&H}E-FVOlY&1&kVk9Fxc7f+U2u-jfgV>I$@`m*#*6_vopt+vv6#`9-wdRL7n zTa+)F&07uRWK4=^x87(DZG zSx5A>+~mfEGYCAz4GE2T=2*~n^o}CGQmFjjS83wjhH~rd*sj}cn_KPy?otUi+Bsd1 zZ-d2l+%oq7NT;pPj&Mhg@2gBD?pjeD?vg~7Z5*|@87wr$i2d`Iw27ct-2x|V(ghe+ g>r%ng9tEK*_W*&;djQUNb~|KSg}&Xd6}s2+FOM-YS^xk5 diff --git a/docs/images/lib2x-polytransversals-3.JPG b/docs/images/lib2x-polytransversals-3.JPG deleted file mode 100644 index 6dbf24ead13246631cdeff9150263c39d5321c36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14524 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�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 Qgs=YVgd`?*?(^i|0O9vEKL7v# diff --git a/docs/images/lib2x-shape_glued2circles-3.JPG b/docs/images/lib2x-shape_glued2circles-3.JPG deleted file mode 100644 index 0eea1e0ad7cad145e2be1c93c5a80a3c223e43dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18243 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 bxOOX73FawyT;B)++Wudi|MFYd#qj?JEc%rp diff --git a/docs/lib2x-polytransversals.md b/docs/lib2x-polytransversals.md deleted file mode 100644 index 50490078..00000000 --- a/docs/lib2x-polytransversals.md +++ /dev/null @@ -1,42 +0,0 @@ -# polytransversals - -Crosscutting a polyline at different points gets several transversals. This module can operate reversely. It uses transversals to construct a polyline. For example, imagine that you have the following transversals: - -![polytransversals](images/lib2x-polytransversals-1.JPG) - -This module can use them to construct the polyline: - -![polytransversals](images/lib2x-polytransversals-2.JPG) - -When using this module, you should use points to represent each transversal. - -You can view it as a better polyline2d module. If you have only the points of a path, using `polyline2d` or `hull_polyline2d` is a simple solution. If you know the transversals along a path, you can use `polytransversals` to get a better polyline. - -## Parameters - -- `transversals` : A list of transversals. Each transversal is represented by a list of points. See the example below. - -## Examples - - use ; - use ; - use ; - - r = 35; - tran_pts = [[-5, 0], [0, 5], [5, 0]]; - - trans = [ - for(a = [0:10:120]) - [ - for(p = tran_pts) - rotate_p(p, [0, 0, a]) + [r * cos(a), r * sin(a)] - ] - ]; - - polytransversals(trans); - - #for(tran = trans) { - hull_polyline2d(tran, 0.5); - } - -![polytransversals](images/lib2x-polytransversals-3.JPG) diff --git a/docs/lib2x-shape_glued2circles.md b/docs/lib2x-shape_glued2circles.md deleted file mode 100644 index 4c10bb6a..00000000 --- a/docs/lib2x-shape_glued2circles.md +++ /dev/null @@ -1,65 +0,0 @@ -# shape_glued2circles - -Returns shape points of two glued circles. They can be used with xxx_extrude modules of dotSCAD. The shape points can be also used with the built-in polygon module. - -## Parameters - -- `radius` : The radius of two circles. -- `centre_dist` : The distance between centres of two circles. -- `tangent_angle` : The angle of a tangent line. It defaults to 30 degrees. See examples below. -- `t_step` : It defaults to 0.1. See [bezier_curve](https://openhome.cc/eGossip/OpenSCAD/lib2x-bezier_curve.html) for details. -- `$fa`, `$fs`, `$fn` : Check [the circle module](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Using_the_2D_Subsystem#circle) for more details. - -## Examples - - use ; - - $fn = 36; - - radius = 10; - centre_dist = 30; - - shape_pts = shape_glued2circles(radius, centre_dist); - polygon(shape_pts); - -![shape_glued2circles](images/lib2x-shape_glued2circles-1.JPG) - - use ; - - $fn = 36; - - radius = 10; - centre_dist = 30; - - shape_pts = shape_glued2circles(radius, centre_dist); - width = centre_dist / 2 + radius; - - rotate_extrude() difference() { - polygon(shape_pts); - - translate([-width, -radius]) - square([width, radius * 2]); - } - -![shape_glued2circles](images/lib2x-shape_glued2circles-2.JPG) - - use ; - - $fn = 36; - - radius = 10; - centre_dist = 30; - - shape_pts = shape_glued2circles(radius, centre_dist); - - width = centre_dist + radius * 2; - - rotate_extrude() - intersection() { - rotate(-90) polygon(shape_pts); - - translate([radius / 2, 0]) - square([radius, width], center = true); - } - -![shape_glued2circles](images/lib2x-shape_glued2circles-3.JPG) \ No newline at end of file From 8786734077f4d5354496777518f4468eb0fc1c43 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sat, 6 Feb 2021 18:01:09 +0800 Subject: [PATCH 02/99] clean deprecated modules/functions --- src/__comm__/__polytransversals.scad | 22 - src/_impl/_shape_glued2circles_impl.scad | 66 -- src/_impl/_shape_path_extend_impl.scad | 23 +- src/circle_path.scad | 23 - src/pixel/_impl/_px_circle_impl.scad | 54 -- src/pixel/_impl/_px_cylinder_impl.scad | 50 -- src/pixel/_impl/_px_from_impl.scad | 21 - src/pixel/_impl/_px_gray_impl.scad | 29 - src/pixel/_impl/_px_line_impl.scad | 202 ----- src/pixel/px_ascii.scad | 974 ----------------------- src/pixel/px_circle.scad | 20 - src/pixel/px_cylinder.scad | 20 - src/pixel/px_from.scad | 17 - src/pixel/px_gray.scad | 17 - src/pixel/px_line.scad | 17 - src/pixel/px_polygon.scad | 34 - src/pixel/px_polyline.scad | 29 - src/pixel/px_sphere.scad | 34 - src/polysections.scad | 255 ------ src/polytransversals.scad | 18 - src/rotate_p.scad | 15 - src/shape_glued2circles.scad | 15 - src/voronoi2d.scad | 57 -- src/voronoi3d.scad | 45 -- test/test_all.scad | 1 - 25 files changed, 22 insertions(+), 2036 deletions(-) delete mode 100644 src/__comm__/__polytransversals.scad delete mode 100644 src/_impl/_shape_glued2circles_impl.scad delete mode 100644 src/circle_path.scad delete mode 100644 src/pixel/_impl/_px_circle_impl.scad delete mode 100644 src/pixel/_impl/_px_cylinder_impl.scad delete mode 100644 src/pixel/_impl/_px_from_impl.scad delete mode 100644 src/pixel/_impl/_px_gray_impl.scad delete mode 100644 src/pixel/_impl/_px_line_impl.scad delete mode 100644 src/pixel/px_ascii.scad delete mode 100644 src/pixel/px_circle.scad delete mode 100644 src/pixel/px_cylinder.scad delete mode 100644 src/pixel/px_from.scad delete mode 100644 src/pixel/px_gray.scad delete mode 100644 src/pixel/px_line.scad delete mode 100644 src/pixel/px_polygon.scad delete mode 100644 src/pixel/px_polyline.scad delete mode 100644 src/pixel/px_sphere.scad delete mode 100644 src/polysections.scad delete mode 100644 src/polytransversals.scad delete mode 100644 src/rotate_p.scad delete mode 100644 src/shape_glued2circles.scad delete mode 100644 src/voronoi2d.scad delete mode 100644 src/voronoi3d.scad diff --git a/src/__comm__/__polytransversals.scad b/src/__comm__/__polytransversals.scad deleted file mode 100644 index bbf39539..00000000 --- a/src/__comm__/__polytransversals.scad +++ /dev/null @@ -1,22 +0,0 @@ -use <../util/reverse.scad>; - -function __polytransversals(transversals) = - let( - leng_trs = len(transversals), - leng_tr = len(transversals[0]), - lefts = [ - for(i = 1; i < leng_trs - 1; i = i + 1) - let(tr = transversals[leng_trs - i]) - tr[0] - ], - rights = [ - for(i = 1; i < leng_trs - 1; i = i + 1) - let(tr = transversals[i]) - tr[leng_tr - 1] - ] - ) concat( - transversals[0], - rights, - reverse(transversals[leng_trs - 1]), - lefts - ); \ No newline at end of file diff --git a/src/_impl/_shape_glued2circles_impl.scad b/src/_impl/_shape_glued2circles_impl.scad deleted file mode 100644 index f737a17d..00000000 --- a/src/_impl/_shape_glued2circles_impl.scad +++ /dev/null @@ -1,66 +0,0 @@ -use <../ptf/ptf_rotate.scad>; -use <../shape_pie.scad>; -use <../bezier_curve.scad>; - -function _glued2circles_pie_curve(radius, centre_dist, tangent_angle) = - let( - begin_ang = 90 + tangent_angle, - shape_pts = shape_pie(radius, [-begin_ang, begin_ang]), - leng = len(shape_pts) - ) - [ - for(i = 1; i < leng; i = i + 1) - shape_pts[i] + [centre_dist / 2, 0] - ]; - -function _glued2circles_bezier(radius, centre_dist, tangent_angle, t_step, ctrl_p1) = - let( - ctrl_p = ptf_rotate([radius * tan(tangent_angle), -radius], tangent_angle), - ctrl_p2 = [-ctrl_p[0], ctrl_p[1]] + [centre_dist / 2, 0], - ctrl_p3 = [-ctrl_p2[0], ctrl_p2[1]], - ctrl_p4 = [-ctrl_p1[0], ctrl_p1[1]] - ) - bezier_curve( - t_step, - [ - ctrl_p1, - ctrl_p2, - ctrl_p3, - ctrl_p4 - ] - ); - -function _glued2circles_lower_half_curve(curve_pts, leng) = - [ - for(i = 0; i < leng; i = i + 1) - let(p = curve_pts[leng - 1 - i]) - if(p[0] >= 0) p - ]; - -function _glued2circles_half_glued_circle(radius, centre_dist, tangent_angle, t_step) = - let( - pie_curve_pts = _glued2circles_pie_curve(radius, centre_dist, tangent_angle), - curve_pts = _glued2circles_bezier(radius, centre_dist, tangent_angle, t_step, pie_curve_pts[0]), - lower_curve_pts = _glued2circles_lower_half_curve(curve_pts, len(curve_pts)), - leng_half_curve_pts = len(lower_curve_pts), - upper_curve_pts = [ - for(i = 0; i < leng_half_curve_pts; i = i + 1) - let(pt = lower_curve_pts[leng_half_curve_pts - 1 - i]) - [pt[0], -pt[1]] - ] - ) concat( - lower_curve_pts, - pie_curve_pts, - upper_curve_pts - ); - -function _shape_glued2circles_impl(radius, centre_dist, tangent_angle, t_step) = - let( - half_glued_circles = _glued2circles_half_glued_circle(radius, centre_dist, tangent_angle, t_step), - leng_half_glued_circles = len(half_glued_circles), - left_half_glued_circles = [ - for(i = 0; i < leng_half_glued_circles; i = i + 1) - let(pt = half_glued_circles[leng_half_glued_circles - 1 - i]) - [-pt[0], pt[1]] - ] - ) concat(half_glued_circles, left_half_glued_circles); \ No newline at end of file diff --git a/src/_impl/_shape_path_extend_impl.scad b/src/_impl/_shape_path_extend_impl.scad index 0b106e8e..e3abdf8c 100644 --- a/src/_impl/_shape_path_extend_impl.scad +++ b/src/_impl/_shape_path_extend_impl.scad @@ -1,6 +1,27 @@ use <../__comm__/__to3d.scad>; -use <../__comm__/__polytransversals.scad>; use <../ptf/ptf_rotate.scad>; +use <../util/reverse.scad>; + +function __polytransversals(transversals) = + let( + leng_trs = len(transversals), + leng_tr = len(transversals[0]), + lefts = [ + for(i = 1; i < leng_trs - 1; i = i + 1) + let(tr = transversals[leng_trs - i]) + tr[0] + ], + rights = [ + for(i = 1; i < leng_trs - 1; i = i + 1) + let(tr = transversals[i]) + tr[leng_tr - 1] + ] + ) concat( + transversals[0], + rights, + reverse(transversals[leng_trs - 1]), + lefts + ); function _shape_path_extend_az(p1, p2) = let( diff --git a/src/circle_path.scad b/src/circle_path.scad deleted file mode 100644 index 5a5e6e8f..00000000 --- a/src/circle_path.scad +++ /dev/null @@ -1,23 +0,0 @@ -/** -* circle_path.scad -* -* @copyright Justin Lin, 2017 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-circle_path.html -* -**/ - -use <__comm__/__frags.scad>; - -function circle_path(radius, n) = - let( - _ = echo("circle_path is deprecated: use shape_circle instead."), - _frags = __frags(radius), - step_a = 360 / _frags, - end_a = 360 - step_a * ((is_undef(n) || n > _frags) ? 1 : _frags - n + 1) - ) - [ - for(a = 0; a <= end_a; a = a + step_a) - [radius * cos(a), radius * sin(a)] - ]; diff --git a/src/pixel/_impl/_px_circle_impl.scad b/src/pixel/_impl/_px_circle_impl.scad deleted file mode 100644 index 873803cf..00000000 --- a/src/pixel/_impl/_px_circle_impl.scad +++ /dev/null @@ -1,54 +0,0 @@ -function _px_circle_y(f, y) = f >= 0 ? y - 1 : y; -function _px_circle_ddf_y(f, ddf_y) = f >= 0 ? ddf_y + 2 : ddf_y; -function _px_circle_f(f, ddf_y) = f >= 0 ? f + ddf_y : f; - -function _px_circle(f, ddf_x, ddf_y, x, y, filled) = - x >= y ? [] : - let( - ny = _px_circle_y(f, y), - nddf_y = _px_circle_ddf_y(f, ddf_y), - nx = x + 1, - nddf_x = ddf_x + 2, - nf = _px_circle_f(f, ddf_y) + nddf_x - ) - concat( - filled ? - concat( - [for(xi = -nx; xi <= nx; xi = xi + 1) [xi, -ny]], - [for(xi = -ny; xi <= ny; xi = xi + 1) [xi, -nx]], - [for(xi = -ny; xi <= ny; xi = xi + 1) [xi, nx]], - [for(xi = -nx; xi <= nx; xi = xi + 1) [xi, ny]] - ) - : - [ - [-nx, -ny], [nx, -ny], - [-ny, -nx], [ny, -nx], - [-ny, nx], [ny, nx], - [-nx, ny], [nx, ny] - ], - _px_circle(nf, nddf_x, nddf_y, nx, ny, filled) - ); - -function _px_circle_impl(radius, filled) = - let( - f = 1 - radius, - ddf_x = 1, - ddf_y = -2 * radius, - x = 0, - y = radius - ) - concat( - filled ? - concat( - [[0, radius], [0, -radius]], - [for(xi = -radius; xi <= radius; xi = xi + 1) [xi, 0]] - ) - : - [ - [0, -radius], - [-radius, 0], - [radius, 0], - [0, radius] - ], - _px_circle(f, ddf_x, ddf_y, x, y, filled) - ); \ No newline at end of file diff --git a/src/pixel/_impl/_px_cylinder_impl.scad b/src/pixel/_impl/_px_cylinder_impl.scad deleted file mode 100644 index a7639bd4..00000000 --- a/src/pixel/_impl/_px_cylinder_impl.scad +++ /dev/null @@ -1,50 +0,0 @@ - -function _px_cylinder_px_circle(radius, filled, thickness) = - let(range = [-radius: radius - 1]) - filled ? [ - for(y = range) - for(x = range) - let(v = [x, y]) - if(norm(v) < radius) v - ] : - let(ishell = radius * radius - 2 * thickness * radius) - [ - for(y = range) - for(x = range) - let( - v = [x, y], - leng = norm(v) - ) - if(leng < radius && (leng * leng) > ishell) v - ]; - -function _px_cylinder_diff_r(r, h, filled, thickness) = - let( - r1 = r[0], - r2 = r[1] - ) - r1 == r2 ? _px_cylinder_same_r(r1, h, filled, thickness) : - let(dr = (r2 - r1) / (h - 1)) - [ - for(i = 0; i < h; i = i + 1) - let(r = round(r1 + dr * i)) - each [ - for(pt = _px_cylinder_px_circle(r, filled, thickness)) - [pt[0], pt[1], i] - ] - ]; - -function _px_cylinder_same_r(r, h, filled, thickness) = - let(c = _px_cylinder_px_circle(r, filled, thickness)) - [ - for(i = 0; i < h; i = i + 1) - each [ - for(pt = c) - [pt[0], pt[1], i] - ] - ]; - -function _px_cylinder_impl(r, h, filled, thickness) = - is_num(r) ? - _px_cylinder_same_r(r, h, filled, thickness) : - _px_cylinder_diff_r(r, h, filled, thickness); \ No newline at end of file diff --git a/src/pixel/_impl/_px_from_impl.scad b/src/pixel/_impl/_px_from_impl.scad deleted file mode 100644 index f0cd564e..00000000 --- a/src/pixel/_impl/_px_from_impl.scad +++ /dev/null @@ -1,21 +0,0 @@ -function _px_from_row(r_count, row_bits, width, height, center, invert) = - let( - half_w = width / 2, - half_h = height / 2, - offset_x = center ? 0 : half_w, - offset_y = center ? -half_h : 0, - bit = invert ? 0 : 1 - ) - [for(i = 0; i < width; i = i + 1) if(row_bits[i] == bit) [i - half_w + offset_x, r_count + offset_y]]; - -function _px_from_impl(binaries, center, invert) = - let( - width = len(binaries[0]), - height = len(binaries), - offset_i = height / 2 - ) - [ - for(i = height - 1; i > -1; i = i - 1) - let(row = _px_from_row(height - i - 1, binaries[i], width, height, center, invert)) - if(row != []) each row - ]; \ No newline at end of file diff --git a/src/pixel/_impl/_px_gray_impl.scad b/src/pixel/_impl/_px_gray_impl.scad deleted file mode 100644 index 1da800fb..00000000 --- a/src/pixel/_impl/_px_gray_impl.scad +++ /dev/null @@ -1,29 +0,0 @@ -function _px_gray_row(r_count, row_bits, width, height, center, invert, normalize) = - let( - half_w = width / 2, - half_h = height / 2, - offset_x = center ? 0 : half_w, - offset_y = center ? -half_h : 0, - level = invert ? 0 : 255, - nmal = normalize ? 255 : 1 - ) - [ - for(i = 0; i < width; i = i + 1) - if(row_bits[i] != level) - [ - [i - half_w + offset_x, r_count + offset_y], - invert ? row_bits[i] / nmal : (255 - row_bits[i]) / nmal - ] - ]; - -function _px_gray_impl(levels, center, invert, normalize) = - let( - width = len(levels[0]), - height = len(levels), - offset_i = height / 2 - ) - [ - for(i = height - 1; i > -1; i = i - 1) - let(row = _px_gray_row(height - i - 1, levels[i], width, height, center, invert, normalize)) - if(row != []) each row - ]; \ No newline at end of file diff --git a/src/pixel/_impl/_px_line_impl.scad b/src/pixel/_impl/_px_line_impl.scad deleted file mode 100644 index f586bc34..00000000 --- a/src/pixel/_impl/_px_line_impl.scad +++ /dev/null @@ -1,202 +0,0 @@ - -use <../../__comm__/__to3d.scad>; -use <../../__comm__/__to2d.scad>; - -function _px_line_zsgn(a) = a == 0 ? a : a / abs(a); - -// x-dominant -function _px_line_xdominant_y(y, yd, sy) = yd >= 0 ? y + sy : y; -function _px_line_xdominant_yd(yd, ax, ay) = (yd >= 0 ? yd - ax : yd) + ay; -function _px_line_xdominant_z(z, zd, sz) = zd >= 0 ? z + sz : z; -function _px_line_xdominant_zd(zd, ax, az) = (zd >= 0 ? zd - ax : zd) + az; - -function _px_line_xdominant(start, end, a, s) = - let( - x = start[0], - y = start[1], - z = start[2], - ax = a[0], - ay = a[1], - az = a[2], - sx = s[0], - sy = s[1], - sz = s[2], - shrx = floor(ax / 2), - yd = ay - shrx, - zd = az - shrx, - endx = end[0] - ) - concat( - [start], - _px_line_xdominant_sub( - x + sx, - _px_line_xdominant_y(y, yd, sy), - _px_line_xdominant_z(z, zd, sz), - endx, - a, - s, - _px_line_xdominant_yd(yd, ax, ay), - _px_line_xdominant_zd(zd, ax, az) - ) - ); - -function _px_line_xdominant_sub(x, y, z, endx, a, s, yd, zd) = - let( - ax = a[0], - ay = a[1], - az = a[2], - sx = s[0], - sy = s[1], - sz = s[2] - ) - x == endx ? [] : - concat([[x, y, z]], - _px_line_xdominant_sub( - x + sx, - _px_line_xdominant_y(y, yd, sy), - _px_line_xdominant_z(z, zd, sz), - endx, - a, - s, - _px_line_xdominant_yd(yd, ax, ay), - _px_line_xdominant_zd(zd, ax, az) - ) - ); - -// y-dominant -function _px_line_ydominant_x(x, xd, sx) = xd >= 0 ? x + sx : x; -function _px_line_ydominant_xd(xd, ax, ay) = (xd >= 0 ? xd - ay : xd) + ax; -function _px_line_ydominant_z(z, zd, sz) = zd >= 0 ? z + sz : z; -function _px_line_ydominant_zd(zd, ay, az) = (zd >= 0 ? zd - ay : zd) + az; - -function _px_line_ydominant(start, end, a, s) = - let( - x = start[0], - y = start[1], - z = start[2], - ax = a[0], - ay = a[1], - az = a[2], - sx = s[0], - sy = s[1], - sz = s[2], - shry = floor(ay / 2), - xd = ax - shry, - zd = az - shry, - endy = end[1] - ) - concat( - [start], - _px_line_ydominant_sub( - _px_line_ydominant_x(x, xd, sx), - y + sy, - _px_line_ydominant_z(z, zd, sz), - endy, - a, - s, - _px_line_ydominant_xd(xd, ax, ay), - _px_line_ydominant_zd(zd, ay, az) - ) - ); - -function _px_line_ydominant_sub(x, y, z, endy, a, s, xd, zd) = - let( - ax = a[0], - ay = a[1], - az = a[2], - sx = s[0], - sy = s[1], - sz = s[2] - ) - y == endy ? [] : - concat([[x, y, z]], - _px_line_ydominant_sub( - _px_line_ydominant_x(x, xd, sx), - y + sy, - _px_line_ydominant_z(z, zd, sz), - endy, - a, - s, - _px_line_ydominant_xd(xd, ax, ay), - _px_line_ydominant_zd(zd, ay, az) - ) - ); - -// z-dominant -function _px_line_zdominant_x(x, xd, sx) = xd >= 0 ? x + sx : x; -function _px_line_zdominant_xd(xd, ax, az) = (xd >= 0 ? xd - az : xd) + ax; - -function _px_line_zdominant_y(y, yd, sy) = yd >= 0 ? y + sy : y; -function _px_line_zdominant_yd(yd, ay, az) = (yd >= 0 ? yd - az : yd) + ay; - -function _px_line_zdominant(start, end, a, s) = - let( - x = start[0], - y = start[1], - z = start[2], - ax = a[0], - ay = a[1], - az = a[2], - sx = s[0], - sy = s[1], - sz = s[2], - shrz = floor(az / 2), - xd = ax - shrz, - yd = ay - shrz, - endz = end[2] - ) - concat( - [start], - _px_line_zdominant_sub( - _px_line_zdominant_x(x, xd, sx), - _px_line_zdominant_y(y, yd, sy), - z + sz, - endz, - a, - s, - _px_line_zdominant_xd(xd, ax, az), - _px_line_zdominant_yd(yd, ay, az) - ) - ); - -function _px_line_zdominant_sub(x, y, z, endz, a, s, xd, yd) = - let( - ax = a[0], - ay = a[1], - az = a[2], - sx = s[0], - sy = s[1], - sz = s[2] - ) - z == endz ? [] : - concat([[x, y, z]], - _px_line_zdominant_sub( - _px_line_zdominant_x(x, xd, sx), - _px_line_zdominant_y(y, yd, sy), - z + sz, - endz, - a, - s, - _px_line_zdominant_xd(xd, ax, az), - _px_line_zdominant_yd(yd, ay, az) - ) - ); - -function _px_line_impl(p1, p2) = - let( - is_2d = len(p1) == 2, - start_pt = is_2d ? __to3d(p1) : p1, - end_pt = is_2d ? __to3d(p2) : p2, - dt = end_pt - start_pt, - ax = floor(abs(dt[0]) * 2), - ay = floor(abs(dt[1]) * 2), - az = floor(abs(dt[2]) * 2), - sx = _px_line_zsgn(dt[0]), - sy = _px_line_zsgn(dt[1]), - sz = _px_line_zsgn(dt[2]), - points = ax >= max(ay, az) ? _px_line_xdominant(start_pt, end_pt, [ax, ay, az], [sx, sy, sz]) : ( - ay >= max(ax, az) ? _px_line_ydominant(start_pt, end_pt, [ax, ay, az], [sx, sy, sz]) : - _px_line_zdominant(start_pt, end_pt, [ax, ay, az], [sx, sy, sz]) - ) - ) - is_2d ? [for(pt = points) __to2d(pt)] : points; \ No newline at end of file diff --git a/src/pixel/px_ascii.scad b/src/pixel/px_ascii.scad deleted file mode 100644 index 551ecccb..00000000 --- a/src/pixel/px_ascii.scad +++ /dev/null @@ -1,974 +0,0 @@ -/** -* px_ascii.scad -* -* @copyright Justin Lin, 2019 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-px_ascii.html -* -**/ - -use ; - -function px_ascii(char, center = false, invert = false) = - let( - _ = echo("pixel/px_ascii is deprecated: use voxel/vx_ascii instead."), - code = ord(char) - ) - assert(code > 31 && code < 127, "not printable character") - let( - idx = code - 32, - binaries = [ - [// " " - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "!" - [0,0,0,0,0,0,0,0], - [0,0,0,0,1,0,0,0], - [0,0,0,0,1,0,0,0], - [0,0,0,0,1,0,0,0], - [0,0,0,0,1,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "\"" - [0,0,0,0,0,0,0,0], - [0,0,0,1,0,1,0,0], - [0,0,0,1,0,1,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "#" - [0,0,0,0,0,0,0,0], - [0,0,1,0,0,1,0,0], - [0,1,1,1,1,1,1,0], - [0,0,1,0,0,1,0,0], - [0,0,1,0,0,1,0,0], - [0,1,1,1,1,1,1,0], - [0,0,1,0,0,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "$" - [0,0,0,0,0,0,0,0], - [0,0,0,1,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,0,1,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,0,0,1,0,0,1,0], - [0,1,1,1,1,1,0,0], - [0,0,0,1,0,0,0,0] - ], - [// "%" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,1,0,0,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "&" - [0,0,0,0,0,0,0,0], - [0,0,1,1,0,0,0,0], - [0,1,0,0,1,0,0,0], - [0,0,1,1,0,0,0,0], - [0,1,0,0,1,0,1,0], - [0,1,0,0,0,1,0,0], - [0,0,1,1,1,0,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "'" - [0,0,0,0,0,0,0,0], - [0,0,0,0,1,0,0,0], - [0,0,0,0,1,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "(" - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,1,0,0], - [0,0,1,1,1,0,0,0], - [0,0,1,1,0,0,0,0], - [0,0,1,1,0,0,0,0], - [0,0,1,1,1,0,0,0], - [0,0,0,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// ")" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,0,0,0], - [0,0,0,1,1,1,0,0], - [0,0,0,0,1,1,0,0], - [0,0,0,0,1,1,0,0], - [0,0,0,1,1,1,0,0], - [0,0,1,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "*" - [0,0,0,0,0,0,0,0], - [0,1,0,1,0,1,0,0], - [0,0,1,1,1,0,0,0], - [0,0,0,1,0,0,0,0], - [0,0,1,1,1,0,0,0], - [0,1,0,1,0,1,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "+" - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,1,1,1,1,1,1,0], - [0,1,1,1,1,1,1,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "," - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,0,0,0,0] - ], - [// "-" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "." - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "/" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,1,1,0], - [0,0,0,0,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "0" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,1,1,1,0], - [0,1,1,1,1,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "1" - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "2" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,0,0,0,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "3" - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "4" - [0,0,0,0,0,0,0,0], - [0,0,0,0,1,1,0,0], - [0,0,0,1,1,1,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,1,1,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "5" - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,1,1,0,0,0,0,0], - [0,1,1,1,1,1,0,0], - [0,0,0,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "6" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "7" - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,0,1,1,0], - [0,0,0,0,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,0,0,0,0], - [0,0,1,1,0,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "8" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "9" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,1,0], - [0,0,0,0,0,1,1,0], - [0,0,0,0,1,1,0,0], - [0,0,1,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// ":" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// ";" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,0,0,0,0] - ], - [// "<" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,1,1,0], - [0,0,0,0,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,1,1,0,0], - [0,0,0,0,0,1,1,0] - ], - [// "=" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// ">" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,0,1,1,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,0,0,0,0], - [0,1,1,0,0,0,0,0] - ], - [// "?" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,0,0,0,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "@" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,1,0,1,0], - [0,1,1,0,1,1,1,0], - [0,1,1,0,0,0,0,0], - [0,0,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "A" - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,1,1,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "B" - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "C" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "D" - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,0,0,0], - [0,1,1,0,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,1,1,0,0], - [0,1,1,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "E" - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,1,1,0,0,0,0,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "F" - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,1,1,0,0,0,0,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "G" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,1,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,1,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "H" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,1,1,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "I" - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "J" - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,1,1,0], - [0,0,0,0,1,1,0,0], - [0,0,0,0,1,1,0,0], - [0,0,0,0,1,1,0,0], - [0,1,0,0,1,1,0,0], - [0,1,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0], - ], - [// "K" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,1,1,0,0], - [0,1,1,1,1,0,0,0], - [0,1,1,1,1,0,0,0], - [0,1,1,0,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "L" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "M" - [0,0,0,0,0,0,0,0], - [1,1,0,0,0,1,1,0], - [1,1,1,0,1,1,1,0], - [1,1,1,1,1,1,1,0], - [1,1,0,1,0,1,1,0], - [1,1,0,0,0,1,1,0], - [1,1,0,0,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "N" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,1,0,1,1,0], - [0,1,1,1,1,1,1,0], - [0,1,1,1,1,1,1,0], - [0,1,1,0,1,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "O" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "P" - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "Q" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,1,1,1,0,0], - [0,0,1,1,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "R" - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "S" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,1,1,0], - [0,0,0,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "T" - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "U" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "V" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "W" - [0,0,0,0,0,0,0,0], - [1,1,0,0,0,1,1,0], - [1,1,0,0,0,1,1,0], - [1,1,0,1,0,1,1,0], - [1,1,1,1,1,1,1,0], - [1,1,1,0,1,1,1,0], - [1,1,0,0,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "X" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "Y" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "Z" - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "/" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,0,1,1,0,0,0,0], - [0,0,1,1,0,0,0,0], - [0,0,1,1,0,0,0,0], - [0,0,1,1,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "\\" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,0,1,1,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,1,1,0,0], - [0,0,0,0,0,1,1,0], - [0,0,0,0,0,0,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "]" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,1,1,0,0], - [0,0,0,0,1,1,0,0], - [0,0,0,0,1,1,0,0], - [0,0,0,0,1,1,0,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "^" - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,0,0,0,0,1,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "_" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [1,1,1,1,1,1,1,1] - ], - [// "`" - [0,0,0,0,0,0,0,0], - [0,0,0,1,0,0,0,0], - [0,0,0,0,1,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "a" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,1,1,0], - [0,0,1,1,1,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "b" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "c" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "d" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,1,1,0], - [0,0,0,0,0,1,1,0], - [0,0,1,1,1,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "e" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,1,1,1,1,0], - [0,1,1,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "f" - [0,0,0,0,0,0,0,0], - [0,0,0,0,1,1,1,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,1,1,1,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "g" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,1,0], - [0,0,0,0,0,1,1,0], - [0,1,1,1,1,1,0,0] - ], - [// "h" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "i" - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "j" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,1,1,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,1,1,0], - [0,0,0,0,0,1,1,0], - [0,0,0,0,0,1,1,0], - [0,0,0,0,0,1,1,0], - [0,0,1,1,1,1,0,0] - ], - [// "k" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,1,1,0,0], - [0,1,1,1,1,0,0,0], - [0,1,1,0,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "l" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "m" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,1,1,1,1,1], - [0,1,1,1,1,1,1,1], - [0,1,1,0,1,0,1,1], - [0,1,1,0,0,0,1,1], - [0,0,0,0,0,0,0,0] - ], - [// "n" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "o" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "p" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0] - ], - [// "q" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,1,0], - [0,0,0,0,0,1,1,0], - [0,0,0,0,0,1,1,0] - ], - [// "r" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "s" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,1,0], - [0,1,1,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,1,1,0], - [0,1,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "t" - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "u" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "v" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "w" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,0,1,1], - [0,1,1,0,1,0,1,1], - [0,1,1,1,1,1,1,1], - [0,0,1,1,1,1,1,0], - [0,0,1,1,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "x" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "y" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "z" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "{" - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,1,0,0], - [0,0,1,1,0,0,0,0], - [0,1,1,1,0,0,0,0], - [0,1,1,1,0,0,0,0], - [0,0,1,1,0,0,0,0], - [0,0,0,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "|" - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "}" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,0,0,0], - [0,0,0,0,1,1,0,0], - [0,0,0,0,1,1,1,0], - [0,0,0,0,1,1,1,0], - [0,0,0,0,1,1,0,0], - [0,0,1,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "~" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,1,1,0,0,0,0], - [0,1,0,1,1,0,1,0], - [0,0,0,0,1,1,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0] - ] - ] - ) - px_from(binaries[idx], center = center, invert = invert); \ No newline at end of file diff --git a/src/pixel/px_circle.scad b/src/pixel/px_circle.scad deleted file mode 100644 index d55c8040..00000000 --- a/src/pixel/px_circle.scad +++ /dev/null @@ -1,20 +0,0 @@ -/** -* px_circle.scad -* -* @copyright Justin Lin, 2019 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-px_circle.html -* -**/ - -use <_impl/_px_circle_impl.scad>; -use <../util/sort.scad>; -use <../util/dedup.scad>; - -function px_circle(radius, filled = false) = - let( - _ = echo("pixel/px_circle is deprecated: use voxel/vx_circle instead."), - all = _px_circle_impl(radius, filled) - ) - dedup(sort(all, by = "vt"), sorted = true); \ No newline at end of file diff --git a/src/pixel/px_cylinder.scad b/src/pixel/px_cylinder.scad deleted file mode 100644 index 63cf6352..00000000 --- a/src/pixel/px_cylinder.scad +++ /dev/null @@ -1,20 +0,0 @@ -/** -* px_cylinder.scad -* -* @copyright Justin Lin, 2019 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-px_cylinder.html -* -**/ - -use <_impl/_px_cylinder_impl.scad>; -use <../util/sort.scad>; -use <../util/dedup.scad>; - -function px_cylinder(r, h, filled = false, thickness = 1) = - let( - _ = echo("pixel/px_cylinder is deprecated: use voxel/vx_cylinder instead."), - all = _px_cylinder_impl(r, h, filled, thickness) - ) - dedup(sort(all, by = "vt"), sorted = true); \ No newline at end of file diff --git a/src/pixel/px_from.scad b/src/pixel/px_from.scad deleted file mode 100644 index 040512ef..00000000 --- a/src/pixel/px_from.scad +++ /dev/null @@ -1,17 +0,0 @@ -/** -* px_from.scad -* -* @copyright Justin Lin, 2019 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-px_from.html -* -**/ - -use <_impl/_px_from_impl.scad>; - -function px_from(binaries, center = false, invert = false) = - let( - _ = echo("pixel/px_from is deprecated: use voxel/vx_from instead.") - ) - _px_from_impl(binaries, center, invert); \ No newline at end of file diff --git a/src/pixel/px_gray.scad b/src/pixel/px_gray.scad deleted file mode 100644 index 15e9ba2b..00000000 --- a/src/pixel/px_gray.scad +++ /dev/null @@ -1,17 +0,0 @@ -/** -* px_gray.scad -* -* @copyright Justin Lin, 2019 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-px_gray.html -* -**/ - -use <_impl/_px_gray_impl.scad>; - -function px_gray(levels, center = false, invert = false, normalize = false) = - let( - _ = echo("pixel/px_gray is deprecated: use voxel/vx_gray instead.") - ) - _px_gray_impl(levels, center, invert, normalize); \ No newline at end of file diff --git a/src/pixel/px_line.scad b/src/pixel/px_line.scad deleted file mode 100644 index 52ae407a..00000000 --- a/src/pixel/px_line.scad +++ /dev/null @@ -1,17 +0,0 @@ -/** -* px_line.scad -* -* @copyright Justin Lin, 2019 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-px_line.html -* -**/ - -use <_impl/_px_line_impl.scad>; - -function px_line(p1, p2) = - let( - _ = echo("pixel/px_line is deprecated: use voxel/vx_line instead.") - ) - _px_line_impl(p1, p2); \ No newline at end of file diff --git a/src/pixel/px_polygon.scad b/src/pixel/px_polygon.scad deleted file mode 100644 index ae176a50..00000000 --- a/src/pixel/px_polygon.scad +++ /dev/null @@ -1,34 +0,0 @@ -use <../in_shape.scad>; -use <../util/sort.scad>; -use <../util/dedup.scad>; -use ; - -function px_polygon(points, filled = false) = - let( - _ = echo("pixel/px_polygon is deprecated: use voxel/vx_polygon instead."), - contour = px_polyline(concat(points, [points[0]])) - ) - !filled ? contour : - let( - sortedXY = sort(contour, by = "vt"), - ys = [for(p = sortedXY) p[1]], - rows = [ - for(y = [min(ys):max(ys)]) - let( - idxes = search(y, sortedXY, num_returns_per_match = 0, index_col_num = 1) - ) - [for(i = idxes) sortedXY[i]] - ], - all = concat( - sortedXY, - [ - for(row = rows) - let(to = len(row) - 1, y = row[0][1]) - if(to > 0 && (row[0][0] + 1 != row[to][0])) - for(i = [row[0][0] + 1:row[to][0] - 1]) - let(p = [i, y]) - if(in_shape(points, p)) p - ] - ) - ) - dedup(sort(all, by = "vt"), sorted = true); \ No newline at end of file diff --git a/src/pixel/px_polyline.scad b/src/pixel/px_polyline.scad deleted file mode 100644 index 9c33be9b..00000000 --- a/src/pixel/px_polyline.scad +++ /dev/null @@ -1,29 +0,0 @@ -/** -* px_polyline.scad -* -* @copyright Justin Lin, 2019 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-px_polyline.html -* -**/ - -use <../__comm__/__to3d.scad>; -use <../__comm__/__to2d.scad>; -use <../__comm__/__lines_from.scad>; -use <../util/sort.scad>; -use <../util/dedup.scad>; -use ; - -function px_polyline(points) = - let( - _ = echo("pixel/px_polyline is deprecated: use voxel/vx_polyline instead."), - is_2d = len(points[0]) == 2, - pts = is_2d ? [for(pt = points) __to3d(pt)] : points, - polyline = [for(line = __lines_from(pts)) each px_line(line[0], line[1])] - ) - dedup(is_2d ? - sort([for(pt = polyline) __to2d(pt)], by = "vt") - : - sort(polyline, by = "vt") - , sorted = true); \ No newline at end of file diff --git a/src/pixel/px_sphere.scad b/src/pixel/px_sphere.scad deleted file mode 100644 index 9475be12..00000000 --- a/src/pixel/px_sphere.scad +++ /dev/null @@ -1,34 +0,0 @@ -/** -* px_sphere.scad -* -* @copyright Justin Lin, 2019 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-px_sphere.html -* -**/ - -function px_sphere(radius, filled = false, thickness = 1) = - let( - _ = echo("pixel/px_sphere is deprecated: use voxel/vx_sphere instead."), - range = [-radius: radius - 1] - ) - filled ? [ - for(z = range) - for(y = range) - for(x = range) - let(v = [x, y, z]) - if(norm(v) < radius) v - ] : - let(ishell = radius * radius - 2 * thickness * radius) - [ - for(z = range) - for(y = range) - for(x = range) - let( - v = [x, y, z], - leng = norm(v) - ) - if(leng < radius && (leng * leng) > ishell) v - ]; - \ No newline at end of file diff --git a/src/polysections.scad b/src/polysections.scad deleted file mode 100644 index 0d677d7b..00000000 --- a/src/polysections.scad +++ /dev/null @@ -1,255 +0,0 @@ -/** -* polysections.scad -* -* @copyright Justin Lin, 2017 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-polysections.html -* -**/ - -use ; - -module polysections(sections, triangles = "SOLID") { - echo("polysections is deprecated: use sweep instead."); - - function side_indexes(sects, begin_idx = 0) = - let( - leng_sects = len(sects), - leng_pts_sect = len(sects[0]), - range_j = [begin_idx:leng_pts_sect:begin_idx + (leng_sects - 2) * leng_pts_sect], - range_i = [0:leng_pts_sect - 1] - ) - concat( - [ - for(j = range_j) - for(i = range_i) - [ - j + i, - j + (i + 1) % leng_pts_sect, - j + (i + 1) % leng_pts_sect + leng_pts_sect - ] - ], - [ - for(j = range_j) - for(i = range_i) - [ - j + i, - j + (i + 1) % leng_pts_sect + leng_pts_sect , - j + i + leng_pts_sect - ] - ] - ); - - function search_at(f_sect, p, leng_pts_sect, i = 0) = - i < leng_pts_sect ? - (p == f_sect[i] ? i : search_at(f_sect, p, leng_pts_sect, i + 1)) : -1; - - function the_same_after_twisting(f_sect, l_sect, leng_pts_sect) = - let( - found_at_i = search_at(f_sect, l_sect[0], leng_pts_sect) - ) - found_at_i <= 0 ? false : - l_sect == concat( - [for(i = found_at_i; i < leng_pts_sect; i = i + 1) f_sect[i]], - [for(i = 0; i < found_at_i; i = i + 1) f_sect[i]] - ); - - function to_v_pts(sects) = - [ - for(sect = sects) - for(pt = sect) - pt - ]; - - module solid_sections(sects) { - - leng_sects = len(sects); - leng_pts_sect = len(sects[0]); - first_sect = sects[0]; - last_sect = sects[leng_sects - 1]; - - v_pts = [ - for(sect = sects) - for(pt = sect) - pt - ]; - - begin_end_the_same = - first_sect == last_sect || - the_same_after_twisting(first_sect, last_sect, leng_pts_sect); - - if(begin_end_the_same) { - f_idxes = side_indexes(sects); - - polyhedron( - v_pts, - f_idxes - ); - - // hook for testing - test_polysections_solid(v_pts, f_idxes, triangles); - } else { - range_i = [0:leng_pts_sect - 1]; - first_idxes = [for(i = range_i) leng_pts_sect - 1 - i]; - last_idxes = [ - for(i = range_i) - i + leng_pts_sect * (leng_sects - 1) - ]; - - f_idxes = concat([first_idxes], side_indexes(sects), [last_idxes]); - - polyhedron( - v_pts, - f_idxes - ); - - // hook for testing - test_polysections_solid(v_pts, f_idxes, triangles); - } - } - - module hollow_sections(sects) { - leng_sects = len(sects); - leng_sect = len(sects[0]); - half_leng_sect = leng_sect / 2; - half_leng_v_pts = leng_sects * half_leng_sect; - - function strip_sects(begin_idx, end_idx) = - [ - for(i = 0; i < leng_sects; i = i + 1) - [ - for(j = begin_idx; j <= end_idx; j = j + 1) - sects[i][j] - ] - ]; - - function first_idxes() = - [ - for(i = 0; i < half_leng_sect; i = i + 1) - [ - i, - i + half_leng_v_pts, - (i + 1) % half_leng_sect + half_leng_v_pts, - (i + 1) % half_leng_sect - ] - ]; - - function last_idxes(begin_idx) = - [ - for(i = 0; i < half_leng_sect; i = i + 1) - [ - begin_idx + i, - begin_idx + (i + 1) % half_leng_sect, - begin_idx + (i + 1) % half_leng_sect + half_leng_v_pts, - begin_idx + i + half_leng_v_pts - ] - ]; - - outer_sects = strip_sects(0, half_leng_sect - 1); - inner_sects = strip_sects(half_leng_sect, leng_sect - 1); - - outer_v_pts = to_v_pts(outer_sects); - inner_v_pts = to_v_pts(inner_sects); - - outer_idxes = side_indexes(outer_sects); - inner_idxes = [ - for(idxes = side_indexes(inner_sects, half_leng_v_pts)) - reverse(idxes) - ]; - - first_outer_sect = outer_sects[0]; - last_outer_sect = outer_sects[leng_sects - 1]; - first_inner_sect = inner_sects[0]; - last_inner_sect = inner_sects[leng_sects - 1]; - - leng_pts_sect = len(first_outer_sect); - - begin_end_the_same = - (first_outer_sect == last_outer_sect && first_inner_sect == last_inner_sect) || - ( - the_same_after_twisting(first_outer_sect, last_outer_sect, leng_pts_sect) && - the_same_after_twisting(first_inner_sect, last_inner_sect, leng_pts_sect) - ); - - v_pts = concat(outer_v_pts, inner_v_pts); - - if(begin_end_the_same) { - f_idxes = concat(outer_idxes, inner_idxes); - - polyhedron( - v_pts, - f_idxes - ); - - // hook for testing - test_polysections_solid(v_pts, f_idxes, triangles); - } else { - first_idxes = first_idxes(); - last_idxes = last_idxes(half_leng_v_pts - half_leng_sect); - - f_idxes = concat(first_idxes, outer_idxes, inner_idxes, last_idxes); - - polyhedron( - v_pts, - f_idxes - ); - - // hook for testing - test_polysections_solid(v_pts, f_idxes, triangles); - } - } - - module triangles_defined_sections() { - module tri_sections(tri1, tri2) { - hull() polyhedron( - points = concat(tri1, tri2), - faces = [ - [0, 1, 2], - [3, 5, 4], - [1, 3, 4], [2, 1, 4], [2, 3, 0], - [0, 3, 1], [2, 4, 5], [2, 5, 3] - ] - ); - } - - module two_sections(section1, section2) { - for(idx = triangles) { - tri_sections( - [ - section1[idx[0]], - section1[idx[1]], - section1[idx[2]] - ], - [ - section2[idx[0]], - section2[idx[1]], - section2[idx[2]] - ] - ); - } - } - - for(i = [0:len(sections) - 2]) { - two_sections( - sections[i], - sections[i + 1] - ); - } - } - - if(triangles == "SOLID") { - solid_sections(sections); - } else if(triangles == "HOLLOW") { - hollow_sections(sections); - } - else { - triangles_defined_sections(); - } -} - -// override it to test - -module test_polysections_solid(points, faces, triangles) { - -} \ No newline at end of file diff --git a/src/polytransversals.scad b/src/polytransversals.scad deleted file mode 100644 index e0cebbd9..00000000 --- a/src/polytransversals.scad +++ /dev/null @@ -1,18 +0,0 @@ -/** -* polytransversals.scad -* -* @copyright Justin Lin, 2017 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-polytransversals.html -* -**/ - -use <__comm__/__polytransversals.scad>; - -module polytransversals(transversals) { - echo("polytransversals is deprecated."); - polygon( - __polytransversals(transversals) - ); -} \ No newline at end of file diff --git a/src/rotate_p.scad b/src/rotate_p.scad deleted file mode 100644 index f1990aed..00000000 --- a/src/rotate_p.scad +++ /dev/null @@ -1,15 +0,0 @@ -/** -* rotate_p.scad -* -* @copyright Justin Lin, 2017 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-rotate_p.html -* -**/ - -use ; - -function rotate_p(point, a, v) = - let(_ = echo("rotate_p is deprecated: use ptf_rotate instead.")) - _rotate_p_impl(point, a, v); \ No newline at end of file diff --git a/src/shape_glued2circles.scad b/src/shape_glued2circles.scad deleted file mode 100644 index d78df425..00000000 --- a/src/shape_glued2circles.scad +++ /dev/null @@ -1,15 +0,0 @@ - -/** -* shape_glued2circles.scad -* -* @copyright Justin Lin, 2017 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-shape_glued2circles.html -* -**/ - -use <_impl/_shape_glued2circles_impl.scad>; - -function shape_glued2circles(radius, centre_dist, tangent_angle = 30, t_step = 0.1) = - _shape_glued2circles_impl(radius, centre_dist, tangent_angle, t_step); \ No newline at end of file diff --git a/src/voronoi2d.scad b/src/voronoi2d.scad deleted file mode 100644 index 7d307d76..00000000 --- a/src/voronoi2d.scad +++ /dev/null @@ -1,57 +0,0 @@ -/** -* voronoi2d.scad -* -* @copyright Justin Lin, 2019 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-voronoi2d.html -* -**/ - -module voronoi2d(points, spacing = 1, r = 0, delta = 0, chamfer = false, region_type = "square") { - echo("voronoi2d is deprecated: use voronoi/vrn2_from instead."); - - xs = [for(p = points) p[0]]; - ys = [for(p = points) abs(p[1])]; - - region_size = max([(max(xs) - min(xs) / 2), (max(ys) - min(ys)) / 2]); - half_region_size = 0.5 * region_size; - offset_leng = spacing * 0.5 + half_region_size; - - function normalize(v) = v / norm(v); - - module region(pt) { - intersection_for(p = points) { - if(pt != p) { - v = p - pt; - translate((pt + p) / 2 - normalize(v) * offset_leng) - rotate(atan2(v[1], v[0])) - children(); - } - } - } - - module offseted_region(pt) { - if(r != 0) { - offset(r) - region(pt) - children(); - } - else { - offset(delta = delta, chamfer = chamfer) - region(pt) - children(); - } - } - - for(p = points) { - if(region_type == "square") { - offseted_region(p) - square(region_size, center = true); - } - else { - offseted_region(p) - circle(half_region_size); - } - } -} \ No newline at end of file diff --git a/src/voronoi3d.scad b/src/voronoi3d.scad deleted file mode 100644 index 0fa069d4..00000000 --- a/src/voronoi3d.scad +++ /dev/null @@ -1,45 +0,0 @@ -/** -* voronoi3d.scad -* -* @copyright Justin Lin, 2019 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-voronoi3d.html -* -**/ - -use <__comm__/__angy_angz.scad>; - -// slow but workable - -module voronoi3d(points, spacing = 1) { - echo("voronoi3d is deprecated: use voronoi/vrn3_from instead."); - - xs = [for(p = points) p[0]]; - ys = [for(p = points) abs(p[1])]; - zs = [for(p = points) abs(p[2])]; - - space_size = max([max(xs) - min(xs), max(ys) - min(ys), max(zs) - min(zs)]); - half_space_size = 0.5 * space_size; - double_space_size = 2 * space_size; - offset_leng = (spacing + space_size) * 0.5; - - function normalize(v) = v / norm(v); - - module space(pt) { - intersection_for(p = points) { - if(pt != p) { - v = p - pt; - ryz = __angy_angz(p, pt); - - translate((pt + p) / 2 - normalize(v) * offset_leng) - rotate([0, -ryz[0], ryz[1]]) - cube([space_size, double_space_size, double_space_size], center = true); - } - } - } - - for(p = points) { - space(p); - } -} \ No newline at end of file diff --git a/test/test_all.scad b/test/test_all.scad index 1acbefcb..90a95c4c 100644 --- a/test/test_all.scad +++ b/test/test_all.scad @@ -44,7 +44,6 @@ include ; include ; include ; include ; -include ; include ; include ; include ; From 467124a89b7e17279a2885d1f4741ee8e9e5296f Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sat, 6 Feb 2021 18:02:10 +0800 Subject: [PATCH 03/99] update README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 51454c59..ee6c8527 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# dotSCAD 2.5 +# dotSCAD 3.0 Dev > **Reduce the burden of mathematics/algorithm when playing OpenSCAD.** @@ -8,7 +8,7 @@ ## Introduction -**This library requires OpenSCAD 2019.05 or later.** +**This library requires OpenSCAD 2021.01 or later.** Some of my [3D models](https://github.com/JustinSDK/dotSCAD#examples) require complex mathematics/algorithm. I extract them into dotSCAD. Hope it helps when you're playing OpenSCAD. From 21324c2ad218fe3d9b773e013f359f074e3c382b Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 7 Feb 2021 12:13:32 +0800 Subject: [PATCH 04/99] by supports a function literal --- README.md | 2 +- docs/{lib2x-sort.md => lib3x-sort.md} | 11 +++++++---- src/util/_impl/_sort_impl.scad | 12 +++++++++++- src/util/sort.scad | 3 ++- test/util/test_sort.scad | 25 +++++++++++++++---------- 5 files changed, 36 insertions(+), 17 deletions(-) rename docs/{lib2x-sort.md => lib3x-sort.md} (59%) diff --git a/README.md b/README.md index ee6c8527..67362a02 100644 --- a/README.md +++ b/README.md @@ -139,7 +139,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [util/parse_number](https://openhome.cc/eGossip/OpenSCAD/lib2x-parse_number.html) - [util/reverse](https://openhome.cc/eGossip/OpenSCAD/lib2x-reverse.html) - [util/slice](https://openhome.cc/eGossip/OpenSCAD/lib2x-slice.html) -- [util/sort](https://openhome.cc/eGossip/OpenSCAD/lib2x-sort.html) +- [util/sort](https://openhome.cc/eGossip/OpenSCAD/lib3x-sort.html) - [util/rand](https://openhome.cc/eGossip/OpenSCAD/lib2x-rand.html) - [util/fibseq](https://openhome.cc/eGossip/OpenSCAD/lib2x-fibseq.html) - [util/bsearch](https://openhome.cc/eGossip/OpenSCAD/lib2x-bsearch.html) diff --git a/docs/lib2x-sort.md b/docs/lib3x-sort.md similarity index 59% rename from docs/lib2x-sort.md rename to docs/lib3x-sort.md index 7a138178..bd0b27e7 100644 --- a/docs/lib2x-sort.md +++ b/docs/lib3x-sort.md @@ -2,14 +2,12 @@ Sorts the elements of a list in ascending order. The list is a list-of-list construct, such as `[[a0, a1, a2...], [b0, b1, b2,...], [c0, c1, c2,...],...]`. When sorting, the function looks only at one index position of each sublist. -From dotSCAD 2.3, when `by` is `"vt"`, it will sort points by zyx (from the last index to the first one). - **Since:** 2.0 ## Parameters - `lt` : The original list. -- `by` : Can be `"x"`、`"y"`、`"z"`, `"idx"` (Default) or `"vt"`. +- `by` : Can be `"x"`、`"y"`、`"z"`, or `"idx"` (Default). `"vt"`. From dotSCAD 2.3, when `by` is `"vt"`, it will sort points by zyx (from the last index to the first one). From dotSCAD 3.0, `by` supports a function literal that compares its two arguments for order. Returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second. - `idx` : When `by` is `"idx"`, the value of `idx` is used. The Default value is 0. ## Examples @@ -29,4 +27,9 @@ From dotSCAD 2.3, when `by` is `"vt"`, it will sort points by zyx (from the last assert( [[0, 2, 0], [0, 5, 0], [0, 7, 0], [0, 9, 0], [0, 10, 0]] == sort([[0, 10, 0], [0, 5, 0], [0, 7, 0], [0, 2, 0], [0, 9, 0]], by = "idx", idx = 1) - ); \ No newline at end of file + ); + + ascending = function(e1, e2) e1 - e2; + descending = function(e1, e2) e2 - e1; + assert(sort([2, 1, 3, 5, 4], by = ascending) == [1, 2, 3, 4, 5]); + assert(sort([2, 1, 3, 5, 4], by = descending) == [5, 4, 3, 2, 1]); \ No newline at end of file diff --git a/src/util/_impl/_sort_impl.scad b/src/util/_impl/_sort_impl.scad index d3b5f5ad..a6934a08 100644 --- a/src/util/_impl/_sort_impl.scad +++ b/src/util/_impl/_sort_impl.scad @@ -25,4 +25,14 @@ function _sort_by(lt, by, idx) = dict = [["x", 0], ["y", 1], ["z", 2], ["i", idx]], i = dict[search(by == "idx" ? "i" : by, dict)[0]][1] ) - _sort_by_idx(lt, i); \ No newline at end of file + _sort_by_idx(lt, i); + +function _sort_by_comp(lt, comp) = + let(leng = len(lt)) + leng <= 1 ? lt : + let( + pivot = lt[0], + before = [for(j = 1; j < leng; j = j + 1) if(comp(lt[j], pivot) < 0) lt[j]], + after = [for(j = 1; j < leng; j = j + 1) if(comp(lt[j], pivot) >= 0) lt[j]] + ) + concat(_sort_by_comp(before, comp), [pivot], _sort_by_comp(after, comp)); \ No newline at end of file diff --git a/src/util/sort.scad b/src/util/sort.scad index 507e47e2..8cb70c06 100644 --- a/src/util/sort.scad +++ b/src/util/sort.scad @@ -4,12 +4,13 @@ * @copyright Justin Lin, 2019 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-sort.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-sort.html * **/ use <_impl/_sort_impl.scad>; function sort(lt, by = "idx", idx = 0) = + is_function(by) ? _sort_by_comp(lt, by) : // support function literal by == "vt" ? _vt_sort(lt) : // for example, sort by zyx for a list of points _sort_by(lt, by, idx); \ No newline at end of file diff --git a/test/util/test_sort.scad b/test/util/test_sort.scad index e45ab38a..262ec525 100644 --- a/test/util/test_sort.scad +++ b/test/util/test_sort.scad @@ -4,20 +4,25 @@ use ; module test_sort() { echo("==== test_sort ===="); - assertEqualPoints( - [[2, 0, 0], [5, 0, 0], [7, 0, 0], [9, 0, 0], [10, 0, 0]], + assert( + [[2, 0, 0], [5, 0, 0], [7, 0, 0], [9, 0, 0], [10, 0, 0]] == + sort([[10, 0, 0], [5, 0, 0], [7, 0, 0], [2, 0, 0], [9, 0, 0]]) + ); + + assert( + [[2, 0, 0], [5, 0, 0], [7, 0, 0], [9, 0, 0], [10, 0, 0]] == sort([[10, 0, 0], [5, 0, 0], [7, 0, 0], [2, 0, 0], [9, 0, 0]], by = "x") ); - assertEqualPoints( - [[2, 0, 0], [5, 0, 0], [7, 0, 0], [9, 0, 0], [10, 0, 0]], - sort([[10, 0, 0], [5, 0, 0], [7, 0, 0], [2, 0, 0], [9, 0, 0]], by = "idx", idx = 0) - ); - - assertEqualPoints( - [[0, 2, 0], [0, 5, 0], [0, 7, 0], [0, 9, 0], [0, 10, 0]], - sort([[0, 10, 0], [0, 5, 0], [0, 7, 0], [0, 2, 0], [0, 9, 0]], by = "y") + assert( + [[0, 2, 0], [0, 5, 0], [0, 7, 0], [0, 9, 0], [0, 10, 0]] == + sort([[0, 10, 0], [0, 5, 0], [0, 7, 0], [0, 2, 0], [0, 9, 0]], by = "idx", idx = 1) ); + + ascending = function(e1, e2) e1 - e2; + descending = function(e1, e2) e2 - e1; + assert(sort([2, 1, 3, 5, 4], by = ascending) == [1, 2, 3, 4, 5]); + assert(sort([2, 1, 3, 5, 4], by = descending) == [5, 4, 3, 2, 1]); } test_sort(); From d480b99559ec4f779a141b54b727725525022e55 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 7 Feb 2021 15:02:15 +0800 Subject: [PATCH 05/99] updated --- src/experimental/note.md | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/experimental/note.md b/src/experimental/note.md index ab2579a3..4c07fe63 100644 --- a/src/experimental/note.md +++ b/src/experimental/note.md @@ -2,14 +2,6 @@ to_do: - deprecate `trianglate`, use `tri_ear_clipping`. -next: +dotSCAD 3.0 Dev -- maze/* -- vx_contour -- vx_bezier -- vx_curve -- polygon_hull -- polyhedron_hull -- curve -- bauer_spiral -- fibonacci_lattice \ No newline at end of file +- `util/sort`: `by` accepts a function literal. From b8875bc5e980c117d56004a426839da4979798e3 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 7 Feb 2021 16:23:08 +0800 Subject: [PATCH 06/99] rename param --- src/util/_impl/_sort_impl.scad | 8 ++++---- src/util/sort.scad | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/util/_impl/_sort_impl.scad b/src/util/_impl/_sort_impl.scad index a6934a08..b7ef2396 100644 --- a/src/util/_impl/_sort_impl.scad +++ b/src/util/_impl/_sort_impl.scad @@ -27,12 +27,12 @@ function _sort_by(lt, by, idx) = ) _sort_by_idx(lt, i); -function _sort_by_comp(lt, comp) = +function _sort_by_cmp(lt, cmp) = let(leng = len(lt)) leng <= 1 ? lt : let( pivot = lt[0], - before = [for(j = 1; j < leng; j = j + 1) if(comp(lt[j], pivot) < 0) lt[j]], - after = [for(j = 1; j < leng; j = j + 1) if(comp(lt[j], pivot) >= 0) lt[j]] + before = [for(j = 1; j < leng; j = j + 1) if(cmp(lt[j], pivot) < 0) lt[j]], + after = [for(j = 1; j < leng; j = j + 1) if(cmp(lt[j], pivot) >= 0) lt[j]] ) - concat(_sort_by_comp(before, comp), [pivot], _sort_by_comp(after, comp)); \ No newline at end of file + concat(_sort_by_cmp(before, cmp), [pivot], _sort_by_cmp(after, cmp)); \ No newline at end of file diff --git a/src/util/sort.scad b/src/util/sort.scad index 8cb70c06..948446ee 100644 --- a/src/util/sort.scad +++ b/src/util/sort.scad @@ -11,6 +11,6 @@ use <_impl/_sort_impl.scad>; function sort(lt, by = "idx", idx = 0) = - is_function(by) ? _sort_by_comp(lt, by) : // support function literal + is_function(by) ? _sort_by_cmp(lt, by) : // support function literal by == "vt" ? _vt_sort(lt) : // for example, sort by zyx for a list of points _sort_by(lt, by, idx); \ No newline at end of file From 61958b7a587066ab65b5a29104761b7bb0fe4436 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 7 Feb 2021 16:28:35 +0800 Subject: [PATCH 07/99] remove unnecessary dep --- test/util/test_sort.scad | 1 - 1 file changed, 1 deletion(-) diff --git a/test/util/test_sort.scad b/test/util/test_sort.scad index 262ec525..afe9b427 100644 --- a/test/util/test_sort.scad +++ b/test/util/test_sort.scad @@ -1,4 +1,3 @@ -use ; use ; module test_sort() { From 8b1e7a2b03420cc1960e258b98aea693a38ae0ef Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 7 Feb 2021 17:11:57 +0800 Subject: [PATCH 08/99] add bsearch --- docs/lib2x-bsearch.md | 26 -------------------------- docs/lib3x-bsearch.md | 26 ++++++++++++++++++++++++++ src/util/_impl/_bsearch_impl.scad | 17 +++++------------ src/util/bsearch.scad | 8 ++++---- test/util/test_bsearch.scad | 19 +++++++++++++++++++ 5 files changed, 54 insertions(+), 42 deletions(-) delete mode 100644 docs/lib2x-bsearch.md create mode 100644 docs/lib3x-bsearch.md create mode 100644 test/util/test_bsearch.scad diff --git a/docs/lib2x-bsearch.md b/docs/lib2x-bsearch.md deleted file mode 100644 index b39c37e4..00000000 --- a/docs/lib2x-bsearch.md +++ /dev/null @@ -1,26 +0,0 @@ -# bsearch - -The `bsearch` function is a general-purpose function to find a value or a list of values in a vector. The vector must be sorted by zyx (from the last index to the first one). - -**Since:** 2.3 - -## Parameters - -- `sorted` : The sorted vector. -- `elem` : a list of values. -- `by` : Can be `"x"`、`"y"`、`"z"`, `"idx"` (Default) or `"vt"`. -- `idx` : When `by` is `"idx"`, the value of `idx` is used. The Default value is 0. - -## Examples - - use ; - use ; - use ; - - points = [[1, 1], [3, 4], [7, 2], [5, 2]]; - sorted = sort(points, by = "vt"); - - echo(sorted); // [[1, 1], [5, 2], [7, 2], [3, 4]] - assert(bsearch(sorted, [5, 4], by = "x") == 1); - assert(bsearch(sorted, [5, 4], by = "y") == 3); - assert(bsearch(sorted, [7, 2], by = "vt") == 2); \ No newline at end of file diff --git a/docs/lib3x-bsearch.md b/docs/lib3x-bsearch.md new file mode 100644 index 00000000..c85fd7c1 --- /dev/null +++ b/docs/lib3x-bsearch.md @@ -0,0 +1,26 @@ +# bsearch + +The `bsearch` function is a general-purpose function to search a value in a list whose elements must be sorted by zyx (from the last index to the first one). + +**Since:** 3.0 + +## Parameters + +- `sorted` : The sorted list. +- `target` : The target vector or a function literal. + +## Examples + + use ; + use ; + + points = [[1, 1], [3, 4], [7, 2], [5, 2]]; + sorted = sort(points, by = "vt"); // [[1, 1], [5, 2], [7, 2], [3, 4]] + + assert(bsearch(sorted, [7, 2]) == 2); + + xIs5 = function(elem) elem[0] - 5; + assert(bsearch(sorted, xIs5) == 1); + + yIs4 = function(elem) elem[1] - 4; + assert(bsearch(sorted, yIs4) == 3); \ No newline at end of file diff --git a/src/util/_impl/_bsearch_impl.scad b/src/util/_impl/_bsearch_impl.scad index bac7d859..2acf475f 100644 --- a/src/util/_impl/_bsearch_impl.scad +++ b/src/util/_impl/_bsearch_impl.scad @@ -1,20 +1,13 @@ use <_vt_default_comparator.scad>; -function _binary_search_by(sorted, elem, low, upper, i) = - low > upper ? -1 : - let(mid = floor((low + upper) / 2)) - sorted[mid][i] < elem[i] ? _binary_search_by(sorted, elem, mid + 1, upper, i) : - sorted[mid][i] > elem[i] ? _binary_search_by(sorted, elem, low, mid - 1, i) : mid; - function _bsearch_vt(sorted, elem, low, upper) = low > upper ? -1 : let(mid = floor((low + upper) / 2)) lessThan(sorted[mid], elem) ? _bsearch_vt(sorted, elem, mid + 1, upper) : greaterThan(sorted[mid], elem) ? _bsearch_vt(sorted, elem, low, mid - 1) : mid; -function _bsearch_by(sorted, elem, by, idx) = - let( - dict = [["x", 0], ["y", 1], ["z", 2], ["i", idx]], - i = dict[search(by == "idx" ? "i" : by, dict)[0]][1] - ) - _binary_search_by(sorted, elem, 0, len(sorted) - 1, i); \ No newline at end of file +function _bsearch_cmp(sorted, cmp, low, upper) = + low > upper ? -1 : + let(mid = floor((low + upper) / 2)) + cmp(sorted[mid]) < 0 ? _bsearch_cmp(sorted, cmp, mid + 1, upper) : + cmp(sorted[mid]) > 0 ? _bsearch_cmp(sorted, cmp, low, mid - 1) : mid; \ No newline at end of file diff --git a/src/util/bsearch.scad b/src/util/bsearch.scad index a8a514db..0bba8f16 100644 --- a/src/util/bsearch.scad +++ b/src/util/bsearch.scad @@ -4,12 +4,12 @@ * @copyright Justin Lin, 2020 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-bsearch.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-bsearch.html * **/ use <_impl/_bsearch_impl.scad>; -function bsearch(sorted, elem, by = "idx", idx = 0) = - by == "vt" ? _bsearch_vt(sorted, elem, 0, len(sorted) - 1) : // for example, `sorted` is by zyx - _bsearch_by(sorted, elem, by, idx); \ No newline at end of file +function bsearch(sorted, target) = + is_function(target) ? _bsearch_cmp(sorted, target, 0, len(sorted) - 1) : + _bsearch_vt(sorted, target, 0, len(sorted) - 1); // `sorted` is by zyx \ No newline at end of file diff --git a/test/util/test_bsearch.scad b/test/util/test_bsearch.scad new file mode 100644 index 00000000..5cb7cd67 --- /dev/null +++ b/test/util/test_bsearch.scad @@ -0,0 +1,19 @@ +use ; +use ; + +module test_bsearch() { + echo("==== test_bsearch ===="); + + points = [[1, 1], [3, 4], [7, 2], [5, 2]]; + sorted = sort(points, by = "vt"); // [[1, 1], [5, 2], [7, 2], [3, 4]] + + assert(bsearch(sorted, [7, 2]) == 2); + + xIs5 = function(elem) elem[0] - 5; + assert(bsearch(sorted, xIs5) == 1); + + yIs4 = function(elem) elem[1] - 4; + assert(bsearch(sorted, yIs4) == 3); +} + +test_bsearch(); \ No newline at end of file From ddd0752a2472e1f27b30e62804703f6525d3e4b9 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 7 Feb 2021 17:12:28 +0800 Subject: [PATCH 09/99] update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 67362a02..548b8bc4 100644 --- a/README.md +++ b/README.md @@ -142,7 +142,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [util/sort](https://openhome.cc/eGossip/OpenSCAD/lib3x-sort.html) - [util/rand](https://openhome.cc/eGossip/OpenSCAD/lib2x-rand.html) - [util/fibseq](https://openhome.cc/eGossip/OpenSCAD/lib2x-fibseq.html) -- [util/bsearch](https://openhome.cc/eGossip/OpenSCAD/lib2x-bsearch.html) +- [util/bsearch](https://openhome.cc/eGossip/OpenSCAD/lib3x-bsearch.html) - [util/has](https://openhome.cc/eGossip/OpenSCAD/lib2x-has.html) - [util/dedup](https://openhome.cc/eGossip/OpenSCAD/lib2x-dedup.html) - [util/flat](https://openhome.cc/eGossip/OpenSCAD/lib2x-flat.html) From 1e6a37e481273101e54960e23c6ef388b1f9378d Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 7 Feb 2021 17:16:35 +0800 Subject: [PATCH 10/99] refactor --- src/util/has.scad | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/has.scad b/src/util/has.scad index dff5d007..00781e23 100644 --- a/src/util/has.scad +++ b/src/util/has.scad @@ -11,5 +11,5 @@ use ; function has(lt, elem, sorted = false) = - sorted ? bsearch(lt, elem, by = "vt") != -1 : + sorted ? bsearch(lt, elem) != -1 : search([elem], lt) != [[]]; \ No newline at end of file From b3a5da6da6f4ef451180e7b7c76597fbceb1c68c Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sat, 6 Feb 2021 17:51:51 +0800 Subject: [PATCH 11/99] clean docs --- docs/images/lib2x-polysections-1.JPG | Bin 28523 -> 0 bytes docs/images/lib2x-polysections-10.JPG | Bin 13020 -> 0 bytes docs/images/lib2x-polysections-2.JPG | Bin 29643 -> 0 bytes docs/images/lib2x-polysections-3.JPG | Bin 5873 -> 0 bytes docs/images/lib2x-polysections-4.JPG | Bin 7295 -> 0 bytes docs/images/lib2x-polysections-5.JPG | Bin 17586 -> 0 bytes docs/images/lib2x-polysections-6.JPG | Bin 24457 -> 0 bytes docs/images/lib2x-polysections-7.JPG | Bin 19122 -> 0 bytes docs/images/lib2x-polysections-8.JPG | Bin 23115 -> 0 bytes docs/images/lib2x-polysections-9.JPG | Bin 22706 -> 0 bytes docs/images/lib2x-polytransversals-1.JPG | Bin 26273 -> 0 bytes docs/images/lib2x-polytransversals-2.JPG | Bin 22024 -> 0 bytes docs/images/lib2x-polytransversals-3.JPG | Bin 14524 -> 0 bytes docs/images/lib2x-shape_glued2circles-1.JPG | Bin 17415 -> 0 bytes docs/images/lib2x-shape_glued2circles-2.JPG | Bin 21314 -> 0 bytes docs/images/lib2x-shape_glued2circles-3.JPG | Bin 18243 -> 0 bytes docs/lib2x-polytransversals.md | 42 ------------- docs/lib2x-shape_glued2circles.md | 65 -------------------- 18 files changed, 107 deletions(-) delete mode 100644 docs/images/lib2x-polysections-1.JPG delete mode 100644 docs/images/lib2x-polysections-10.JPG delete mode 100644 docs/images/lib2x-polysections-2.JPG delete mode 100644 docs/images/lib2x-polysections-3.JPG delete mode 100644 docs/images/lib2x-polysections-4.JPG delete mode 100644 docs/images/lib2x-polysections-5.JPG delete mode 100644 docs/images/lib2x-polysections-6.JPG delete mode 100644 docs/images/lib2x-polysections-7.JPG delete mode 100644 docs/images/lib2x-polysections-8.JPG delete mode 100644 docs/images/lib2x-polysections-9.JPG delete mode 100644 docs/images/lib2x-polytransversals-1.JPG delete mode 100644 docs/images/lib2x-polytransversals-2.JPG delete mode 100644 docs/images/lib2x-polytransversals-3.JPG delete mode 100644 docs/images/lib2x-shape_glued2circles-1.JPG delete mode 100644 docs/images/lib2x-shape_glued2circles-2.JPG delete mode 100644 docs/images/lib2x-shape_glued2circles-3.JPG delete mode 100644 docs/lib2x-polytransversals.md delete mode 100644 docs/lib2x-shape_glued2circles.md diff --git a/docs/images/lib2x-polysections-1.JPG b/docs/images/lib2x-polysections-1.JPG deleted file mode 100644 index 05408847ade247b074e811bb048cbbe237422f31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28523 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 diff --git a/docs/images/lib2x-polysections-10.JPG b/docs/images/lib2x-polysections-10.JPG deleted file mode 100644 index 656d5e4b0e6c00ba016d082d39e6b88427758f63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13020 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 Z;(;A`J1fYtHSW#LsXf}a0b*;N{|ETAmNNhV diff --git a/docs/images/lib2x-polysections-2.JPG b/docs/images/lib2x-polysections-2.JPG deleted file mode 100644 index 784c00be221b89ccdaf1397cb3194436e650be19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29643 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 I+U^ej17+(r$p8QV diff --git a/docs/images/lib2x-polysections-4.JPG b/docs/images/lib2x-polysections-4.JPG deleted file mode 100644 index f2b0125a8cd52a72013e72927d4ac4dc270928f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7295 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 diff --git a/docs/images/lib2x-polysections-5.JPG b/docs/images/lib2x-polysections-5.JPG deleted file mode 100644 index 99aee7ad9a75b79cc55d823e0b093179e522c051..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17586 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 diff --git a/docs/images/lib2x-polysections-7.JPG b/docs/images/lib2x-polysections-7.JPG deleted file mode 100644 index 361bb0b0e9f50401dc5d7f27a1ac7e3db80be757..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19122 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 diff --git a/docs/images/lib2x-polysections-8.JPG b/docs/images/lib2x-polysections-8.JPG deleted file mode 100644 index e87527f9394c2bd98d61b51faeedc41544279093..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23115 zcmb@tbyV9~yEdG5>Md&$ugANeJ}Y+L)j?tATh?dv`tJ|6|V0$jg( z_1e`d*RNf@cH{c>8@HHm-@1A87W=*XcbK`@xgT(`b8+%K6n(_QC(OsmB_Jgr{8&s} zLY(_YX*p@2tSC?%cd6nGZ;Ft4;2&?RKYr&BmIo;~`Vsm$wJa=O zq}5GnTluG=3WqjD2EY&}XV-v?qT<2Q=^5sWAusy6SgLFPF{gj_%<@R)s=yPoXR?2! zysf^*YVO{@a!KP&ys=Rjr4bWxC@L@E>) z1*0lH{URu`eLu(4P`c6d-OSz>qDb16$Vq}+O>Y6`gaf&MBElRS?z?^tV4SXNJ7ys? zWL{fN?N)BFGvoLQfh!#y0hT056lb*=)4LEg^c#jxTewlT3bn+O_bvE4VoKKZ0mW(W zQ%SR2Y4*?%mGK^KM|WvoISQVgTk(TQ5i9u>LL3?EN%2pTf1VTtyTd_ezL-x<$I#Mv z=Z*>gZ|8u|I^JEMud&uK8#uiBL{|{wD!37=-8n=mRF3cLa?zfxhsz&{#6q~=fG7pj zwywk%gZGO6D0<~&?X4Lr+jy-qrY3uDD@8Sx!6}}WWA8%6xtI(oB47N+>Q%0aF0Mhk zl<*t3UbI{7vF-%n=5itXub-qi1GxU?3jaqlKGE;(C{HBR17y z9BL|F^~-bnmCXZr2~>^PYn8ayJWXX~saEqQGy+(9`RnGSyN^OoGFzz6W*+5pNl_9` zA(UYHTFs)wuwTsmNF#9E$0^8*xKnWq8(R(f6d^p#iVzk}vdRZO$P5&8a;OT@_flT$l#^!&kKJ&b8h4b(V) z1bVP@deqi05|T)hzBS*mrXg87Kt51-1QN=e_5{n4CCanWL_Me?T(a?ADC6E8C77~M zK*%W1Ynsb;RaihMJF|2PsT%BW!?DyM2gE+wR+q?0D4n08i#MN*vMR!MDRn!w;ZDTD z%saNq&0ntfHp&sLX;-gAUM^Dy5lRY>sw;(lR?Ao%%6z4F0k^vUYK(`wi^=7CCq7;d z&(lzq>Ym#yt7y+M`+nDYqchad(5YtrZgqP{p;wAJK50!4v<4#_0;S=6iSEB^I}%iN zm@FdnUOx*=KV+3hW#y)C^aPRwp;zKCo}K~oB#*#>$u+WR>Sk2mR0Cyz6hUolo|J2d z1s#Td8OSO8~e^SJLClw-Y21x~0Hqx^TE_ndBfBzpL_C`gJ_Tr`?a6u4%%6kswlp^$U6Y@{bWKUJ|+ z)0>B*9plNSWp${MoM@xANvLnQq4aC@Tq9ABVqEN2gdRvs-CQ)+7z{xdHL@mjw3j{e z3pEg+&yU~ezP*k@fwL}=Ue6a{pyq8Y#vOYhYwqkH_MpK0pBn{8U7LoE3sLOn8?Ec2#d)T!kf0Mp3-2$KH_p~EpEj*n2D z%xR%<#$_d$<7LCY1`RsP7#Fwxh(?y?{i$=;cx*sfsTPR6Ff_=BbPl+@jIHu(=xkcY zP29^o2e5}N)Q9b6XCE{+F@I#w%zE-IzslBar`rk`8rank?>sQRTuG<;3OWYJfVsSJnNjZR*zg_;2yZ)g(J* z2TGYqifIaV!3{2b3&aWb6VDl?k*i{R@4*sn+v*Q}HcZKV6{ZCdBCCCIK`$T{t*OY8 z;IA$|x6L5&XaNBin0{uh-+rF==b;v(Z^UG!bHHPe{Mn+G(SnYU`O=4#lasSgU)t*R zNA{#|rxk>;149*u;r?5mnH$?;j-Om7pRF#;(gl{ryB4cQ`s|CgAQh$W4E*~^sw+Ho zgQ?PoV-p44jT<9cza?8)8L$t=H#Jf@&t|*NTqdIivr`q?(PY-T4I44XaC&^V&f#is z*r8%Lla~y5*vkeL3XBB09n^bws= z*$|oSp6n8VhBfS250{)E`S%b+=SRRb>%SLs?|{uT;L3&ZYe>B>^Mpfx zL2op$WZ;L1Ik928eDdA~RqXO6^XFU-#)E?nN=oLPeB}_O_nN@oB>4=LWRM_c6_ z6I2y|2>}p;I~B=;-z*Jz)L9=K3`R$vxhDUDJ*!mQhubFl(4LicAB0m0_Y%&0vAGS{ z$f3LsCAvcf9JvT%pK->{>D3?=+xN4cM-p^+nbJ^Nai%YnE!U`X!vLhcMhd@CYbD8A z3(CuQYQUjprKm9BFV#%e7-&^FWCsq4W(3#O7>Mj4#U$z4!8MD%+j>f-7nY`}*q%^Df2a1IzU=3}i($h*a7QC?tnuht<8u3>>c2XM-W z#zc81E*uTTG5WfzL{2)%rK( z39+0y&+k?d=K!1BrCUXNP{gY&AYSV+d3oeh7fdGQ=Z0Mu?WnI$bfN$>QQyLP@o z^XCQ)Cf6ck)v2bo!Kr@OZe>}nh$Ak+(BuD!cyk>)k{CIiv*T3Z$S3Thhtk*`e zT$b3@UXXk2P}K^3J;D z>!AsWqt7$!hM4O@cA# zsEd!Sv0E&6y$uIhIYQmyQ{Yb+Xitt2Uf3LU3pbxDy3{f%A#SWXMt={Al=m<=j7x8i*kjMHA5YYs!=Ft zGzeG`<|Ua3ij>+*Ax@YYNAwFc1X|N`Y)9?evBVuOgJ;8e9FqDdC4^DnPv?NuacVzD zXKue&Q>LZh@l##ul*LqFv*rhvNVfe0!@?-LF#{K?ElV(=-#f985t>h|Z44J0ky%zg zDyqMcpKNwLV@iW<#Up=s^GIPx2c<@qb%}~2;lO?kU__TBVes9~8%>tNRu3MFSj#rE zySYYzTa_tZm>!PtM6BKJa3I%q_$^uqj#>v0b^lxb2Iz13ZYReb8<_C*qt#fIXK;m4 zx1N9JI>MgSvL-(idB9bIs>*cpv^SM<*c;mCnm`8P}&)m|?;8zL_8Jf+2`v=?JdxwIn)L)|t!#M-7P8+lCJugbn_HbZ&^N`3w$(Q~ntI z9)>^CkDhS&7CtZY%|3^y31}HF0J_8wRC=4Sc({AUDR^l6P4vgTk*V-D%K?{C@4$(H z3Eeqw?3|zQNCrJoDlfO)ZDVDLsnA3HegId+u%wZnVH#-FLfvRhssnhH+_h}cL%F_8DULmzJG&Mpp~&_bYaRy7DopJf!4>WSfi_Pc ze0S>Tm8?5SrP1&&>EEd*cISY-0!QXX>BGY4bWciar}noT7u~L3r)w0r-%JEnZb6{J z_(03Os@z=@?Jun)n;d$_U}c~+F<4K|geXN%>~g5Q6RG|pm`5L+3-t8-7Hf`a|B z3r$7xw=V~hOZy6SUyLg}Z|YspEiLo6^y78VO2huqKW_d5T*N1V-!w`Y%sN(1aT|Dr z6pYu>OGaEW-R?6aO=A})_R+F;1&j^88cSZT4 zcu$AA4;g}x9J{_=^OMx$9gcq%t5yjy_Pu_v_O=@NVO) z{Dg304b!Gps7)6oXaI0?=FyjOvxdMGbBV1YAvEWG1;$Oc+=Qc{wmrjYu@bsmo`Bxg zC#iv?m7pQ6%?+kgQFX2 zyu%((n#GG@1+2%-ZclZ`7gdn9Yp}qQGk>wUt(j)k=MxGA;2c}Y`rb`Z{&(#-3{9h~ z(sF)j2?!;C_3xW1JNsD94&~fWkbE%5w-erT({mwX%tq5m%e}bPE+{>H_nn19$WD(p z9`tC%*P{lnw}m(dWJkwNT9}3Y8In)?ZRaP-l!5t412JGMl&~=uZI1Eh$VaFTPnhe7 z!~9a@vEcNIh#GQr3k{dMFO{S{kHvM|f9nWi1Il| z%8DwX-*Is5Bku{-O&CvInYe))C_u2>$v$#Xo#{a{5N**8R+Gx>v0cZH;ty(hKdo#C z+Fa@BBf%uf>-|KfJOYRnN53}|5`#SF9{aT!0Itsd`1jEcxb$yS)73x!jRbuu(0)gb z`otKq6Tf#Hw^ZG?ycrZ0{ZTVs%WQ-jp(v4=bVBO;DEZUGS+{UycMKjObl1MSDY}3A zC_0`G9B+_01?E*)p6DpUDE|qD>KL=;w`U#NQTGHc4x%qR_hLOP>|wVYCuw1AbHtT( zht{%Oe{w}ZDuLF;5;0$5Y~dL1frbW!4df*! z^_TdvFBo+4g5X1B@Rs#-W!NwMkh)=ncxIQx24!0;r)HlbUHk$+s!}#Ud21odIUCHH zsZrl=kvZts#J1!#;E0b|EE6taw@-vjo51qGLZq^*t3#HC_S|UE_k+s*V5C)J-f9_G zmA%4B;RzM6hZFJ-wcV&aGVlT&Vo=28M(uS| zayyYIghU)+%e|+3wo+xs2F^B)Giv;CPj_wJ5f2sp8|}kSPh*FUmE%JuUEdw8tsh7J z5S-kVnZ(k&YWno7XpR?j=w>xpk=sbsSdL`5xO`Z5Ng|G!x_)su?7*4 zF2|P=?|SUI3HjL5f4?*c`P*pt$&&Wu>7>LCnbbs$ax%&mLpDM3-e$$ut=(CGkgExH z`-0HXz?%DmGZqGisw|RWy~hlVRE0thezc7pKA1=gJvAM; znQm}wxSMuM+Y%IJls}0#r%6>xeDQ=3R0JttGm8nYEMQK4hH%iD2!k1Gr?18L+Q9Seid)Q}>Gg!d|Ga$}o0 zvAYo&j1^msuk^MhE|n&r{lBhhpP=5*O$=95rzN-E1Rj=DuAT!LD%!+_JR5DvCBqBa zQR2dK`+>}jCP5Bvf+J10AyKj|i+-WQHVWY51W z7kf@6YR#&wC-9e7rgv=_LSJ^XBJTrKfxrJ98(*u~-E5s74B7C`-@0>@s}i<3SEn6y zCW(WI&5nS8GF-nk+JrhERIEDKZkbjj=a+ieHg+gQiJNzHc5R1c%s0#tqTTnAe4xnf zqbSN%l1EWx_Cgh=e1~}Fpu&N8z`RT&bfMIBJF3=ej!k89EON}eCF&<2)%4hOC7Hf? z`~5Xpu7z!>cEOK54|{Mhj^kXw!wzLB-wUB4ea)^Bde249~EcA=_Y z?6U+7vrg0fskpdWkiZJn(!s}VL<=wLhbcd@(R4jq(+ADlw;;!DvtCBsMTgm~wIhYG z|AdD0`cS;o%wj@V+2gU~;^e)k%G**uNa`MCzTF@hig<4XMjYY`6-Fjeae48KCI}o$ zx_i&)Ft5pYw%&g1#w=8P+!Lf^zXEknAn|J-XnyxFuI^b1tgUZk2@`#2D0{oUSJwdy zhL*b2U_G2k6Sse>HyHg$*g>@Y|K z?<7r{3I6I~Xd!VL9POgamCRpttP>tAUtJg4=MWHe+GY8Xc}>>POoG_EOKdgK{qdf3 zn&j4KqEL4qwzvQO@|m7i_2h%mh-z<;;$(kDi_t=@=~aSL{C5qo4gc$vC$BQ*iT&{kHv4z34xT`1|E9ZK1`S zL-|43(FrFxE6@XoC~;-zlRZ|UN}ziv5f3(tBo}zxw;!!m)rlW8>Wlyuy=Ltb&{^-r zMA_%YHz|H7(YuF~2`So&N2^#<53|ceNi@ z5PQ2t=4s~OR5}QhCWBqjF}+>v?^T|FjZ3H}r!8pYemZ%u+WdfY;xH(JJTtFc5%HYN zQAu=mNE}Y=GaqC#`*{1&3xzf|gl_el3z}74TiZlGVABKP0RI&#WUAL^t@wLoQ42+_ z!}#@+?4BsM;(<}Age1o~OYk5>U>oX3`D?Z9_tP}S;R7?9+neZ$B#Mc4fc`2LY1I<% zDY@b1N=WSrARQ@5LHOW_2`Lqho>p&xH8(NckS-iwzqAq-u~)>``>an#5&Y+ zKwPQqtLgimQ6R!$l3Z~_`g+6yq@oAc(UuW>q&G`ps}yt(GWq%PU*7-^0;1(GjBzJS zZ3t&dg_kO}`LkWOP`T4TSz>3IA?XwgAC5JU5+K);c9?#Of0wMdf>M;E56Dj^7|iNV zB@L)gB=TTSTHhdCz7DiR=Nz7WqH5Iy5+psB?M7Uqh%nmv88E?Qz^jVK7`0UmcSgJ~ zwr39aiXSF-`B#^%_Lvw~ey$6{IcTVCjn7*Su?OP242&g4!tQ{-zWcg*SJ=!uN60dX zw6_r4Ab(`4jeIa-=| z+H6$Oj4o8@%xwVTW!qw>EV(S9O)9C}-W-I{df{+hMZ0IiXrzdSZ;fvhjmFu9-S+;3K|t$ z<|Ai^%mw*GyESS#9|pU_5!fN9&@n~&x@+B=fP|V_Y>dz-8m{#h3`QTwix2R4SU$NW6ekXX7JhuJCB4g_f!jj!xG(eWQ4BBg}gjJ&(;UD6L9 z34H2X94=qjTgG*8rtY1zqElaFyiiO3vtGI~64zt=dsw7G>@~DzChy6KrF6#rg<;;u z{dc|RU-ji>vNL!^ysJD|gT}fx>m2gwitYA=X)zi6NdgoGN;y*a;n%KxTcgaKqb=i@ zCL00fKZ)_`F`vWl{Ir*IXN6yi2!U<){5kt=w*QAe1JLf6X&bkc6x~VVbwknK5?6}1 zn4@3qy?83Obb9n{AB6loMNhyk1fLrI?$cLY`piKPf8^?tP^N<@OHp0`6e#T&vG;g4 z=Sdu7GSYIs)Fb$7m%RzCOC0j{m*G)7D_xFk=&j$p^$^>P zt=-C=6d`tngE(k&?MP2lRYP8?;AshIszg1*KIvdARW~L_FrWsMLV)c9T`sT^xT-C6 zaIIBEQ}WHx*&XUWuz_>5FpMz&xsl9f9=CHik487mshAjj|WxGAO^|Gd+vEB>mhK*W(Ozq zT8S$L6NAj&Wj9w)Dl!pe=e6*GwsNp??;VC(jN+i{Q2hH+x)VEBF-9`bwsV696%3d6 z5t_}5snPEmRrOg@ISAJvETrY0q#l+AVdw3PwF@l&~LIL==#{ z!8&OY7U_W=-&ExcU+63jQSBkc%5e#~13kumixkbTX+J+qd#K`wXA*SbfhJ}Fgy8=! zdHTO9$NB+Aaw+?~kSQzEljPS(M`)xL9)5fKc9KdKh*8*_KR&&3HemASl!jT4vrmd5 z(r=MgLfc=R4QU>7+W6v0QxXdPB|ahz;njt(!)y?7)gZM@uYr*~ux}LC5lO{+UYVE^ z?p{BBkO7B3Pyq?%pbk;YTMl{0X*KPnm8hVnqjpH2TP5VutH$cOicdIOOmluw3-LfU zfo8kAyL`=5k%_FTNup-8c39$mUYOwU?05&B)Y9)@rRXie&u${y#kVzo)`>PjSopLY zNA)KS^iroIGWRfb<`F#uJPZw0^86mNo_&&I-9g|jVzk_Qf2?hLCK$Y~tpht%)z`?> zfHmj0Sb&Gg2;qo8HjueR&*dru0l#W*j0?4X6>OSkyp%{@Y#GfI9m;xm@7mRuAGM4# zI|z!YF57q_D?J~#HmE)O>W^6-<*65?kB58ydRh9*>`CdhBB6R5E&#p__sD3^!-hq% zBB!#}G>&gpAWM=~Tvp`3+TBztv1VimGx<4_ZziVTs<_qYh8Wdyeczwrb?^bu-Uo`hGbn&s)5 zYU?&n6xuOUjnw6pau7KP_y*$(=iJyy(@`k0KdcCG&R*PFnH{SL zQJP^xc{6S=J8LIFw*!BxsBV|572lJHYB-C=aeRgb%pP$)eD;KpMY!f8J>auAG=8*H zxe?V1srLL_KY16|!Dr#1C%UpJyI&*XQ@R`%j~VzlVjIy^8dPA(@iFYE;iSa=g`aEwGsgeD=cdE$1GYNolZSE--7M$??&EQ@RGIRO zIcFWXKq(emzCP3YaH%#_Q3i9=4L<($$k1!gqY+$d@$7JvPs=WKu>E+>D}K_u)vyeK z50^~NtyTf90!g;OP6X9bx=YAhW%8-OB$-{_68g4{>NwTWIwfwsMh?&cUK( zWsK~l+1AsJi_flmi2LfVebI8hEe>p#&n-tOh{@lycw8TME$JMB;H!) z7EGFpx6lD5q2NF583go1Nrs1VsA)u{Xz^^cdR5U@0yd7${E+Z&?WeY#Zr9Q@9wrgZ zIwy&13JVSb(}I`Ny1MwtY{3oD-I@P9qWJsiGFbJrPh@?bIcKa8_*O}LxlQ7$0)n5G zHlJFHVp6MBhGMz{J}R<8UkUftjw)D+ftNEOf;qm7{EUcJ!O1lwR%NN|qyh zSo(Y4jk@j=%@O0d;J5hlKi;6xkk5JC>zolwQRjf%wRhnb!cy1Oz`t%pb5Gyxi>RX2 zy9DKC7L->GdIfc>WJruEzglhq!(MWbqB?rpwAdB;44BlsVz{br&C4o)xM?8ZT#ayD zjp(yn+nlA%?y08T)Rmq{i&D+Se!IQ5&|$OoM&jcMoo><90E^ z#&JUf&_ID%irGlnVMLqO^%17BSatQyvvYu@LjS>l)i>?_83d}}rYl6?h`X$@c1g&w zJRuq+XurL(t~wGKm1A+L`sEC!c~y0qtn&FWfb{0?c?AIQIRAdr!?wD2jm)3W!`1Gi z%eq4ZR^5hhzOjw$fSUR}Ch4aWO$x3e!Lx@dqxF;Pp(n(Yk^a#@8WZ33S zh+a<_6t;X^^?JD+=j>PLS-4mao3OITOuI6@Q2)Ia+KLjB;cm}sjp^v>kMhCXF?U2U zA~N_yH4UnQhhxU5U3U_Cx47RY)O$KqBAU=8)C*rr|OTXQGC9PqsmU;`vrS8Cg~LZf6o;6M)M#YgKFo|fe%hG3hy_oi+2^cD)T;BF(5pl2 zeexuHYyTl+*?Ib{5Atgj8G;qX$UD@HU>t<<2Q+^Oo6XLgA^}A!eNOI=W9@DI@%-KC z{r&2OhrF7rqr3NykTso>(v#lPDSx1G!P7?LR^SGBb;&nw+`$mz1p~x#kBY`aHDgJ3XOF zCuHQu&o}T+up0)C&Bna$O=9i=HxT*!DY-@ybzlFXbFq!c8|(k95$UwQZdv~Tne@#G z>1sISFzu`^qL$tTQ!&|GjB#`-2PppbcN{{+m@V*r^Me_$YJIBH@LnkdWZs#O*mL*W zJ&BRzAJS_+OImg5FN%1A!`Q02JJ^}!J*nQ*`KG7kIB)DjgT$%b_e}5s$DKg7!Ick- zxg-IsJv+0R`C`3gKjQ7KZ&~~WZPCMuk$I|*{VVW5$Or6&34poRuNeaEFlmN{;cBUL z(VW>1arBq(AI(IX-$)&sG1T{4-F{eD``&mJG)MsN8 z^xR8S^Y+p9VUe~u2iQU_OurNy{}a*Hlh$9VBT!oB0Ps7Nl?^T3qK9769sMOeOA03U zrhQD02IpIjI`5SlZazDkD)`WG)pmZ1wl5$Mp49oqcX0IEyV--9(#Y^*CQhpQVNtNCb!wE*5I3Re;A5XJ%$pNn$jzhmhw z%;92aZ?R}@1>UOK%Z+FrX$=#7-q+KAA-b~tb5!xLs_1_KK8?#Mt+j%xOG)`4zfX(l7fMT?I`6p!u>K10 z9{O9}V#wzI>A)?ird1G(cN+b)vRGc;^mQFj;?#U=FPzK2v^0L$`4F;YX*|9fmry~d z$e0}?(pE-7n^nKz-Jb`M;O;r`AG4!{btY^V+{#QsxX@9b9h5hXd zOoJV5!#X<)xqu2K1Q?rlwHHrMTz?+ctR_+wq0C78qoWx~t0@$~sw|Vn?Z~8HaGo%3 z5Ut5v`5%&!q{kD<3_sl+W|0gXG=__k!d2H_xtd@O5TAgk8j?+ilz_-KPRps3j zd$kf42}WIWl6K!jrd4V45E)pHtwG!TxEW}2q$tkc{JN*Jyx!7sVX~JdFirf%pj54` zvU+%wRm5k#s7Jc$k1=RHgXrOS>F&T&!7DTa^uV98_6E0 zZ~3L@36C|{ig2EbC85D@q0Gb3tT-_kqcNM_K@9eVAzM~LqqqHX4QU>Ro1tw3R)xV? zjG(-+%ki8gM3dv=H~y;fiDPb`M;aGYYsK30!N!vNRk2~t)4?@gIHj3uP4W##h~ftz zBCtl;=+ClCuS0XhsHW!3ecBvzJW9Ufcav85dd%7{Q9lHN`z`+%LFsv&Y?A0HP-lvU zki)xdO!l8&s!;7Tkkm^0m}9+>F0_7$6%wOKh;*q`S3L)$+G4iNic**GG!w50hGV#< z85@YD!zPCKdT0YmlCKeP2G2Qb*ZO#e39n}r$JcmvjL+x3i`JiXe7p41vQIL@6Yi_0 z_}+|WG0o-+?tjYo3)PUdce(>>HE}QXOZ-;LhQ!~fDs)aY><6+YoG9B(7}LpBur;3% zSh7>B=)}y-w!b8dM;{;z|2zKik2c)a8BDQG_t&eRJ_hEXdc1ezv*Xr7Avq9jss!l~ z>5iYv&n+kSzoDS?DJr`>iwc7$AVa~gIkAOEA6QuaTI|$(yFT-FjLq|5$5yT}MzD0} zDy9QmRgcY21dmmYg`J68)cs0TYzeXAv@uPQGq8#8Fgc+^3qkMn6EfD*Y_lGk*C`qj_yt`MXmFnO-uAE{D z4i5~1y9WV2{WOFtk6=FJ5K0Y4_}J7;Yq%|-jBz)8>7ny~RM^Jnk|kl-CVXMU_$yCz zg}p^(ABj{@TQ_hV3%aGl?cyk1wJ5Tew5QsB&D78OL~6 z`|lrpSG|eu%RhCS-uOI)MDq?>ew{YOc*$0QolW$f@Uv#E?&*NxE)W61;i>{m{PsW> zn?;AwAy=hWzo7pYY=)kqthjgXz&}j)vsZp!2(m!<;lMN(fj7LJ2v&d4Gf|w_6kfn< z9A4a;++F2|ZImUg4~_aTJO5YdSpR?88^BLL^%yeg**^bMk(T7 zwVCc}HhY3PIFTj*CFP{7vM7C2l(Rfj0`XA$)EtvEExR-OA_Gzz+!r)A?YHMn32bn> ztK779+j5;Ac;UpScdV0Np1>cBopI~+ee|x2GHW`P8lqt5lPtGgkdiye;|xY^Wq;@* zCF&Dh=s9&zLoBP~uj~Z6+(mMnC6!$n2;>kDy}FVXl}7nkw_o^d>ymV=CP=`83O+oJ z8c?Z84ZF3pxXftG&)3rtm&%obGt8F?m-AvKI8L2ij!_zu?~Zg$c6rgeHs2c{LFkg< zQ`RMos?VNk&t98bIgjte*+`itW|!AfeB@?xWhTtli1IoYx_~3ij|flT-mMG;5Ch|! z%6aVXN(!r(J<^x2Jz?N;l-09P9{>T=5B~+am|4FmsZp)%EWA#6yFX`Dz0Dr#cYbRn z&RmH+F#;0?1#A?@Zk1Bf;uZ&PPTHx z*$>OOlw!4*{c&M!afs*~dc0xAQ(-V2IAH{t=W+Gi#b~4p0e^O302m<1QyHhp=a4d|6NYgjiI7~*S zD@lrBg}9EajwjiP-Ai=A_2@CB&4kxndCe}7h%obB88?$~$!zltq4-W8H5=jk@(c2zUF@}6(_7vP*=j|8RllW* zA9McW(CKA(5-^(%M&&D`Q@vz$%?a^Bpl%d0=_E}sCm`G*Vnh(!;MK6+U{0)lKlanA zOCZAj;iJ1V9Qa9#9c2*|GSE2@#lxZ+>b01#xDDb|XcG5y*u2Qhphjgl9cTXNPUQYH zDSXANrF?tZ$mTJW;`0feq$gfvxLFAD37XVtXtH$v-$U#Fl-Ru_gg`ZUtg5~=9B2@i zZ}MU3Jr)#x{k1Xibbb4W+$4CzSbQwuVe8)gkQXYP-p$c)e)To)julT>Dzxugs@)H*rXJlus}&G+4umw7h9T%Gls{}|mUZFA(X7_Pr=pXoPBb-aDguf7_ynPL`2dAGxV*V-Sm zSC6DTZ=c2%>u&Hk+Xy*jg4QbgtCFP1874hy6QY75PL15N_V=O-DHBU#KBi@&(n8NC zp1BnH1(eh2K2fpnLpbm!OR>#v^WV@)1glX?zcNRu%Dttr5JPYPbU7Dw&-6PaZpZk2 zvG-}U7KEoT$kS#YF_H;;TBUnxUy91-CDh9G*4~Q*@V)-|e{Y|EdwT^D^n*d%uR8|w zEe|*j2j|OLu#eK@P@R}2r+!9AMt8HNp@4v(`PcAAFQ09=1eH;UNX=k&zAs*K99QRDWHPgE%%A(kk!2J$uA`ykzsAuA?WSqI!{xU+GCWXC1Y#~|A;%Bb&fE0b!(8! z?o5Jvj$q5<^04Jv(>!3U7>L0WFuR^Jno(oB3c`Pow0F@0Z4Vr5( zOg6Bn2WLr7@3$G=(qC(Jn$1@&V&{=J;IOWBZS)bqr4Y3(^;~Elg9dn^Za^7y?rry< zvM}>wBy{7Qv|Qbt zp+BIT0mISL5|478Tmfm=4AV`J_#)Nm39JD>R)(d62c5m10mW)=s!jeG!T(n%|CiCS z1KQZ^)i9y6$_ z)H_Q-3vkKN0IGD)9i~73UnpNDzAGpqI7m!Wnt=bG9P?{Be*%8{N3~m3(l8n+tkO?L zDbPNgl@WN=yNHJ#O`@YPn%1{Ga9SdKW4* zFD(aehz+l-pro2>`fJ}OE{Z?)EY#mmA0V7WLJ0xQC0a~TaQQ*(+?l4w+8I+5Cq%YT zO$)x5!!AioF@JidNb0e|F%Ud`ufZHgKxp2|G-2(tWrP`X6ZtPdAnIq`DIUESh-=3! zO1=E?>#`eR>=q*9^W<6=Fk!Wx;+OjKh191q&e2lI_zvoQrHeX~kky2xW#{mW3zb=F z0VrT^H9>u(nU07%2iOHgpNZW&b5gziqj+@ev9jp=5$TPs=F<0s2P@O?6L9J^_40K? zl+|Je)W&?5@;T|RqOEK--^F#!tG-^U(kniSft+(*4J`Z3&V)=gS@j>;as@s2IuZNH zP27%b_V)B&TFaOHx0}5N^fE?l>0~;Jkh;0oPyPPvn9s~ux~+Bd#-oJs_C-Eb)L5OB zfbEHXz0QZ4%f!L@$x|5P9B{BRx#Q$pzpDZH!lM~8e-6-DWVKp9R@*z`r7z5ndX7R} zf34xdy17V75Lh;N+pY0I%ZmEP0``7{@+!Xz_71zH{iB+Fz29@wx-2zc)v6;q7Tu>q zFnF6r$(mlUc-E{AVFXi1xw;v>yW+0-{_{Ct>1W30y+N01_~PQb%94*O*tzEQd~~yz zP-F_&i`D@4%5-pKbuqmEJya|CYljYDxL&4?Et&Xn84fjln2?C`$YIg6gm2E*5M$`j z#VOb|1)j^;K$Gh+R?i6c9KS5NZ-%wQ=COr1Fcc{H{}ghiQB9>=7R%Bq5wrj!%47)y zG)w}5GWskCh=9ltB11sKoP>E45L5&)VK7jHNw7!|NJ2n{5D5Y@Lm)B+2w^aQ%u|#> zFly($UfrvE^?R>>-23DH`0l#*Ti@R2>~r?1q@-Zj|NmZPQc}Lhdj&=38tJW+5%Qd3 zCimsgi}m-(FGwUB1Y+-Va=a1OiX>24>yW<`k_p5M(Dh`gO}pb#%c}@h@p_f%f-Pj^gQ8=~$NSV3+Fde0pw9 zl4JdS6%GIkfhf?9EepM$WBw2leXAV5lKDeuzIJB+`m#{WL!ti`ACAP8dis6jXaCmj zJ2zu#aIb_M8@vgO?%s(2o9h8q$f${s00&i}4g&hE_V8zqLY}6!gq+~wrDnyqSl|Wq zaU$uPjnvrnA40nOKZKzDMQwFuYY(SLmb$s-*?G zBu|*(b<>OEC%u4P7Ya-N3?%nuHB7uxO=+JD`nrO@;GBXxE^&Caa8<+Ehd zN(k*Gm@@=+tj4b;scD|}9X|(TlvsY8Zd0%|K0#@Mk`#)~7Z{!UJt-z$zQOv-Dl4zb zmJh=8>*^c&jJpdxEOl4I!w1=eACf86e+eo49TkOy-~}}s-;XN> zHyaqvBer{UwSicBi2tAf2k>lvuOTndNUroM$-8a7*i#*yn_3j&(2*}+f7%Oc>rCn; z+oo>oxYB!sKn@Kje+VTYFUe)wB!m$&+%l_2;#5La%U$q3na@I;U=N(@Xnv}F;&>@n zrNWnT9SYtuomy6$TzA)0vr=5>Txb>)GeWe5b= zXV<>3nAlf%gBA$YOX>Bq2bDl!0RM3FAa=mW=onb^V(=TkST_d4@Q<_Pb)1rIkMYM| z+xbw1tQ-+^8y7kM%~$%iI)L)(V~}j#w2mEOAODa$~z+ShMVhZhe-y zBdTb8sYmzxm(H(iU$RW9-LK>|jD?Q6U%^c!U5s!!LTV{$tuiz=bWHoD9NUGSreWNG zVT?r(4Yl{#Tv-u5m9pg{rSTx_@O?fMu7bx@0@a7B^?YcC&zlS>A)n3k zUF4UlU6RA)p8wCu7{{J|fwcuoEpZckb{`}BLuXH29-O^A2$HXW8fRFbHd)kRZHTQ{ zfEm|VqR!pp60CF70e;4idZ$pqQ1;5NWJGy9tfpaDCe zAE{FBTW(4##uPpBJQ7&y-+a(07%0PAZeHq~^IwUrOwo-OWq!vDC{d<%@2_v`RrWLM zCaJ53t{t%g*lu3*PV?5;Ood4g_T;8H*3)i{gn&R1Akf*HN6&v)AWK(dkY)J4k@8{! zSDKI5vh?M3*E5`^bFp;!`byJvL=if_MPV6%FT=DdO)Vxa{SZ<~(KYj>Suw*9W6IGW zkOt7inCI82)DNN4@@-zlEt$)dyc-@d>hBDmj64-tlt;sRLKgQ`;LHd5`xJk*@Fu2X z+g)mY!CtCiigjYc3-1c`Q(xFXtM{9s6(83jhH2#2J5n!pnaD1^on`JP_mYx7%N@^? z?p9P1+AhpMpFyshTg%okZRO26r)x0c?bnUI7UdE+XgOAv(<72A(&zHugiPviDmJ-{%{oUN`%vr@|PCY^gRv+d|w8 z(v%}}ByG&BX&1tcNN&VTLKQhyCh;1{+@c9*!29FzsF)t=QV?;6CUQU;EYd&iA!}=2r}2 z?3P$-4v3}OLGC{ZnoH98;D_*mKgMbvCpn*mDFn9XzO);GPmH=4uxEBI=}%ankOf8s ze;sgFt7I+2XjJo1qwXz%zhv5t%?CtJ#)v1@m!nyZO_H}38bcAO9#TZ69n;TunG^WE z5+xw6=)eQ5?&C|4#!k-2zWW)}cj^3Zl7CsdG^~B*EQPwi%=fQHj>@TX^sXvTSjk;2 z7<-_8OaX|{(D8U_w@YZq>I;#dSa%piJrusB@nJ~qugNc8eS<}8g7d?NgVwbCr;+aJ z2rzXmn-(IX(BdujWRn(!)1+r=JTE5m!mJz`ryB4mwa{!+sGdw6(r)*UH4&ch%m*d0 zZ=t@|4$^=7A+(o1zv^-ACEHc5#O78s>B0ieZO_;oU%%moSOk$MEQmw(;h!Y_-PZnt ztgRp3{RbKRvzw+qbh~VJ^2UN*TExM6cLx}u0CgR6A-%%dCk7B-wOvrziSc^MmDYfy ztt;x}0M#TW7&u3hTpl^Aj1!Qx9<3g+(h&k=0c@S;t(POxe@^K5%J(^$-icc}yOO)r z@Ud=XwJVmnGE-i#O3{wkhJ%tM%~D_YcU(B~Nq{-pU)H%+0`B8 zccq^eXHD`hz5=rbtD_SkRMu!{4w+T0Bj#M>cQnNo-lUgjLB24Pr1z}8#7iMxTehSk zJBkt#UTda&dCWQ--$Ev|l;Gor;29$~wnLFKvg!wl!--|jiz5c3`yjKh`*(mX((1=V zp_mybr(|oLBh?H>&+jvOT2n*S01ria-9Dr~+`-h;<*a&DhSp44bd7s5XL7ATbpm9l#KXuFGRCD&w))y;}b` zsgATnP7)tL8bQ?Q(0)>}8}+Xp2oY;edZUr%7vxl$*`-}onJJnCBb|%zZu=fG3wAIaJiS^{{6^*p>dlU# zu}1$10rPTRvJ`%>W%d)66Y<`D7GqBQ3_PjNwi)=s{F*aK=HU zQ}PRyN|j9^dHMD#M4uD_?Rxa4{z9WPKuHB66VpDl0ex2^53KYD1aO?h0=#gsfxNi6 zlWj9^X*T_CyW4S;J;%hzrfiqU7-bcrqEIrqb(IGqm8q=G@l5*yHiUJV)(~l|GtC)i zg+UT(kuG>Vh$O#|%9rYT)k5@}p=#NV*)^7X!H#J0hPS*^*UBXJ}p%qNdGPhjGlHS927mmRx4>*ChC@F^TOI?!`kX4gX-EAd_rNe@tSp;W1nkJ8!7C#=XL zE?*8a_c%zKkG|ZA{e^9h_M#TAgt6S$g1YoAM=bsGKt`+PxnG9@=@G{hdL&P*XN9W$ zOmS!mI8)#_rW1v#pD3%Z;M{3AY=EBOp15W+PuA7=tL+1PwY{)y7SBRq4Ndl@GRU4|cXZyWLj477^1A>S;dh40H*~{ zw)4mNN|YlQ;*d6}q#$ z_u0(9+CuL)Kir;LjGs@-SF2t9*tp$@V-`Cda`}FH_xekm|LJp2t(WcL_CT4n4dyAf z8>fUA@oI>X2fBF8+Wv@_D&%sexshR?g*;A~kgEVuPeYWT(U>p?nagQ^=!WieIHj9RwtsF@= zieKt`!Z^!wrK$N;hiDMtGYQ0ILcm_n&;ItO>O^itC@;(Gq-Cms2Eb6f-&(esPz$Z< zXZnB;ll9oE)#R5os%K_qzjdB}S`!)YvhdNyvaHJnMJu3Dz3$W4tq8jthX{Zprcr&Y z$__HH6q`IcVDx+g4!fF1l(KjrS-x`%IGjbrzjL4Ud%b3VwnJ0x^WfC^&$@Zucqd!R z18um2W!<;ca4^LBSkTX?H=>Hu8vTOQf-V5KER#@<0N{onux#}54rX#QR3(omoXwYf zDoRL~D1)2pAb$@yFk5b287-RgL%z*^XDY9jwm=+b|^<4EAvABZ#&cSJ;j z*waBwahG`quV$!AV$8Ax5<+t!!NlykMbQ5{%*h*xJ078)5dY@g#RF^8_hk=Io3SjH zu~01aWC)|n-NCUQAlr_ES^CO!1a7HI#ThEdPKf9S-gH0P;}pSn&2kx4s&nlgiNJxY z$D=a+1d;j`|HzxnG2VOWQ~UnC%I3~7p)L#kF~DlJ<@tY^sRIC~8E8E;PNmiWTyvR{ zDZ@Xtv_GUf3&^R>K>|bYBpvxMJAz|3(SNQo3u?)hkH<|Fl=8WQOXg2#*PoU#1c8%)_bUf_qwpBh!*J74Cv0bnU}to;%J#`afigt>U1@Ph>*dDP7{L|0H4*>1WE3-f4UIlOguFzijiT27x6QB-o z1@P0=D_5=n{`2|y+D})nUk>*GaOLVxSAYKb#*Mr8uV1-&=L+D;WtH~Y!^hX@xJ2p2 zo*CX?;QsC9>o?*?@n1`S^fU7CN=TVlc_DEFTTCj(V2JzMgv9Keiou~7NoyOAq-}Me zw5si=+_LgVd}?;~p6^2Qh_mywm*Zddd-c}!%aQ(l7XLoV!^fi6o*B|{iCy;pwSVjS zZ}Fu+X6VI@tQfgfvKe@ct=$v08!kwIyH^2#D_4HH0#F8=u>pP&`_F&z-xRLEqJPA6 zS8dZg4)6EE*Gj$Fmpz6Fo91-7xCKnDbdZMkDEO19u?s-wU`V3ksAstJw=55wW$bIq z9)_z0F7;Cfz31?>(-h2)@d9dMa$YMNghQ(7u(X-0Hpa&wb9qES(mbLDX(%$09;aah z5dCka@-O~$HEqJfGRs!);r7r@rP*z12~dz$L7GUHh; z`=}+am(S|)+Ee$>J<1S61BpipleEX?qpNs_GZ!0g$e`MAXKx?aStAr7^c9nQvvn@~ zMhj|Q(?>srQ7(Lv1;v8R$kI)Ql;t5wAGe&oAw&??83)w)u|R14c-?ydAMSsTeB&?Q z`G%%Pz^y}h$k7tR>CAI~xnHkL|JUjLOZDfoFxB|QsCUI)JGGfT7XV8kc}-G=iI9-Y zPHzv4KXwd=D0+R@DC@pGau#VErbMLD7~yFPu_4JJG?{v}mKN1*B_5dz9z^pcp%EAw z)iuXzO3(bYQAjY!QfRT%ZEUkn-@Hc}QZnR3`2mM)9d~qc2)vA0LZ4?>W+J!BvccB* z{$f%m3ugfa2}jUB$y#yZOjfd6CODRJZ<`oZ9ru2Q!ldEVs_Mv1RAFI}Sy`I234 zFj=h%HY<0E2u(BnHqaVhZonho=7Y#wAL^%tCO-s00dKv$(0uXsdAe8 z)`8+K*V}*Gy9P6je)$c@%tj}y#f{(^W9H(ebZT%H#gy49?U$WDsPu74ZJ9x)5ek4L zotVoWmg>y;{|adlVwwb&Vz$5yA~FNh=)^C4XJ)h z*c5S~Jp`4_C{wyaDy@(p`R%%(o5ZK&Og6IdI~i-nsI3rqy~WGp5HfCfU(yhITzQaQ z0e&*n`+R;OIItEGpi+@3+`?b*mS;i@$VpRz$V+O^OX{fH8|{=50Yy1#f?QeM1U7HI z;CdNgD)17ClhiDXOJ%EA0$Dugx`XjdN~#;(z07;t@S}wtM7KWc2EisR#X8{(3bf~$ zuYZX0_2~AdX0R8q1{^bijW!Fdf@@(S{%D7MKkKATfz<89Hr69D6Lj?NTgq_atrY#WOI3xp{bHe&%$cuz(sh|h|M?96~VUt z!p^WM=N(&#;+(WSKKAJ6vwJ7&a(RhmQ^UJB5}|;1QCC?}m^0j3!gI6f6%|oT64sBu zW79cWNpK8cd}PabFYHz0A20iNI*qmNtD<8>niI0w%A}Uj(O4l_f$Z*P()SAhF{WUM z=%TQX*(mtSYIp74HJUD>DNZs?MTd6~TjBc_4>@d??zEcw(Pa3nbTcYrGvU#;xn61Q z4go5QvXld|A|ah_vJi+L8s!+RBuFH)<27(Xrlh{rKduk|@;4g)Pgj0s(_nZ^5xBLTRUV{fy-i3kT^KpQ+q$L-QLrdQxvyi18m3Tdsl(cs0lULll=RQ(#fY7F< z#+>OgJnVF>&bE9*`>=hTOaEYyoABGl4mKm3Ts{0-V_3yL-mHtOAeJLLh=-*M8ttRD zz=>tRZuy*s(RC}j)xBj8@Xc7;pnb;1|0g;3Td|d*u=`;BTOLo50OVkmA31{PQeCsHW<4P=b$5*sz6Myjh<=a!??!(hXHp(<#C9R;-+|&&5R}c;2GbCPy?96Ks2k z)n0HdTX)_n%*Pc4;P2;8$0|+KIQ*W#OMH~w-AxZv_i`?Egc}M!dgOA-fqzF$bKx*% zD&1a}GT>T1n?3XvS`+jmNXc2&z39gDlr{QN#mZ_6&x04s@rK>H=p-;fz#C~= zowl0wUeQ8j?9T;!=WZgrhGw7PJNJkeNTM8~qa3Hak;g$d9?(jvlZy(IH>!XJ z<7VmR*d+}tcJ2Z&T)pDxnx6IShU|49w_dBU~B^LoL*|I;@19}L%mMTH+TfC3@<<(f;cZ9P0B<&Thb z`wOHji6-ylFA&$YS49T?2TMEgrP1h;8hy3(#UN**p}{?KnlSXE#b^T{w_$g`8(Jh6 zGwki<S-$8*YQ@@QKACD)EN2^0b2Pkh+_tg6*@XA$}=Paofn!oPc=25lehli}85r_u!55 zcC8p)1OK{2*QXunC(ED}*#I2qd#$N>p!cFZ-=y=pkxf!6 z^#WiQ^1l9C;+_Wayz2sRE950`Io%u;ecnd}t}K;OMuwttHJ;CkxL56cS4m$u>+ZnQ zejV&J&1zB7KvvgN>&LQYMAmuEX!k?Pl^ZNawWz>uybN}WkMp$UJf2b8tk6z__`7p3 zW`icAYeDtsUi=uzZ}XDdKmkWK{(J15fmu@v8hZ&r*8=i#t&!NgLZ{UF>TID4z-N1S z=Z`b;jZAniKIpmgnYpNPi*LZb^M|Rf9)`teTUd5MLzw&A_q$tl{H3~bn)3+UdXQ?M zCP8R``gN<-Knv+^+?z_S&dwIWJm&OU=G=-30iWKV1^!9;Aa_^(Q6`IA#OfF8)AasY z&J+yBONXnt0_L5aitm^Y`x@Qsx}lx5YA+z=kls2;5GjE7#x}`_uv*YZHV3w^QjVin zo3>QFKC5MxK(ZZE8eiJb~`o*0GpB%854&;&(c2 zZZ=4xfZQ(tqII=Q68BA?aP0@C1~%*WkeeUco{bUQK=&1c!uy~UAf#8v;`TtK9M7a7y3GI};ve>;<7@U`}#zu
      NiWzeT0w4Zw*-wHCDvkv32VLG4Wo|VZDKaB#f5w!g%ug-8ifjhptzJN9c)p zteeD>t7zsd z8$+#eb**Qt=`q9Ffwl@QB)*#{h8r*LiB=Vlc@c^elg0P8Bw%W1gPV)J9lh^%5>b|d z&XdsDK956(T>lFI)Zo+m73;Ptso22b!vrqN5s!TfyBncatUW2=#(F%(bBUfQ#{nA- zm6W>B>yM`ge=4??lh$tBL2nytM`8Dbx7oK}^vfyKi7La}Z5NyrEz?+5RypF27J+NT zlpWha3lAyst@Rl6l*p$>n^V3GB~LY_$%rGy{HgZY)DF#*!$+ib&S^3e zKNW9@R?zR8W`Av1oAoboX;zIF`E#KRQJcIlYAsU+Ee_!iXg1vpY$z^UbjqJ_A9ODr zCwhFXe2WO>8woyc}?yPmqRnaCv(dP|fQbY&s>1x{^E* zbvOf}zPq}#e|2)Th;{k|X3HYjs3obCA2HV}c&YF;R&u13c0>9`Az%C$#ok^|9Zeeb zf)ju(aPUdCf2_MK?QjCHKt3n6Ube4yqr-SX6RS4$2sL}OPqDPiGif_3+H65yE-%2B zP6tW`bJ(``_dZ@)8H-6sz^72rMaywcjD4WIPj#s7R!hn8#(Jk)_<2j@WJ3(^jEluY z>^cE>c>r`rPrVEAw~3v$jF{BSR2jx|b!~_kO7Sg(5@33o!}B|5%!D` zeuEYK#sTa>Dzmk%E%zM3PcAfBP9%7rvlC`EG1B)MGIizkqx@K1X@;*wT_sbMXy72e z-#KdS;1H&7KXC=qW}Ufc?i~y-8ddy0w#+I$v=F4jv0n9rOi$Xa{yZW;YD0y@A@>Je z6so5}4c}NjAU0uGX9A{OpA*hYufFIcYw)eKDOEV6tI>1R|*M ziHLE<3SA;DgOHO$jJKPxCk1mYWd zu5p|vGe&WGsfGD$t)ei{T8Ocjr3FiR%n9dAaG+vopNqGDlsB%l*@D$Wt2Z4L%u}|j z+TGaRffuadG03`;Ur@H>Io@k+R#-R1bJUw`pwr9c?d8%%kp~+4|Bku)DKdFg(=ICe z=3+s7LNmAFdVH*gWH*>#Hqmcf(RDgf2D6V^hp1*;6;h+`(J;`Eqy*$m5O*z*LO}t- z(Kh(012@FC49r(A{d>l>lM7Q#iwl9;r~p|ddV&Rmp)S7)sLD3grhQ)zO3lGy;NF4)U(ajrwiOyf05tWD(v@dzwOMTYS(Qd zW3n#J(Bz1>pp#wIHHL!Vtuq%uDHowSshApMjh zN9|c&p$}8LCnKIErO>6s&t6mbz1fd;DZaF6NwIB`De6E~pD2#Xl=HRV=~Y*6n)P|z zGB=8zMJzvdugpBp3#x|pFP|9)v%w9^zAZ_Gm5yd|QLE*BY^+)HNJD3kpgj7a6%mG` z;&mfRw~3Mpl&ujzZM=OfScR}pO% zsr;YoneyZrm{J|^zinvF71}d3r1!m35RPFe=d*Ly@JZZW_?(0aAFc#8;G`4{X_#Z1 zNNoC0kaYlEn=W3rSPcTv5Te-j2W%7$E*C7YMCo7KojdAVuLL!OdUv}nm*%C>HZXH& z?npA41y~q$RCY~u3M?n#;swp8iA_5Mp>3bW%|F6JXODuVerIP_E)%(~7@x{STPxgVjP-KKq6go4VQ_zMrHDbfO`#uNPwGb`Hdf^UG_V zl*uMw;2CfSJG1Vqe2A6i&0;izB#pL)@Ud@kHqfo`c+=6_#Nr-4)-yAas_iA_XW%4u z&l`B}j_=X@Va)MK1VpANk*kuEuh;V7*)>~LSlgu=U(flaB%gCtvqb6G5nGf-J5vbm z49GD{QibniEEmPU*tE}+@4Q|m=v4SFgj0!!h&DCub{_v>At98KS)#uInoI@GBW0>j z=u0(9Y@Jhu)?XU`WWYJYSD2eR_I?)(9^i@0_<;OZd>G(8{9P6ajG1pVj~Lj%FIueYP(nq&~CRS@(vbp&`aKNozc#^KbANn2_Z;O1|j}A5krR)n}#W zj{njr07_4Ss9CLK2u5LS2&Qg%$l!b2tO6igeUTuS=TVC~I)-eewcG8i@!JLu7d)Kt zYHIr0roRu7(yLS5VtJ`eoXn$HcghA_wbkoZ{ zD3&?9@U1Lr-lkM@D1gU0zS{#LoP?JEQ-n(AOEh;4UEs`i0IC1aO9-03tSK}f7Z2z* zyfNE7pyP%wd!B!^Xfe}yXwEy{b~cPTWL!G>7>XKR*(P_P<%Nl{8*8T2_Q5#rrfy=XA7fFl z&E7|hW0^olk9LjLL_QU^QTlmP4VCYrqI^%5|3%fTKd#+Y-ytuJ1HX4W%6q7c0+*Pt z7p<$DSx|h`erq39P$t#9qLp?Wk5~;_uf;X^(BxIwsjzTbD&|&ztU-Q-N;U% z+?4FiSfsNT-09-YQ2EGXbt{r{elqC=uc~vrh@Fj^1;fMTLUj6xp`pnA_8}z1*MyhB zn^Szn$#F7O_631F4+i%edV&Yz59_a2yHYR>>;{qTOfjgS{^EW+yCmep;l)a@zRqOI zgYS)nJDEeUxf$<2e=>gl*9GXGDPMV?sKI2hviljn*9r&q^sfcbioJ=R@$yYt`a1VL zjJCQv?W=}9g+g&2U(V_vnN18I4iM{&j_S$7eId`nF91lPtcU`N?)mG7rt|R%Im68~ z1r(a(`-1SmbK0ZcKjmYTmzIoa7WU-$KYtw>EE1{x&fp2(e3n;Yf^uFg%a*hrJX7Q~ zFO}nGh&>STXLYm_XBEw4gotkqCLm*-J})>8f)_&*gtHyez~lg+)nOXOm814iucWJu z2PA>dZan_FKUBp>I!ZZcat$b3atV3p8K-h^?QXywYI7qpsv4O?ZTIGrC~A5)69+v4 zEi3~_q3L^7u1AELorABB$S|MATcNPg1nKDW7GFKj?=*^Pk*cxOVej@oPowtKh^7)f~)@`ojldEMR;G@;O{GhnJa`g8d3^uSxe-a|OkS$zT$@g*=mlKY$ zsEk-VSq3ck{WI$IpR~T{7{nsn42^yH&{^$6^-I0EIv#F>q^|^Vw%etyhIu%tVn>%- z$AUhnYGlhVkk_-kUF=xHKe6<#pu2y4MRJz3o<*(4&IMpq?UlxqRzjtzygP9EjK@dT zt@pEnY&tca6#d$^qC?GzwtwZ_P&ZV?@N2r5zWT#`y~y@^4@FoqTTKj!bN(%M6^mib z7WZvGWutfZGRspU#9agAgcq6~{%D^c8G@z^=Cs+h+WLIiDN)!GPQ`;orAm#3Es44W z{dJ^9u{V@ivpH5neBgJ@-+Qu!qr3PIywQF6le8yNNnBb-`g8eh!GdbZyfS{u> zBWydr(Dxpe0UhmiDfB-wjA@R=OJyzqM-hC~UOu|^5B*YKv%(jv7maGWJ=lu<-4{dS z(b>F6)MgrWbPVRwKK~^j}IM|(9(t<{tJM|pFDhm&Pm3x$>foAU?1e5(wvl<7)wOPYXYEDa}i z$Ud{~^F=%Pnm?Xd#oqL9KJEHdh0mGj$<3Mvr_)+jEVSG7urz$LcGhfQ>XY-w-Eq_M z_-pOR&Se-K3nAXlKycF(sa`$==TW$B4RMlmu50FEyzjchB#zIjz)BgxHT??{)Jy9} zYdfcWwF??C0y}&DjvOPF(IU6U2MDYv9k_R{n^L~GC_A_ZQQ9%WS6gW1b$4{NBUyB} zlU;GoCw)^rGW%2^T23*har(q@03z3sz9XF_p*k`rv~^&I5t$qx?>y9~4D{N3^?uY_ zgT5rO-B|E0VbSySCJ}e+G13=4!0&)^NJ&b#IimxFR6=3Mk<=5tg-VX*V*9`(@@Sk3 zxHpGJ>D`Yr2|vq7h?4!QW0^#d8!4)WsK{?Cr_ILq?%s)df{drh5}pC+X6wFMf9omZ zQN{OHR0j1*9azyHKk2;q2W9yevMUzQ$Q%)N$@H~=0tvSPbt2;1%Ijm@@`_;RmCLX4 z9-aDq%PS85{r`7z@FUM&2H(7w}N^oKm5fdC2TyE!rmHm0}L*7?&uCO*6R9 z>DHOu$RRMdG__qU1u!g65%dT63VisPSvpy_A~V9`8&im%Rk;28S`E53E({%&We+4c9m-*J+T23o754%qA7R9!yJc zg7m24n8b?XX=M|#8`f;=%}!$3rA5#f4r6W#)!R?JD(HN<}*X zHyYE!?d^l`J7tO@HnU*(CQ<8wGme!lHe*K*y+sB=M^jI2M})g?5e(TobrxIilh*Xek z<-|h$&)>?Mo=5l(r=)Y_7$+Nt@F)3vT8=1kfkuS=PWvMK3qaw!WV^&Gyu^T%6uHNp z%lz(->*jW0f>Rc3iv^#f@cSZMY-w6FX`gv~wvluzRb`@Zf0fC+S91-aM<+*RYKhfh zYdfi9Fyj}CEv-E(k~3BUvOzJ6E+v_ibm7oT8JI8VLm}|SHj9BHerUj{8Ua}B2drob zx09|+qpx#1$=JZS9tLsV>ThM`ieaW>X$ctKkz?l^J5BMf^qYyJxd4o>B?#;8V+D4> z;FCChdlZ_%Xeetf{Kdcu@hxaa5FFqLy;*$ zpqleh%VW9f0EO6|biFCl%7u0bX{bhm|Bhcp^)cd?g35D;+3wAWEZN&GUmCx5FW_VA zAu*Pbeu4JaYJE0BhFM2~m(HxcJRz}VuNuE4BWAnj`P0u74s*Qrc{`51Qwi$%YEeS| zU3T^CJw5>{MAwlb>;{W#SVJ z$EC=?`d~y{(L^kKV+cN9x_4Kcyv_fr51o3lQx3@AUGTd&+BT zL$a?s&Ew(GfGe+}*rpnSdWgZY%^@;i_Q&1pzzGU;E*-iX`fPaxaO02vS0DcImV1(3 zubvNR8ACxS=h-cJEC|2EVTj)@Hszrx7WWo#kNtAxagUF*-l9x>t6~xi!{J zA)}5rX0R`KjMXBzB39Mq1RHG6X;DcpDm!5BrJH$DIDTm1wXiJXh(P2cd*fNTYfly| z<5cdgUjV8!&bZDa+Y!ZyrY^e%!ppH)^|+VXBWx}-u{q9Y+e2o@>DgUpihL3^P|bWa z2Q4%J@~H|st*SG+eh@N|a~>a}`eUC#wvOm@0f-hE2t!Zj1wFDSm<^R54u+%;G7YuH z2NTW_dFNa}ZS>i~8Tyf6qD644_}~KT9;>fXm4fDq=LMiH@96vw+$$KRN=b}+F+OIt zk@Ykg*cFC{v?JYL)>s@1XFX27F#?RN6;LL}9kI!QL+UxVWQslarB2l9`{fsnuO)cn zJPd*UTlEGXdfU(3{hG=>`xJfA5OSL_L&E*Z!DDo&f!+n+HPe1w{9wq0+L>E!XS>!V zRlj82ax8pJr0?Z`>BQzAMP|tszOe21*MjQW=2CuX!%n`QwMb93k%4@#MiIW=*Xv%a z2E0NKO9C-9iBnX%!5#l&^)S74!GuZgoLZ<#MotEi{y5Jg{iMWRJ{9Hiu01uz+N&lF zsVKFymq-b39~>QQmO^ekTG;6t7|{rn3vB-2uEcCADB|fZ+O}AWA%f=%Yom;ww^fo;zt|3GIENcX9(aFz~xa zGxR6D1Ebop(JG5(m{^rdyWdV<#ShYvo8>Nd_}pxqi)7uV^x%(&iS)U}<-a4v#|tS; zXF>1F#yPZYu?)ZvE9Lul|F|mk%Rg=<|Ams~PD508|F`w(?iN4s-OkkR&fv~*$=bTa zMdU+`#v0S=pibr1UC$ASF*(#pD$SB$R&`t8oNhi6joj98B4 zSUX8FU>}!QlRM%l1_L4sBx+2Z8XJzMcCyaJPhQp(TmU|tk4{4MB8-Si%|KR zzCVH`#=jDBuq{BF+NB|8-|%FIJcVO0o)IV2DL*<^SnSPhJe8E*<=l%+yuUR>?g|-j z_Q>xj*}iLDd%_TW=K&dH<6qtM@N(L4S?@f6_#L)oi7x4cY!&S1 zQt$btoL*Jli=*Bg81CN|Z!U>EJe%}8c|OJvxpDe=BW-|u%75ml^v-Bj+|Clqi#uNO z&gDqdI+=1?8Qjy*%01hZ-dmya1skj-_VAFI4Ng|wmcAD?&ubM9D0Hm%?(LSPXes#B zd~$Wo^wD`ihP=@Gg;;Y`EZ=_x=uS>I9TX)dmm;%;5!ciC;r;M#PfzEWbs7* zZK@tc(4Z@}YY4J`fMm|eRx^17O3cyh+_ooBk;;8p0>?oA*x)GtqdbqNBs0W^_SSlo zr>RTFur;=~zb#Qwzt8moF!tFMbIJ`o`dNN1rQT=mUcAHDh|yWW{nN_RQ2p+ZZ>u4X zMlP=;8xqPLCN&s0Z#R@J=!nGd>YD{0J{=41+*jE6*wQNf0pyd0$E1==@(5gL-hs19 z10&i3wh?yxcI?r9IoU7VQ$Mc-wG(Asu+-OAqYF zPe&B}Z=(Pp?vMXsb^mBp0%ADuZ?0N?Shm7gnI4PsIM%Us_WX8b2<=>cTy`gtg**=H zq2}O@*dliirip$WK~vo@kWaWPlN!J}y>MU@x0<#M}=X$%tDl8*l*LK}K8)K-*@3rXhBEO3w%uatMhfH}iuGo|3 z-i+me<{&HK7Wt9+y1__0rP>d()&z6!^ZRuIam({mJ?8|!JntoTH#dR~w-Ok4#w4Tw zvpDI!aUMy2mTz|J0XmJHHL_bS6#)V;g$ZNd_Y#Y0S=^I8(@2 zp`YbJsO6iRWy9?t_j<41uE=7`&hoQq zn!MuPvG+T1nMGJ+*HUz+n)HHsjv}@+%Z&2t7Ap@#MAB0P)KaAH2aLNZMiA>!44R#{ z?V;)!8E~yN9uq(37HFS#!py6knR1r^5{YS4HDznhg%E2(Jqh;s)X1}Atd@r3h{2Zz zTU`LI$BXNecMri*N`2OTbV}Z2ok>_zI z0Xgedi0NEu!jELn-MawTt5J@@MPr^?PbONu0_|bj!`h}Z_3O*E^#aHM;K3ze&oX>z z-I0ePlsIDPc&2gndbDCaSLl2|7yXwk7_p* zi;kzJ)Ncz;$ZiW`Rj`E~g1~BRz?XIFz3#pPUiGN-hI@**zj2CeoO4W9vkracI}eWK z$v+EJzEVy{rAk7S>K`4STma~GKU?_={ouG=*=|=~q$wYyR6vuTX?zd=UaM%>`y)Wp z>L0bqzeg8t`u^qjxD%E8dFYw;g=wdw0GvKNPOEd+mv59x2paN*Ifl^Oc&5KcTEF&a zcSJhbIOB%odyi5*t!tUOdc4=GsM9gf@P6q0%Fsvfe4WLfUNCGIH>d($uH3Vq;pBru zTR17lq+QnT_w3QW#k&K^PU z!e|vPTROF`sJskDU_0V{+M9-MhG^SAp;_wDg>)$@9g!S+gUX7ldmxCE_zJ>#}9J1gcb_7+e56i_Q=ErD-fnH!lDwyN~Z%_xlU1TmVR3 zmmxMF%4zk9^-j{%k$0ked)ik0cumPT^0Xb^w!+P%t;wn2(ZfCeE`ma7BHM{|b0~%}CeJ!- z7VKNcdM%h$UVz`;)nVR#%@b_Fzyt<^EwnTmwhw2O?o~FAW_INo_RoqIuW*pLmVi6 zUlZun^T8#B2x$=z7p%%TsY(mIp0PdNW&mF~%(EWyh?Vr(HyS`1eh&z_eLku8BK96M zTyeYwG*eH&N#F~rv)o!-tnz1tP1J!RhOMijmJHuTShYKnqSd#?uLf2t`ta3iRzxna ztvOo#R+0;%Bi8*q4cRo7n0=+s$Q^XukPq$n$#2{FyGqX>HzPjk_sh@&a(0C6i`PnY z*-_5d)8tt*kWYr|Cc!3z<>;-z8y&ELSJZrnAy`jOUL+y=28L}sFBwdf=%eyY3`=1j z#-^Z0TCXxmD-lXiA!;Az>z?WPq*{VCX0Efsi}hDI%sz= zTs!oQZTpx1Pe9<`bPe=6D5F7?(i^k2>W|{z_4J$S1?gj)2>f(W(hkun=%}cOLcA&{ z`0LX+a@w;CfZ;6XT;|T-AQQh*-!~`+yWBX_hzN;AZ24T}_trP_#iu-OE|u~#W#>L8 zXO5*WKxG4n|CTqAxijiT;{o-Oq4{0s(D{yC1JBwV}=ivTK%i*3=Ci0OwABx zhscPvTmTA6%Tk15eTu52p7AQ#>9&d<5{0_PS^U(g8=l64t%fX>Ce-S|A&B0uRH!V) zyuT##(|)?L!-0~8puV=>&}nVGWSF9w8><1oBV>p)G_3+Nj=WdXzCb%?RQKi zq1XGYL29gDbIQ>!Ywat0SodIzbyT~Eng{>e{c4(R2pqe5NpM_aK<#%M&$7`Y0h z3_Ia$is3Hq-r3_bM8U$SEVt2+TVPgb!dq0v9j3`ePvQPV0r(or)LJ&Y6Act>iz;YZ zj7v8zSeyD4l{XkEE>8CTYWvO@Awgy{y^L(2AFaQGeB?F^v*f{jnh*-B`k)qQp5{m^ z=?*g|5f0bPPlR}FC4)c$4hSyPo5OZN5e?ihOb97qVfg%eYeJPGJq#L-c?B44`kxl6 z8(o#d^|rR8$ZshJWxA|%0gtGpa2LV74>>VL-IEQ8lF^_#9xTi9-QhAxccXR z*X3W6E#*}Hnupmx0Jsm>HWVZ{)btzty7~+F`F?IVsrO4nXg^I!h9olb)XgAwuG+fP zi6KKhRcbuFb&XTx2Z+OT#fDeZeJh2Z5p6Lc?6a#c^;n>^2D552)w3}_II4oljV)n| zJJ+c;)GqSQ^XVIGSm+}5Hj>9y>Xk$92xub%oylI5;Z38E#OWea0jcF|R9;eos&ip_ zN$k2&Sy={bA=_ZCpvQYqg>8F2rEqcLYw?$a_%$R$zqi~(?QNaLlo<3<>Yl%?ySLNI zFGB-@{54_6!M_cZB=XKj$^-ZM{30Myd6s18z^q0!rC$b!-xK zgp$)3Cs7m01l|}3eKh-gII4Hxy{wgU+a+esPF~})?v%_d_AWAjF6(_9F9JIA*OeuD zSg<)zqxeNKg`6v4rk5Mqrp}m2t9Gz{%>IiY>&q=OH6bs#-S8?gmMB>1?$quarL7NKFDP%Yq1_5LEn)~009dN}`ioc4a zEeP~DAo8l|A4)?#k6=l|!zXJ~R9i}2(hX(POUxskbz3jw0wDKc`4+RI*&thMpquiE zu0m`X;O6G9|4si_|EfrTKcN>g++3BoWr_B`t-Yd9CO!ph@$^kCh$aJTaJ8V$B^hU{ zyq8}Rb$gKRfePoKEIEoEgC}*YSPqsRZ~+J!PIa8c(jW5As9~EqrD~m4(-X^Qg?(rb zMRq^+zZuwAnUu2B0G-#bnxbCCVVs8KS&)C$E^M>`Sgav*9TK13Zyy`=t5LuI73M`lYgwrSi; zQxoIfQ+b{g8OMMCeO}n4s7Z8dkNJKrw{XS2bdwN7x$!t>WF}N~d%Bra$wV@gUj`e* z3l_!K)+B$6R8&&OW^lUY48wI;?Gg4fK6Rzn);+~+ee8KRFBQ~|DS&QpXB&ii>op1r*%Ih~Y z=t>wYpoH9bIp`}-TCM#|x{2~B-ga@O*yLf|HI zoRYHv*Rr4fJ!QBZQJECx%;K!~(JF(3DTl3fMp7@8>h}ORkqHU*>+(Ad>;b;5}>62g9TT>!8ANzbCYBc~& zqeC`cX~&r8aTWJ-$MpDP%p;N!*?Q5A4t78Co5rs5_s{r?b_LUc$FKz^3~|2mvwCJk zegEakJFiSSD_*EcM^nAI4OIAmuHo05s0!s|kvrB2J>5-1CZuI_1j@ta#W0hSxD+i7 zuLd7bzbOI1r$4#pG8oxaXQR)zidq8t(!DWc9Cltmk{GR#IcMTy*58Xo44Y_F#gJZA z9d<-FO)><|Z%TDm`0{XwkmqCqgC+34_JVs$Hj~CNSoU3MOmLaco9pEl09hI7+0+Zb zxfgRETg52yoh2(Fh9-YRms)9Pqp{N~cT zM#^)P63k@B#aZT6AqWh_=%8$T;C=dKu7C3dAnpQyQP})6eT8B9?}_I>+WyBBM7gb&%~^EzsjUXwWgJJa?cNYOVf8Ra(mK|KPJQTB z@yN{*A+4Rx8{dFv4sRP1rm{|$HNH(2N#w<+ zW)Z~))j`p2pSvbm@b_a;=*4U)Cx?v-fN9(8BhOF0P*-Bzapl5_!L#wrw6r8kmu@f5 zcw%Gx1)$vr!Ou(k5t5(h;!+`;t|K2O#rQ##q$=hB*C)KYt?tgYR4ayP-Sx6`72P2hjJtyP3w? z%wPCqe7{*WqGcJKx(m4sXQzX}o79A!JSBCRp!mO09R+NCQd`J6*%kq`vIqjF>X=I+ zDJZTG6U4#r7Frir?7VAL*05MA*%6}+HCyYAbZg8HjZJ3Qg%M}_6Z&5S{lY1aYN+Au zg$R~f84ikRVDO^W4{T!BJe@pVBG!OB1oR;ae}7E*7CoeY2z;bh(8O)KYYbkWhv6p~ zBwx%sRn+deBQgp-;d{Vf8n-W$dNNJ#`LndsX=-NcszR|H$?AdbMuo2ngWz+2u}X&p zf5)C3c^IkP#^8n~4IRUlsa7mes(`I!O;jLEl-n8i*^Wt^Gz0-7Kqv;6Am^vpYmb7N zz)NS(DLkL57>XKan*8qx>Uf%WMa7p&V#qEG<_lm5Ec2w*o5pRG?&jHX1?N7;<8vA6 z+aJnqiH}fmiPPv-kX;m*;xreC9>Mv6%%h@`)znmexJ1p#1mDmm6OfY_s3YRluo@vc5;<-EoP3qXy{bf85uMTRJ0flJ@@*hWX8N8 zFv-G*WJrCn7VupXYAdEZh|%;_YP-~%ZBdJ=KYtJY(pNrIeCk=!XxHVQ>i?rDa`YJu$wL zQdpvnE|5@z`Mg{H<23;Af1F--WW}Rk<{5!#mgS0}4B$OXR7t(}=plB>XoGaDu+TBG zpavT&0dchkGX8j{_g-c8$yP^rZla-BWOWLA0bNS6&=Cw>khUy8Ek+iaEj5jpi6OX= z#pgIgKy-BCifn?_deZ|TOq&Zo^0qAq*ZslNfiV|CwXYDe7UmVC7NkGod?q}qCwzZj zl8-lPkUOWvqp8)XX~^1~goARE(ULEQ(V(4qa18fUmbRpt-p>#9c%HVhu5u*k#YZl% zBUw{A$;e_IthM1iubt8rU4!bwB$B>NmKTfjpH^Oa>*^AI0+A_ zSJC3zVqHi@?qgQp!H>E@jvx!5T2E}|b+ir2CAqylj~IoHDpu1S?pVW_k320BxXXeZ z`t-kQxzeB}kZp}`#*yoS!;Y*YtLzFBR*{)uHwHx#P!UiF0YU;o0x0Vp9Cip35RiR_ zNXP<=1W6!lvhN^-07+Pe#XwjEAuO`IydSUL)UBy^t6tUn)z#hA)u&HY*Xi%;b3Vtc z(k0g)zpALfBeQzD%SMt2BtaE8t&anc9bcdRW%|!Le4W zUnQJF1E^bDQ&jV?V#~=sZe6KfpX$8x(n#GmYeX@_855?+JcTwgfK7wLIl5K36jp?g zqPEX_fAy`H7uA=m$EOxMNOHxj=<#9D9>jtH*ljU{J^B5@km25<`dT5) z-jZoZ4+&-%ZbNaS17`Qg2*t z8Nh%=X@*&>;*fdr6M8-nh?^F?ial7=#`D(-)``7BZdzhE#V2Svjh^RH~bHy+4QWagebgmuX{?zC=*EHGSDf8HjQdJ;J*#1EN z4o67PU^qAT`m!n!RTB`K%>KL=l65h|-dk&n=m%A7FG&;30W?btUs@JF6iC3n5md3* z@@HMO4tfeTky3#8;k3bDtdgC2lNr^j`N>(dXgTyeNgK0ksTyF9u1?$CYFl&xLKsTel zb=6SGi~xUvnYgDRHYC_md)&l1!~OFlF`Mn@2>Oj2jg}Ze3|;3pgtwHehS}X&Qr4>N z<2iX|%jcr)`7_HYRX`DM=z~CAyO*H5zzm0nkC$+z1&uN^|9)C)8@5a|%FS_okg`@8zJ zYESt=RpzUpcKMDeh5>dk55sT;HoDZCu~o$L1Mu%&RdP1Py|%`CYl;nrnze`trh5jo znpm+am=>qNV->bo|9o+jhPa7J?RHZ?H$RX%PkQZL5G~#y_B=bJN$iNtpVe0#Y`t(Q zbgjjyW#3Do3_80d<}@fNh$#EhK?~)VVS!3E*{X8RAD%TAB|X_UV;93_S}JPe{$K3_TwU?X!0O{;U4n8I*s!0 z&e|+I0$!I+#%Ch5FTm6%@Z7xDg_!ttfj{c(01<2z>CAwt0-qAOFG_XopY}F&8J{Pb znv}@V%-`KNi^ivC9bNC!RszH-4_BqSSCl)iv|e%%ZNw+1Z9MXa=1VuYs`~<5#%r?) zxE1p~1sq#=Z#FPGx}CPIO={M&CIs} zq#(5}JGKhX@NmG>!TSqv)^1~gw&MzIS0hz2$O<0rpn^m6tV`Rr?Jyf1!hH(jpXj$~ z71ehI-%h!iGPxX}j#x{FI6-=~*)^s?F^w4O0YXwzy0uLW`1+rWr)eb;%bzV2ms+Gq z=m`edptlkJ44)pNfrGTfm2r?3iu^miXO|^jIU5vwTM?t-KrhE0AQl^w8XC;@A`F1H zv~Ab=GlQ5pR}>9_HsF08aqAnvWM~xgoj_K`J#+A9F$i|`qxb-=++_w`cS&_df7s|M z-;7iEI@<~*xQ#4c^GZ1#)=c9fQqQ*i*#+yIYxi5|SdqaFKI)Nc#?qhF^9P7+0%S3^ zVIf-D74W7NUl}tvj|JQA1o$bb=^cU@$)qfuFlNNC&78Zbhml6@*rbKaKLm*n4rgr* zb}%MokXuk!lJIypb|QUGf+@cz%d@U8N8wN^lzM}e zynH5wUn~8#0gsQvX|z2l0dRD*5AMJv(?IkvUp)`HletSA!rN8lBaG02neWdJZu z_uE~)s_4*nrrRU{N+*bbNOv?Un;KiI9dU9gzx=5+ZXPhg_%YE-95u9Z#Xnfu1_~Ki zCaULvk!w>dofK{<>G9@!`B~^9-OX^6sK|SWU-=C)5N^<%0M&L7EOz-~iD!V-BGpski)Mnaabt7gefR{P$ z=&=0fjmsByNAL9vXg>*?$^Qd1Rcmg-!vzu}t7~q!g3Nk-COm)+UjWD^GM5q^bCQ zTFxFI34$9&S4vZ%A}xZ9NJAap3HKQ;e=27hhdBAtVPd3|5VXA+A*p?J#;2*q$GWMC z+7gjtTd}iUSBa^iZc*3BT()r(U&r%uCg%2J0M8Tj6{^=97HH4GD&@IHDnn83p=*@w z`{DMvvr+b8zaXqce(xkeOFR8|t3);Gb}?SPS8k0!46B#?9^6v#acS+N@A2KljiMu8 ze!U}BK)C&iPLAH|h)-NYRV%&VSRUvpjVM(Qbwn>APK6fhVy!2C-@a-VC=VK@%0!Ry4EA$wDdcA>ygZw$JvV) ze`EFOSC$kP-^T0S`BnGxvs)0<>%6K}Y<7*vqnRgA@*0Xby4j*B{n|Q(*`$=BoNK2--pJy;$>EQO zn_KCza|76uH!&Am(*B713g?|gNaqt*-Lg%I=6oa8W^~$#XVs~YOiUNYVzauWe|L64 z@l+^LfM>@t-k%sWpFi-zz@XX5xnm(R2z=Gh!)SOizUy zCB)ZQ3@=xY+34ILQ@DLu*1OgXqE7m->7FS9DM57KDAUAUnwc|Vk%1~)UvaXmAdw2e zt9UYWF&PR}zM6BZo#|C#w7Y+l%=9j<)-PSZ{3O5m8#MQrb@a1}B^tnuts=J=c6V^U|;u!t4izF0tPX6Qevg zSN$x16Uf~3<;q0rWuHJd(vfyM70*B=?bL|uC+*+$7IS(PIu0boCLjlyJ-Kemk84a@ z{<<#XubmubB^<*$(=~zMPIN;Y=8-iOk%rvjJGW(BtLq_>a&$}{2CKky1Ip6!wYD|T z3bZeC0#U;r!`MQL=e#q6JAWBaIEOsh7vQjqvr9t%Iwg&q-!3*~9ac2DWk?Ku!=DNK z{H8_i0M_#b)wl5j`kx<3!4~wmoQGblD3P+Q>c^8_-5-b5GMC4>Wwz5V)R^K;_lWKM znl>9G8ohh#BJtDyY!nk4T z_>;81Zo;+`7_hP_e9U{Nw8Oo6B6Qf$W*H&)YBEiV{io4?nLut-*~5Q`WxP(@KO3k& z7wH`qi&|Kjvbs3SokmZ|QWUsuo_ce{1UZ1_iHDJzlJi&d=)p$2b*^!huig{gK|i;qJbkwr(X&k0>YIG9q@}E# zEoY#%4sH2e5Z?)KZ1qLymOmP*h@cEG6CoTcZD`;V1OpPI()xr$He{CN&vdc zWjwG9Z_|%+lT$@tfOK9F5e+nT3e5T8{48aAq4~a6M3kPQ5lGU-A8vxov@g1pKjsQ+ zfHqCebcRSu)CEp}UV0sCT*-!}=Qc{L1M;ii}vJd@EB)SeZ z=KN$#VywZ=>O=X}rt4iN_XPo(guMXnG<1^2_SpQE4_!ubjM^P4gYd*Jcw;lk4$5 zDg}lL_^RCJl_8<;Y&Br?0Fz6dss$DnwnHvY0h9cz4@Wm9nBX7nc?P=Jk;SQvLME`3 z>zy;?4uZI;fLzn&WE!(Wo)2I2vSUQ3Y2%4O0UmolRl)TYM%6N=75c4y`zqK;aqwO@ z#LcOt({P+(3*u$Pu%7fc zhDQ1#a(0Ru_c{a&?+?>E>5TYcs*j`8GMQT*Y;xw@`POHR=d;Hq73J&_7)`4xrMREp zRu6#%>Hh#xeSr#^u;brrn4VA1&%Io5zM%74hqIPx+K>1S!%^Ay-wbi-X4a8eABd$P zzz`8}Jr#gNv2mPTTF4;;EqKcm3jH6;RsNg*{k!%*XlGJU zi9r6{u2>JId2E5v9j2Jx%AO}`&)oA)4kZMrjDwZ6bKCG+)?z>2T{u79l&L%MFUH@s Ssr&nL|J{cFUt_VStp5Z;$2}SV diff --git a/docs/images/lib2x-polytransversals-1.JPG b/docs/images/lib2x-polytransversals-1.JPG deleted file mode 100644 index 4d46eea828177e10453c48bcf65475b4359b0c0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26273 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 QkN(}j@gEM|_1^~n3vFL}K>z>% diff --git a/docs/images/lib2x-polytransversals-2.JPG b/docs/images/lib2x-polytransversals-2.JPG deleted file mode 100644 index 8da7cf5760bfe64f2fa4f07addb506f68ca6f2a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22024 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 diff --git a/docs/images/lib2x-polytransversals-3.JPG b/docs/images/lib2x-polytransversals-3.JPG deleted file mode 100644 index 6dbf24ead13246631cdeff9150263c39d5321c36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14524 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�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 Qgs=YVgd`?*?(^i|0O9vEKL7v# diff --git a/docs/images/lib2x-shape_glued2circles-3.JPG b/docs/images/lib2x-shape_glued2circles-3.JPG deleted file mode 100644 index 0eea1e0ad7cad145e2be1c93c5a80a3c223e43dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18243 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 bxOOX73FawyT;B)++Wudi|MFYd#qj?JEc%rp diff --git a/docs/lib2x-polytransversals.md b/docs/lib2x-polytransversals.md deleted file mode 100644 index 50490078..00000000 --- a/docs/lib2x-polytransversals.md +++ /dev/null @@ -1,42 +0,0 @@ -# polytransversals - -Crosscutting a polyline at different points gets several transversals. This module can operate reversely. It uses transversals to construct a polyline. For example, imagine that you have the following transversals: - -![polytransversals](images/lib2x-polytransversals-1.JPG) - -This module can use them to construct the polyline: - -![polytransversals](images/lib2x-polytransversals-2.JPG) - -When using this module, you should use points to represent each transversal. - -You can view it as a better polyline2d module. If you have only the points of a path, using `polyline2d` or `hull_polyline2d` is a simple solution. If you know the transversals along a path, you can use `polytransversals` to get a better polyline. - -## Parameters - -- `transversals` : A list of transversals. Each transversal is represented by a list of points. See the example below. - -## Examples - - use ; - use ; - use ; - - r = 35; - tran_pts = [[-5, 0], [0, 5], [5, 0]]; - - trans = [ - for(a = [0:10:120]) - [ - for(p = tran_pts) - rotate_p(p, [0, 0, a]) + [r * cos(a), r * sin(a)] - ] - ]; - - polytransversals(trans); - - #for(tran = trans) { - hull_polyline2d(tran, 0.5); - } - -![polytransversals](images/lib2x-polytransversals-3.JPG) diff --git a/docs/lib2x-shape_glued2circles.md b/docs/lib2x-shape_glued2circles.md deleted file mode 100644 index 4c10bb6a..00000000 --- a/docs/lib2x-shape_glued2circles.md +++ /dev/null @@ -1,65 +0,0 @@ -# shape_glued2circles - -Returns shape points of two glued circles. They can be used with xxx_extrude modules of dotSCAD. The shape points can be also used with the built-in polygon module. - -## Parameters - -- `radius` : The radius of two circles. -- `centre_dist` : The distance between centres of two circles. -- `tangent_angle` : The angle of a tangent line. It defaults to 30 degrees. See examples below. -- `t_step` : It defaults to 0.1. See [bezier_curve](https://openhome.cc/eGossip/OpenSCAD/lib2x-bezier_curve.html) for details. -- `$fa`, `$fs`, `$fn` : Check [the circle module](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Using_the_2D_Subsystem#circle) for more details. - -## Examples - - use ; - - $fn = 36; - - radius = 10; - centre_dist = 30; - - shape_pts = shape_glued2circles(radius, centre_dist); - polygon(shape_pts); - -![shape_glued2circles](images/lib2x-shape_glued2circles-1.JPG) - - use ; - - $fn = 36; - - radius = 10; - centre_dist = 30; - - shape_pts = shape_glued2circles(radius, centre_dist); - width = centre_dist / 2 + radius; - - rotate_extrude() difference() { - polygon(shape_pts); - - translate([-width, -radius]) - square([width, radius * 2]); - } - -![shape_glued2circles](images/lib2x-shape_glued2circles-2.JPG) - - use ; - - $fn = 36; - - radius = 10; - centre_dist = 30; - - shape_pts = shape_glued2circles(radius, centre_dist); - - width = centre_dist + radius * 2; - - rotate_extrude() - intersection() { - rotate(-90) polygon(shape_pts); - - translate([radius / 2, 0]) - square([radius, width], center = true); - } - -![shape_glued2circles](images/lib2x-shape_glued2circles-3.JPG) \ No newline at end of file From cb85b7e6b53477fa7a00892ef3fe53906ff5ec36 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sat, 6 Feb 2021 18:01:09 +0800 Subject: [PATCH 12/99] clean deprecated modules/functions --- src/__comm__/__polytransversals.scad | 22 - src/_impl/_shape_glued2circles_impl.scad | 66 -- src/_impl/_shape_path_extend_impl.scad | 23 +- src/circle_path.scad | 23 - src/pixel/_impl/_px_circle_impl.scad | 54 -- src/pixel/_impl/_px_cylinder_impl.scad | 50 -- src/pixel/_impl/_px_from_impl.scad | 21 - src/pixel/_impl/_px_gray_impl.scad | 29 - src/pixel/_impl/_px_line_impl.scad | 202 ----- src/pixel/px_ascii.scad | 974 ----------------------- src/pixel/px_circle.scad | 20 - src/pixel/px_cylinder.scad | 20 - src/pixel/px_from.scad | 17 - src/pixel/px_gray.scad | 17 - src/pixel/px_line.scad | 17 - src/pixel/px_polygon.scad | 34 - src/pixel/px_polyline.scad | 29 - src/pixel/px_sphere.scad | 34 - src/polysections.scad | 255 ------ src/polytransversals.scad | 18 - src/rotate_p.scad | 15 - src/shape_glued2circles.scad | 15 - src/voronoi2d.scad | 57 -- src/voronoi3d.scad | 45 -- test/test_all.scad | 1 - 25 files changed, 22 insertions(+), 2036 deletions(-) delete mode 100644 src/__comm__/__polytransversals.scad delete mode 100644 src/_impl/_shape_glued2circles_impl.scad delete mode 100644 src/circle_path.scad delete mode 100644 src/pixel/_impl/_px_circle_impl.scad delete mode 100644 src/pixel/_impl/_px_cylinder_impl.scad delete mode 100644 src/pixel/_impl/_px_from_impl.scad delete mode 100644 src/pixel/_impl/_px_gray_impl.scad delete mode 100644 src/pixel/_impl/_px_line_impl.scad delete mode 100644 src/pixel/px_ascii.scad delete mode 100644 src/pixel/px_circle.scad delete mode 100644 src/pixel/px_cylinder.scad delete mode 100644 src/pixel/px_from.scad delete mode 100644 src/pixel/px_gray.scad delete mode 100644 src/pixel/px_line.scad delete mode 100644 src/pixel/px_polygon.scad delete mode 100644 src/pixel/px_polyline.scad delete mode 100644 src/pixel/px_sphere.scad delete mode 100644 src/polysections.scad delete mode 100644 src/polytransversals.scad delete mode 100644 src/rotate_p.scad delete mode 100644 src/shape_glued2circles.scad delete mode 100644 src/voronoi2d.scad delete mode 100644 src/voronoi3d.scad diff --git a/src/__comm__/__polytransversals.scad b/src/__comm__/__polytransversals.scad deleted file mode 100644 index bbf39539..00000000 --- a/src/__comm__/__polytransversals.scad +++ /dev/null @@ -1,22 +0,0 @@ -use <../util/reverse.scad>; - -function __polytransversals(transversals) = - let( - leng_trs = len(transversals), - leng_tr = len(transversals[0]), - lefts = [ - for(i = 1; i < leng_trs - 1; i = i + 1) - let(tr = transversals[leng_trs - i]) - tr[0] - ], - rights = [ - for(i = 1; i < leng_trs - 1; i = i + 1) - let(tr = transversals[i]) - tr[leng_tr - 1] - ] - ) concat( - transversals[0], - rights, - reverse(transversals[leng_trs - 1]), - lefts - ); \ No newline at end of file diff --git a/src/_impl/_shape_glued2circles_impl.scad b/src/_impl/_shape_glued2circles_impl.scad deleted file mode 100644 index f737a17d..00000000 --- a/src/_impl/_shape_glued2circles_impl.scad +++ /dev/null @@ -1,66 +0,0 @@ -use <../ptf/ptf_rotate.scad>; -use <../shape_pie.scad>; -use <../bezier_curve.scad>; - -function _glued2circles_pie_curve(radius, centre_dist, tangent_angle) = - let( - begin_ang = 90 + tangent_angle, - shape_pts = shape_pie(radius, [-begin_ang, begin_ang]), - leng = len(shape_pts) - ) - [ - for(i = 1; i < leng; i = i + 1) - shape_pts[i] + [centre_dist / 2, 0] - ]; - -function _glued2circles_bezier(radius, centre_dist, tangent_angle, t_step, ctrl_p1) = - let( - ctrl_p = ptf_rotate([radius * tan(tangent_angle), -radius], tangent_angle), - ctrl_p2 = [-ctrl_p[0], ctrl_p[1]] + [centre_dist / 2, 0], - ctrl_p3 = [-ctrl_p2[0], ctrl_p2[1]], - ctrl_p4 = [-ctrl_p1[0], ctrl_p1[1]] - ) - bezier_curve( - t_step, - [ - ctrl_p1, - ctrl_p2, - ctrl_p3, - ctrl_p4 - ] - ); - -function _glued2circles_lower_half_curve(curve_pts, leng) = - [ - for(i = 0; i < leng; i = i + 1) - let(p = curve_pts[leng - 1 - i]) - if(p[0] >= 0) p - ]; - -function _glued2circles_half_glued_circle(radius, centre_dist, tangent_angle, t_step) = - let( - pie_curve_pts = _glued2circles_pie_curve(radius, centre_dist, tangent_angle), - curve_pts = _glued2circles_bezier(radius, centre_dist, tangent_angle, t_step, pie_curve_pts[0]), - lower_curve_pts = _glued2circles_lower_half_curve(curve_pts, len(curve_pts)), - leng_half_curve_pts = len(lower_curve_pts), - upper_curve_pts = [ - for(i = 0; i < leng_half_curve_pts; i = i + 1) - let(pt = lower_curve_pts[leng_half_curve_pts - 1 - i]) - [pt[0], -pt[1]] - ] - ) concat( - lower_curve_pts, - pie_curve_pts, - upper_curve_pts - ); - -function _shape_glued2circles_impl(radius, centre_dist, tangent_angle, t_step) = - let( - half_glued_circles = _glued2circles_half_glued_circle(radius, centre_dist, tangent_angle, t_step), - leng_half_glued_circles = len(half_glued_circles), - left_half_glued_circles = [ - for(i = 0; i < leng_half_glued_circles; i = i + 1) - let(pt = half_glued_circles[leng_half_glued_circles - 1 - i]) - [-pt[0], pt[1]] - ] - ) concat(half_glued_circles, left_half_glued_circles); \ No newline at end of file diff --git a/src/_impl/_shape_path_extend_impl.scad b/src/_impl/_shape_path_extend_impl.scad index 0b106e8e..e3abdf8c 100644 --- a/src/_impl/_shape_path_extend_impl.scad +++ b/src/_impl/_shape_path_extend_impl.scad @@ -1,6 +1,27 @@ use <../__comm__/__to3d.scad>; -use <../__comm__/__polytransversals.scad>; use <../ptf/ptf_rotate.scad>; +use <../util/reverse.scad>; + +function __polytransversals(transversals) = + let( + leng_trs = len(transversals), + leng_tr = len(transversals[0]), + lefts = [ + for(i = 1; i < leng_trs - 1; i = i + 1) + let(tr = transversals[leng_trs - i]) + tr[0] + ], + rights = [ + for(i = 1; i < leng_trs - 1; i = i + 1) + let(tr = transversals[i]) + tr[leng_tr - 1] + ] + ) concat( + transversals[0], + rights, + reverse(transversals[leng_trs - 1]), + lefts + ); function _shape_path_extend_az(p1, p2) = let( diff --git a/src/circle_path.scad b/src/circle_path.scad deleted file mode 100644 index 5a5e6e8f..00000000 --- a/src/circle_path.scad +++ /dev/null @@ -1,23 +0,0 @@ -/** -* circle_path.scad -* -* @copyright Justin Lin, 2017 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-circle_path.html -* -**/ - -use <__comm__/__frags.scad>; - -function circle_path(radius, n) = - let( - _ = echo("circle_path is deprecated: use shape_circle instead."), - _frags = __frags(radius), - step_a = 360 / _frags, - end_a = 360 - step_a * ((is_undef(n) || n > _frags) ? 1 : _frags - n + 1) - ) - [ - for(a = 0; a <= end_a; a = a + step_a) - [radius * cos(a), radius * sin(a)] - ]; diff --git a/src/pixel/_impl/_px_circle_impl.scad b/src/pixel/_impl/_px_circle_impl.scad deleted file mode 100644 index 873803cf..00000000 --- a/src/pixel/_impl/_px_circle_impl.scad +++ /dev/null @@ -1,54 +0,0 @@ -function _px_circle_y(f, y) = f >= 0 ? y - 1 : y; -function _px_circle_ddf_y(f, ddf_y) = f >= 0 ? ddf_y + 2 : ddf_y; -function _px_circle_f(f, ddf_y) = f >= 0 ? f + ddf_y : f; - -function _px_circle(f, ddf_x, ddf_y, x, y, filled) = - x >= y ? [] : - let( - ny = _px_circle_y(f, y), - nddf_y = _px_circle_ddf_y(f, ddf_y), - nx = x + 1, - nddf_x = ddf_x + 2, - nf = _px_circle_f(f, ddf_y) + nddf_x - ) - concat( - filled ? - concat( - [for(xi = -nx; xi <= nx; xi = xi + 1) [xi, -ny]], - [for(xi = -ny; xi <= ny; xi = xi + 1) [xi, -nx]], - [for(xi = -ny; xi <= ny; xi = xi + 1) [xi, nx]], - [for(xi = -nx; xi <= nx; xi = xi + 1) [xi, ny]] - ) - : - [ - [-nx, -ny], [nx, -ny], - [-ny, -nx], [ny, -nx], - [-ny, nx], [ny, nx], - [-nx, ny], [nx, ny] - ], - _px_circle(nf, nddf_x, nddf_y, nx, ny, filled) - ); - -function _px_circle_impl(radius, filled) = - let( - f = 1 - radius, - ddf_x = 1, - ddf_y = -2 * radius, - x = 0, - y = radius - ) - concat( - filled ? - concat( - [[0, radius], [0, -radius]], - [for(xi = -radius; xi <= radius; xi = xi + 1) [xi, 0]] - ) - : - [ - [0, -radius], - [-radius, 0], - [radius, 0], - [0, radius] - ], - _px_circle(f, ddf_x, ddf_y, x, y, filled) - ); \ No newline at end of file diff --git a/src/pixel/_impl/_px_cylinder_impl.scad b/src/pixel/_impl/_px_cylinder_impl.scad deleted file mode 100644 index a7639bd4..00000000 --- a/src/pixel/_impl/_px_cylinder_impl.scad +++ /dev/null @@ -1,50 +0,0 @@ - -function _px_cylinder_px_circle(radius, filled, thickness) = - let(range = [-radius: radius - 1]) - filled ? [ - for(y = range) - for(x = range) - let(v = [x, y]) - if(norm(v) < radius) v - ] : - let(ishell = radius * radius - 2 * thickness * radius) - [ - for(y = range) - for(x = range) - let( - v = [x, y], - leng = norm(v) - ) - if(leng < radius && (leng * leng) > ishell) v - ]; - -function _px_cylinder_diff_r(r, h, filled, thickness) = - let( - r1 = r[0], - r2 = r[1] - ) - r1 == r2 ? _px_cylinder_same_r(r1, h, filled, thickness) : - let(dr = (r2 - r1) / (h - 1)) - [ - for(i = 0; i < h; i = i + 1) - let(r = round(r1 + dr * i)) - each [ - for(pt = _px_cylinder_px_circle(r, filled, thickness)) - [pt[0], pt[1], i] - ] - ]; - -function _px_cylinder_same_r(r, h, filled, thickness) = - let(c = _px_cylinder_px_circle(r, filled, thickness)) - [ - for(i = 0; i < h; i = i + 1) - each [ - for(pt = c) - [pt[0], pt[1], i] - ] - ]; - -function _px_cylinder_impl(r, h, filled, thickness) = - is_num(r) ? - _px_cylinder_same_r(r, h, filled, thickness) : - _px_cylinder_diff_r(r, h, filled, thickness); \ No newline at end of file diff --git a/src/pixel/_impl/_px_from_impl.scad b/src/pixel/_impl/_px_from_impl.scad deleted file mode 100644 index f0cd564e..00000000 --- a/src/pixel/_impl/_px_from_impl.scad +++ /dev/null @@ -1,21 +0,0 @@ -function _px_from_row(r_count, row_bits, width, height, center, invert) = - let( - half_w = width / 2, - half_h = height / 2, - offset_x = center ? 0 : half_w, - offset_y = center ? -half_h : 0, - bit = invert ? 0 : 1 - ) - [for(i = 0; i < width; i = i + 1) if(row_bits[i] == bit) [i - half_w + offset_x, r_count + offset_y]]; - -function _px_from_impl(binaries, center, invert) = - let( - width = len(binaries[0]), - height = len(binaries), - offset_i = height / 2 - ) - [ - for(i = height - 1; i > -1; i = i - 1) - let(row = _px_from_row(height - i - 1, binaries[i], width, height, center, invert)) - if(row != []) each row - ]; \ No newline at end of file diff --git a/src/pixel/_impl/_px_gray_impl.scad b/src/pixel/_impl/_px_gray_impl.scad deleted file mode 100644 index 1da800fb..00000000 --- a/src/pixel/_impl/_px_gray_impl.scad +++ /dev/null @@ -1,29 +0,0 @@ -function _px_gray_row(r_count, row_bits, width, height, center, invert, normalize) = - let( - half_w = width / 2, - half_h = height / 2, - offset_x = center ? 0 : half_w, - offset_y = center ? -half_h : 0, - level = invert ? 0 : 255, - nmal = normalize ? 255 : 1 - ) - [ - for(i = 0; i < width; i = i + 1) - if(row_bits[i] != level) - [ - [i - half_w + offset_x, r_count + offset_y], - invert ? row_bits[i] / nmal : (255 - row_bits[i]) / nmal - ] - ]; - -function _px_gray_impl(levels, center, invert, normalize) = - let( - width = len(levels[0]), - height = len(levels), - offset_i = height / 2 - ) - [ - for(i = height - 1; i > -1; i = i - 1) - let(row = _px_gray_row(height - i - 1, levels[i], width, height, center, invert, normalize)) - if(row != []) each row - ]; \ No newline at end of file diff --git a/src/pixel/_impl/_px_line_impl.scad b/src/pixel/_impl/_px_line_impl.scad deleted file mode 100644 index f586bc34..00000000 --- a/src/pixel/_impl/_px_line_impl.scad +++ /dev/null @@ -1,202 +0,0 @@ - -use <../../__comm__/__to3d.scad>; -use <../../__comm__/__to2d.scad>; - -function _px_line_zsgn(a) = a == 0 ? a : a / abs(a); - -// x-dominant -function _px_line_xdominant_y(y, yd, sy) = yd >= 0 ? y + sy : y; -function _px_line_xdominant_yd(yd, ax, ay) = (yd >= 0 ? yd - ax : yd) + ay; -function _px_line_xdominant_z(z, zd, sz) = zd >= 0 ? z + sz : z; -function _px_line_xdominant_zd(zd, ax, az) = (zd >= 0 ? zd - ax : zd) + az; - -function _px_line_xdominant(start, end, a, s) = - let( - x = start[0], - y = start[1], - z = start[2], - ax = a[0], - ay = a[1], - az = a[2], - sx = s[0], - sy = s[1], - sz = s[2], - shrx = floor(ax / 2), - yd = ay - shrx, - zd = az - shrx, - endx = end[0] - ) - concat( - [start], - _px_line_xdominant_sub( - x + sx, - _px_line_xdominant_y(y, yd, sy), - _px_line_xdominant_z(z, zd, sz), - endx, - a, - s, - _px_line_xdominant_yd(yd, ax, ay), - _px_line_xdominant_zd(zd, ax, az) - ) - ); - -function _px_line_xdominant_sub(x, y, z, endx, a, s, yd, zd) = - let( - ax = a[0], - ay = a[1], - az = a[2], - sx = s[0], - sy = s[1], - sz = s[2] - ) - x == endx ? [] : - concat([[x, y, z]], - _px_line_xdominant_sub( - x + sx, - _px_line_xdominant_y(y, yd, sy), - _px_line_xdominant_z(z, zd, sz), - endx, - a, - s, - _px_line_xdominant_yd(yd, ax, ay), - _px_line_xdominant_zd(zd, ax, az) - ) - ); - -// y-dominant -function _px_line_ydominant_x(x, xd, sx) = xd >= 0 ? x + sx : x; -function _px_line_ydominant_xd(xd, ax, ay) = (xd >= 0 ? xd - ay : xd) + ax; -function _px_line_ydominant_z(z, zd, sz) = zd >= 0 ? z + sz : z; -function _px_line_ydominant_zd(zd, ay, az) = (zd >= 0 ? zd - ay : zd) + az; - -function _px_line_ydominant(start, end, a, s) = - let( - x = start[0], - y = start[1], - z = start[2], - ax = a[0], - ay = a[1], - az = a[2], - sx = s[0], - sy = s[1], - sz = s[2], - shry = floor(ay / 2), - xd = ax - shry, - zd = az - shry, - endy = end[1] - ) - concat( - [start], - _px_line_ydominant_sub( - _px_line_ydominant_x(x, xd, sx), - y + sy, - _px_line_ydominant_z(z, zd, sz), - endy, - a, - s, - _px_line_ydominant_xd(xd, ax, ay), - _px_line_ydominant_zd(zd, ay, az) - ) - ); - -function _px_line_ydominant_sub(x, y, z, endy, a, s, xd, zd) = - let( - ax = a[0], - ay = a[1], - az = a[2], - sx = s[0], - sy = s[1], - sz = s[2] - ) - y == endy ? [] : - concat([[x, y, z]], - _px_line_ydominant_sub( - _px_line_ydominant_x(x, xd, sx), - y + sy, - _px_line_ydominant_z(z, zd, sz), - endy, - a, - s, - _px_line_ydominant_xd(xd, ax, ay), - _px_line_ydominant_zd(zd, ay, az) - ) - ); - -// z-dominant -function _px_line_zdominant_x(x, xd, sx) = xd >= 0 ? x + sx : x; -function _px_line_zdominant_xd(xd, ax, az) = (xd >= 0 ? xd - az : xd) + ax; - -function _px_line_zdominant_y(y, yd, sy) = yd >= 0 ? y + sy : y; -function _px_line_zdominant_yd(yd, ay, az) = (yd >= 0 ? yd - az : yd) + ay; - -function _px_line_zdominant(start, end, a, s) = - let( - x = start[0], - y = start[1], - z = start[2], - ax = a[0], - ay = a[1], - az = a[2], - sx = s[0], - sy = s[1], - sz = s[2], - shrz = floor(az / 2), - xd = ax - shrz, - yd = ay - shrz, - endz = end[2] - ) - concat( - [start], - _px_line_zdominant_sub( - _px_line_zdominant_x(x, xd, sx), - _px_line_zdominant_y(y, yd, sy), - z + sz, - endz, - a, - s, - _px_line_zdominant_xd(xd, ax, az), - _px_line_zdominant_yd(yd, ay, az) - ) - ); - -function _px_line_zdominant_sub(x, y, z, endz, a, s, xd, yd) = - let( - ax = a[0], - ay = a[1], - az = a[2], - sx = s[0], - sy = s[1], - sz = s[2] - ) - z == endz ? [] : - concat([[x, y, z]], - _px_line_zdominant_sub( - _px_line_zdominant_x(x, xd, sx), - _px_line_zdominant_y(y, yd, sy), - z + sz, - endz, - a, - s, - _px_line_zdominant_xd(xd, ax, az), - _px_line_zdominant_yd(yd, ay, az) - ) - ); - -function _px_line_impl(p1, p2) = - let( - is_2d = len(p1) == 2, - start_pt = is_2d ? __to3d(p1) : p1, - end_pt = is_2d ? __to3d(p2) : p2, - dt = end_pt - start_pt, - ax = floor(abs(dt[0]) * 2), - ay = floor(abs(dt[1]) * 2), - az = floor(abs(dt[2]) * 2), - sx = _px_line_zsgn(dt[0]), - sy = _px_line_zsgn(dt[1]), - sz = _px_line_zsgn(dt[2]), - points = ax >= max(ay, az) ? _px_line_xdominant(start_pt, end_pt, [ax, ay, az], [sx, sy, sz]) : ( - ay >= max(ax, az) ? _px_line_ydominant(start_pt, end_pt, [ax, ay, az], [sx, sy, sz]) : - _px_line_zdominant(start_pt, end_pt, [ax, ay, az], [sx, sy, sz]) - ) - ) - is_2d ? [for(pt = points) __to2d(pt)] : points; \ No newline at end of file diff --git a/src/pixel/px_ascii.scad b/src/pixel/px_ascii.scad deleted file mode 100644 index 551ecccb..00000000 --- a/src/pixel/px_ascii.scad +++ /dev/null @@ -1,974 +0,0 @@ -/** -* px_ascii.scad -* -* @copyright Justin Lin, 2019 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-px_ascii.html -* -**/ - -use ; - -function px_ascii(char, center = false, invert = false) = - let( - _ = echo("pixel/px_ascii is deprecated: use voxel/vx_ascii instead."), - code = ord(char) - ) - assert(code > 31 && code < 127, "not printable character") - let( - idx = code - 32, - binaries = [ - [// " " - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "!" - [0,0,0,0,0,0,0,0], - [0,0,0,0,1,0,0,0], - [0,0,0,0,1,0,0,0], - [0,0,0,0,1,0,0,0], - [0,0,0,0,1,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "\"" - [0,0,0,0,0,0,0,0], - [0,0,0,1,0,1,0,0], - [0,0,0,1,0,1,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "#" - [0,0,0,0,0,0,0,0], - [0,0,1,0,0,1,0,0], - [0,1,1,1,1,1,1,0], - [0,0,1,0,0,1,0,0], - [0,0,1,0,0,1,0,0], - [0,1,1,1,1,1,1,0], - [0,0,1,0,0,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "$" - [0,0,0,0,0,0,0,0], - [0,0,0,1,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,0,1,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,0,0,1,0,0,1,0], - [0,1,1,1,1,1,0,0], - [0,0,0,1,0,0,0,0] - ], - [// "%" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,1,0,0,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "&" - [0,0,0,0,0,0,0,0], - [0,0,1,1,0,0,0,0], - [0,1,0,0,1,0,0,0], - [0,0,1,1,0,0,0,0], - [0,1,0,0,1,0,1,0], - [0,1,0,0,0,1,0,0], - [0,0,1,1,1,0,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "'" - [0,0,0,0,0,0,0,0], - [0,0,0,0,1,0,0,0], - [0,0,0,0,1,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "(" - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,1,0,0], - [0,0,1,1,1,0,0,0], - [0,0,1,1,0,0,0,0], - [0,0,1,1,0,0,0,0], - [0,0,1,1,1,0,0,0], - [0,0,0,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// ")" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,0,0,0], - [0,0,0,1,1,1,0,0], - [0,0,0,0,1,1,0,0], - [0,0,0,0,1,1,0,0], - [0,0,0,1,1,1,0,0], - [0,0,1,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "*" - [0,0,0,0,0,0,0,0], - [0,1,0,1,0,1,0,0], - [0,0,1,1,1,0,0,0], - [0,0,0,1,0,0,0,0], - [0,0,1,1,1,0,0,0], - [0,1,0,1,0,1,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "+" - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,1,1,1,1,1,1,0], - [0,1,1,1,1,1,1,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "," - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,0,0,0,0] - ], - [// "-" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "." - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "/" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,1,1,0], - [0,0,0,0,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "0" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,1,1,1,0], - [0,1,1,1,1,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "1" - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "2" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,0,0,0,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "3" - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "4" - [0,0,0,0,0,0,0,0], - [0,0,0,0,1,1,0,0], - [0,0,0,1,1,1,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,1,1,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "5" - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,1,1,0,0,0,0,0], - [0,1,1,1,1,1,0,0], - [0,0,0,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "6" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "7" - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,0,1,1,0], - [0,0,0,0,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,0,0,0,0], - [0,0,1,1,0,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "8" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "9" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,1,0], - [0,0,0,0,0,1,1,0], - [0,0,0,0,1,1,0,0], - [0,0,1,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// ":" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// ";" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,0,0,0,0] - ], - [// "<" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,1,1,0], - [0,0,0,0,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,1,1,0,0], - [0,0,0,0,0,1,1,0] - ], - [// "=" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// ">" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,0,1,1,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,0,0,0,0], - [0,1,1,0,0,0,0,0] - ], - [// "?" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,0,0,0,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "@" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,1,0,1,0], - [0,1,1,0,1,1,1,0], - [0,1,1,0,0,0,0,0], - [0,0,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "A" - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,1,1,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "B" - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "C" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "D" - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,0,0,0], - [0,1,1,0,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,1,1,0,0], - [0,1,1,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "E" - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,1,1,0,0,0,0,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "F" - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,1,1,0,0,0,0,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "G" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,1,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,1,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "H" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,1,1,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "I" - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "J" - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,1,1,0], - [0,0,0,0,1,1,0,0], - [0,0,0,0,1,1,0,0], - [0,0,0,0,1,1,0,0], - [0,1,0,0,1,1,0,0], - [0,1,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0], - ], - [// "K" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,1,1,0,0], - [0,1,1,1,1,0,0,0], - [0,1,1,1,1,0,0,0], - [0,1,1,0,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "L" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "M" - [0,0,0,0,0,0,0,0], - [1,1,0,0,0,1,1,0], - [1,1,1,0,1,1,1,0], - [1,1,1,1,1,1,1,0], - [1,1,0,1,0,1,1,0], - [1,1,0,0,0,1,1,0], - [1,1,0,0,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "N" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,1,0,1,1,0], - [0,1,1,1,1,1,1,0], - [0,1,1,1,1,1,1,0], - [0,1,1,0,1,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "O" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "P" - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "Q" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,1,1,1,0,0], - [0,0,1,1,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "R" - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "S" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,1,1,0], - [0,0,0,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "T" - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "U" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "V" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "W" - [0,0,0,0,0,0,0,0], - [1,1,0,0,0,1,1,0], - [1,1,0,0,0,1,1,0], - [1,1,0,1,0,1,1,0], - [1,1,1,1,1,1,1,0], - [1,1,1,0,1,1,1,0], - [1,1,0,0,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "X" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "Y" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "Z" - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "/" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,0,1,1,0,0,0,0], - [0,0,1,1,0,0,0,0], - [0,0,1,1,0,0,0,0], - [0,0,1,1,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "\\" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,0,1,1,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,1,1,0,0], - [0,0,0,0,0,1,1,0], - [0,0,0,0,0,0,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "]" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,1,1,0,0], - [0,0,0,0,1,1,0,0], - [0,0,0,0,1,1,0,0], - [0,0,0,0,1,1,0,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "^" - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,0,0,0,0,1,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "_" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [1,1,1,1,1,1,1,1] - ], - [// "`" - [0,0,0,0,0,0,0,0], - [0,0,0,1,0,0,0,0], - [0,0,0,0,1,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "a" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,1,1,0], - [0,0,1,1,1,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "b" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "c" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "d" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,1,1,0], - [0,0,0,0,0,1,1,0], - [0,0,1,1,1,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "e" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,1,1,1,1,0], - [0,1,1,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "f" - [0,0,0,0,0,0,0,0], - [0,0,0,0,1,1,1,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,1,1,1,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "g" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,1,0], - [0,0,0,0,0,1,1,0], - [0,1,1,1,1,1,0,0] - ], - [// "h" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "i" - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "j" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,1,1,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,1,1,0], - [0,0,0,0,0,1,1,0], - [0,0,0,0,0,1,1,0], - [0,0,0,0,0,1,1,0], - [0,0,1,1,1,1,0,0] - ], - [// "k" - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,1,1,0,0], - [0,1,1,1,1,0,0,0], - [0,1,1,0,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "l" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "m" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,1,1,1,1,1], - [0,1,1,1,1,1,1,1], - [0,1,1,0,1,0,1,1], - [0,1,1,0,0,0,1,1], - [0,0,0,0,0,0,0,0] - ], - [// "n" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "o" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "p" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0] - ], - [// "q" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,1,0], - [0,0,0,0,0,1,1,0], - [0,0,0,0,0,1,1,0] - ], - [// "r" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,1,1,0,0,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "s" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,1,1,0], - [0,1,1,0,0,0,0,0], - [0,0,1,1,1,1,0,0], - [0,0,0,0,0,1,1,0], - [0,1,1,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "t" - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "u" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "v" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "w" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,0,1,1], - [0,1,1,0,1,0,1,1], - [0,1,1,1,1,1,1,1], - [0,0,1,1,1,1,1,0], - [0,0,1,1,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "x" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,1,1,0,0,1,1,0], - [0,0,1,1,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,1,1,0,0], - [0,1,1,0,0,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "y" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "z" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,1,1,0,0], - [0,0,0,1,1,0,0,0], - [0,0,1,1,0,0,0,0], - [0,1,1,1,1,1,1,0], - [0,0,0,0,0,0,0,0] - ], - [// "{" - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,1,0,0], - [0,0,1,1,0,0,0,0], - [0,1,1,1,0,0,0,0], - [0,1,1,1,0,0,0,0], - [0,0,1,1,0,0,0,0], - [0,0,0,1,1,1,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "|" - [0,0,0,0,0,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "}" - [0,0,0,0,0,0,0,0], - [0,0,1,1,1,0,0,0], - [0,0,0,0,1,1,0,0], - [0,0,0,0,1,1,1,0], - [0,0,0,0,1,1,1,0], - [0,0,0,0,1,1,0,0], - [0,0,1,1,1,0,0,0], - [0,0,0,0,0,0,0,0] - ], - [// "~" - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,1,1,0,0,0,0], - [0,1,0,1,1,0,1,0], - [0,0,0,0,1,1,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0], - [0,0,0,0,0,0,0,0] - ] - ] - ) - px_from(binaries[idx], center = center, invert = invert); \ No newline at end of file diff --git a/src/pixel/px_circle.scad b/src/pixel/px_circle.scad deleted file mode 100644 index d55c8040..00000000 --- a/src/pixel/px_circle.scad +++ /dev/null @@ -1,20 +0,0 @@ -/** -* px_circle.scad -* -* @copyright Justin Lin, 2019 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-px_circle.html -* -**/ - -use <_impl/_px_circle_impl.scad>; -use <../util/sort.scad>; -use <../util/dedup.scad>; - -function px_circle(radius, filled = false) = - let( - _ = echo("pixel/px_circle is deprecated: use voxel/vx_circle instead."), - all = _px_circle_impl(radius, filled) - ) - dedup(sort(all, by = "vt"), sorted = true); \ No newline at end of file diff --git a/src/pixel/px_cylinder.scad b/src/pixel/px_cylinder.scad deleted file mode 100644 index 63cf6352..00000000 --- a/src/pixel/px_cylinder.scad +++ /dev/null @@ -1,20 +0,0 @@ -/** -* px_cylinder.scad -* -* @copyright Justin Lin, 2019 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-px_cylinder.html -* -**/ - -use <_impl/_px_cylinder_impl.scad>; -use <../util/sort.scad>; -use <../util/dedup.scad>; - -function px_cylinder(r, h, filled = false, thickness = 1) = - let( - _ = echo("pixel/px_cylinder is deprecated: use voxel/vx_cylinder instead."), - all = _px_cylinder_impl(r, h, filled, thickness) - ) - dedup(sort(all, by = "vt"), sorted = true); \ No newline at end of file diff --git a/src/pixel/px_from.scad b/src/pixel/px_from.scad deleted file mode 100644 index 040512ef..00000000 --- a/src/pixel/px_from.scad +++ /dev/null @@ -1,17 +0,0 @@ -/** -* px_from.scad -* -* @copyright Justin Lin, 2019 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-px_from.html -* -**/ - -use <_impl/_px_from_impl.scad>; - -function px_from(binaries, center = false, invert = false) = - let( - _ = echo("pixel/px_from is deprecated: use voxel/vx_from instead.") - ) - _px_from_impl(binaries, center, invert); \ No newline at end of file diff --git a/src/pixel/px_gray.scad b/src/pixel/px_gray.scad deleted file mode 100644 index 15e9ba2b..00000000 --- a/src/pixel/px_gray.scad +++ /dev/null @@ -1,17 +0,0 @@ -/** -* px_gray.scad -* -* @copyright Justin Lin, 2019 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-px_gray.html -* -**/ - -use <_impl/_px_gray_impl.scad>; - -function px_gray(levels, center = false, invert = false, normalize = false) = - let( - _ = echo("pixel/px_gray is deprecated: use voxel/vx_gray instead.") - ) - _px_gray_impl(levels, center, invert, normalize); \ No newline at end of file diff --git a/src/pixel/px_line.scad b/src/pixel/px_line.scad deleted file mode 100644 index 52ae407a..00000000 --- a/src/pixel/px_line.scad +++ /dev/null @@ -1,17 +0,0 @@ -/** -* px_line.scad -* -* @copyright Justin Lin, 2019 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-px_line.html -* -**/ - -use <_impl/_px_line_impl.scad>; - -function px_line(p1, p2) = - let( - _ = echo("pixel/px_line is deprecated: use voxel/vx_line instead.") - ) - _px_line_impl(p1, p2); \ No newline at end of file diff --git a/src/pixel/px_polygon.scad b/src/pixel/px_polygon.scad deleted file mode 100644 index ae176a50..00000000 --- a/src/pixel/px_polygon.scad +++ /dev/null @@ -1,34 +0,0 @@ -use <../in_shape.scad>; -use <../util/sort.scad>; -use <../util/dedup.scad>; -use ; - -function px_polygon(points, filled = false) = - let( - _ = echo("pixel/px_polygon is deprecated: use voxel/vx_polygon instead."), - contour = px_polyline(concat(points, [points[0]])) - ) - !filled ? contour : - let( - sortedXY = sort(contour, by = "vt"), - ys = [for(p = sortedXY) p[1]], - rows = [ - for(y = [min(ys):max(ys)]) - let( - idxes = search(y, sortedXY, num_returns_per_match = 0, index_col_num = 1) - ) - [for(i = idxes) sortedXY[i]] - ], - all = concat( - sortedXY, - [ - for(row = rows) - let(to = len(row) - 1, y = row[0][1]) - if(to > 0 && (row[0][0] + 1 != row[to][0])) - for(i = [row[0][0] + 1:row[to][0] - 1]) - let(p = [i, y]) - if(in_shape(points, p)) p - ] - ) - ) - dedup(sort(all, by = "vt"), sorted = true); \ No newline at end of file diff --git a/src/pixel/px_polyline.scad b/src/pixel/px_polyline.scad deleted file mode 100644 index 9c33be9b..00000000 --- a/src/pixel/px_polyline.scad +++ /dev/null @@ -1,29 +0,0 @@ -/** -* px_polyline.scad -* -* @copyright Justin Lin, 2019 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-px_polyline.html -* -**/ - -use <../__comm__/__to3d.scad>; -use <../__comm__/__to2d.scad>; -use <../__comm__/__lines_from.scad>; -use <../util/sort.scad>; -use <../util/dedup.scad>; -use ; - -function px_polyline(points) = - let( - _ = echo("pixel/px_polyline is deprecated: use voxel/vx_polyline instead."), - is_2d = len(points[0]) == 2, - pts = is_2d ? [for(pt = points) __to3d(pt)] : points, - polyline = [for(line = __lines_from(pts)) each px_line(line[0], line[1])] - ) - dedup(is_2d ? - sort([for(pt = polyline) __to2d(pt)], by = "vt") - : - sort(polyline, by = "vt") - , sorted = true); \ No newline at end of file diff --git a/src/pixel/px_sphere.scad b/src/pixel/px_sphere.scad deleted file mode 100644 index 9475be12..00000000 --- a/src/pixel/px_sphere.scad +++ /dev/null @@ -1,34 +0,0 @@ -/** -* px_sphere.scad -* -* @copyright Justin Lin, 2019 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-px_sphere.html -* -**/ - -function px_sphere(radius, filled = false, thickness = 1) = - let( - _ = echo("pixel/px_sphere is deprecated: use voxel/vx_sphere instead."), - range = [-radius: radius - 1] - ) - filled ? [ - for(z = range) - for(y = range) - for(x = range) - let(v = [x, y, z]) - if(norm(v) < radius) v - ] : - let(ishell = radius * radius - 2 * thickness * radius) - [ - for(z = range) - for(y = range) - for(x = range) - let( - v = [x, y, z], - leng = norm(v) - ) - if(leng < radius && (leng * leng) > ishell) v - ]; - \ No newline at end of file diff --git a/src/polysections.scad b/src/polysections.scad deleted file mode 100644 index 0d677d7b..00000000 --- a/src/polysections.scad +++ /dev/null @@ -1,255 +0,0 @@ -/** -* polysections.scad -* -* @copyright Justin Lin, 2017 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-polysections.html -* -**/ - -use ; - -module polysections(sections, triangles = "SOLID") { - echo("polysections is deprecated: use sweep instead."); - - function side_indexes(sects, begin_idx = 0) = - let( - leng_sects = len(sects), - leng_pts_sect = len(sects[0]), - range_j = [begin_idx:leng_pts_sect:begin_idx + (leng_sects - 2) * leng_pts_sect], - range_i = [0:leng_pts_sect - 1] - ) - concat( - [ - for(j = range_j) - for(i = range_i) - [ - j + i, - j + (i + 1) % leng_pts_sect, - j + (i + 1) % leng_pts_sect + leng_pts_sect - ] - ], - [ - for(j = range_j) - for(i = range_i) - [ - j + i, - j + (i + 1) % leng_pts_sect + leng_pts_sect , - j + i + leng_pts_sect - ] - ] - ); - - function search_at(f_sect, p, leng_pts_sect, i = 0) = - i < leng_pts_sect ? - (p == f_sect[i] ? i : search_at(f_sect, p, leng_pts_sect, i + 1)) : -1; - - function the_same_after_twisting(f_sect, l_sect, leng_pts_sect) = - let( - found_at_i = search_at(f_sect, l_sect[0], leng_pts_sect) - ) - found_at_i <= 0 ? false : - l_sect == concat( - [for(i = found_at_i; i < leng_pts_sect; i = i + 1) f_sect[i]], - [for(i = 0; i < found_at_i; i = i + 1) f_sect[i]] - ); - - function to_v_pts(sects) = - [ - for(sect = sects) - for(pt = sect) - pt - ]; - - module solid_sections(sects) { - - leng_sects = len(sects); - leng_pts_sect = len(sects[0]); - first_sect = sects[0]; - last_sect = sects[leng_sects - 1]; - - v_pts = [ - for(sect = sects) - for(pt = sect) - pt - ]; - - begin_end_the_same = - first_sect == last_sect || - the_same_after_twisting(first_sect, last_sect, leng_pts_sect); - - if(begin_end_the_same) { - f_idxes = side_indexes(sects); - - polyhedron( - v_pts, - f_idxes - ); - - // hook for testing - test_polysections_solid(v_pts, f_idxes, triangles); - } else { - range_i = [0:leng_pts_sect - 1]; - first_idxes = [for(i = range_i) leng_pts_sect - 1 - i]; - last_idxes = [ - for(i = range_i) - i + leng_pts_sect * (leng_sects - 1) - ]; - - f_idxes = concat([first_idxes], side_indexes(sects), [last_idxes]); - - polyhedron( - v_pts, - f_idxes - ); - - // hook for testing - test_polysections_solid(v_pts, f_idxes, triangles); - } - } - - module hollow_sections(sects) { - leng_sects = len(sects); - leng_sect = len(sects[0]); - half_leng_sect = leng_sect / 2; - half_leng_v_pts = leng_sects * half_leng_sect; - - function strip_sects(begin_idx, end_idx) = - [ - for(i = 0; i < leng_sects; i = i + 1) - [ - for(j = begin_idx; j <= end_idx; j = j + 1) - sects[i][j] - ] - ]; - - function first_idxes() = - [ - for(i = 0; i < half_leng_sect; i = i + 1) - [ - i, - i + half_leng_v_pts, - (i + 1) % half_leng_sect + half_leng_v_pts, - (i + 1) % half_leng_sect - ] - ]; - - function last_idxes(begin_idx) = - [ - for(i = 0; i < half_leng_sect; i = i + 1) - [ - begin_idx + i, - begin_idx + (i + 1) % half_leng_sect, - begin_idx + (i + 1) % half_leng_sect + half_leng_v_pts, - begin_idx + i + half_leng_v_pts - ] - ]; - - outer_sects = strip_sects(0, half_leng_sect - 1); - inner_sects = strip_sects(half_leng_sect, leng_sect - 1); - - outer_v_pts = to_v_pts(outer_sects); - inner_v_pts = to_v_pts(inner_sects); - - outer_idxes = side_indexes(outer_sects); - inner_idxes = [ - for(idxes = side_indexes(inner_sects, half_leng_v_pts)) - reverse(idxes) - ]; - - first_outer_sect = outer_sects[0]; - last_outer_sect = outer_sects[leng_sects - 1]; - first_inner_sect = inner_sects[0]; - last_inner_sect = inner_sects[leng_sects - 1]; - - leng_pts_sect = len(first_outer_sect); - - begin_end_the_same = - (first_outer_sect == last_outer_sect && first_inner_sect == last_inner_sect) || - ( - the_same_after_twisting(first_outer_sect, last_outer_sect, leng_pts_sect) && - the_same_after_twisting(first_inner_sect, last_inner_sect, leng_pts_sect) - ); - - v_pts = concat(outer_v_pts, inner_v_pts); - - if(begin_end_the_same) { - f_idxes = concat(outer_idxes, inner_idxes); - - polyhedron( - v_pts, - f_idxes - ); - - // hook for testing - test_polysections_solid(v_pts, f_idxes, triangles); - } else { - first_idxes = first_idxes(); - last_idxes = last_idxes(half_leng_v_pts - half_leng_sect); - - f_idxes = concat(first_idxes, outer_idxes, inner_idxes, last_idxes); - - polyhedron( - v_pts, - f_idxes - ); - - // hook for testing - test_polysections_solid(v_pts, f_idxes, triangles); - } - } - - module triangles_defined_sections() { - module tri_sections(tri1, tri2) { - hull() polyhedron( - points = concat(tri1, tri2), - faces = [ - [0, 1, 2], - [3, 5, 4], - [1, 3, 4], [2, 1, 4], [2, 3, 0], - [0, 3, 1], [2, 4, 5], [2, 5, 3] - ] - ); - } - - module two_sections(section1, section2) { - for(idx = triangles) { - tri_sections( - [ - section1[idx[0]], - section1[idx[1]], - section1[idx[2]] - ], - [ - section2[idx[0]], - section2[idx[1]], - section2[idx[2]] - ] - ); - } - } - - for(i = [0:len(sections) - 2]) { - two_sections( - sections[i], - sections[i + 1] - ); - } - } - - if(triangles == "SOLID") { - solid_sections(sections); - } else if(triangles == "HOLLOW") { - hollow_sections(sections); - } - else { - triangles_defined_sections(); - } -} - -// override it to test - -module test_polysections_solid(points, faces, triangles) { - -} \ No newline at end of file diff --git a/src/polytransversals.scad b/src/polytransversals.scad deleted file mode 100644 index e0cebbd9..00000000 --- a/src/polytransversals.scad +++ /dev/null @@ -1,18 +0,0 @@ -/** -* polytransversals.scad -* -* @copyright Justin Lin, 2017 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-polytransversals.html -* -**/ - -use <__comm__/__polytransversals.scad>; - -module polytransversals(transversals) { - echo("polytransversals is deprecated."); - polygon( - __polytransversals(transversals) - ); -} \ No newline at end of file diff --git a/src/rotate_p.scad b/src/rotate_p.scad deleted file mode 100644 index f1990aed..00000000 --- a/src/rotate_p.scad +++ /dev/null @@ -1,15 +0,0 @@ -/** -* rotate_p.scad -* -* @copyright Justin Lin, 2017 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-rotate_p.html -* -**/ - -use ; - -function rotate_p(point, a, v) = - let(_ = echo("rotate_p is deprecated: use ptf_rotate instead.")) - _rotate_p_impl(point, a, v); \ No newline at end of file diff --git a/src/shape_glued2circles.scad b/src/shape_glued2circles.scad deleted file mode 100644 index d78df425..00000000 --- a/src/shape_glued2circles.scad +++ /dev/null @@ -1,15 +0,0 @@ - -/** -* shape_glued2circles.scad -* -* @copyright Justin Lin, 2017 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-shape_glued2circles.html -* -**/ - -use <_impl/_shape_glued2circles_impl.scad>; - -function shape_glued2circles(radius, centre_dist, tangent_angle = 30, t_step = 0.1) = - _shape_glued2circles_impl(radius, centre_dist, tangent_angle, t_step); \ No newline at end of file diff --git a/src/voronoi2d.scad b/src/voronoi2d.scad deleted file mode 100644 index 7d307d76..00000000 --- a/src/voronoi2d.scad +++ /dev/null @@ -1,57 +0,0 @@ -/** -* voronoi2d.scad -* -* @copyright Justin Lin, 2019 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-voronoi2d.html -* -**/ - -module voronoi2d(points, spacing = 1, r = 0, delta = 0, chamfer = false, region_type = "square") { - echo("voronoi2d is deprecated: use voronoi/vrn2_from instead."); - - xs = [for(p = points) p[0]]; - ys = [for(p = points) abs(p[1])]; - - region_size = max([(max(xs) - min(xs) / 2), (max(ys) - min(ys)) / 2]); - half_region_size = 0.5 * region_size; - offset_leng = spacing * 0.5 + half_region_size; - - function normalize(v) = v / norm(v); - - module region(pt) { - intersection_for(p = points) { - if(pt != p) { - v = p - pt; - translate((pt + p) / 2 - normalize(v) * offset_leng) - rotate(atan2(v[1], v[0])) - children(); - } - } - } - - module offseted_region(pt) { - if(r != 0) { - offset(r) - region(pt) - children(); - } - else { - offset(delta = delta, chamfer = chamfer) - region(pt) - children(); - } - } - - for(p = points) { - if(region_type == "square") { - offseted_region(p) - square(region_size, center = true); - } - else { - offseted_region(p) - circle(half_region_size); - } - } -} \ No newline at end of file diff --git a/src/voronoi3d.scad b/src/voronoi3d.scad deleted file mode 100644 index 0fa069d4..00000000 --- a/src/voronoi3d.scad +++ /dev/null @@ -1,45 +0,0 @@ -/** -* voronoi3d.scad -* -* @copyright Justin Lin, 2019 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-voronoi3d.html -* -**/ - -use <__comm__/__angy_angz.scad>; - -// slow but workable - -module voronoi3d(points, spacing = 1) { - echo("voronoi3d is deprecated: use voronoi/vrn3_from instead."); - - xs = [for(p = points) p[0]]; - ys = [for(p = points) abs(p[1])]; - zs = [for(p = points) abs(p[2])]; - - space_size = max([max(xs) - min(xs), max(ys) - min(ys), max(zs) - min(zs)]); - half_space_size = 0.5 * space_size; - double_space_size = 2 * space_size; - offset_leng = (spacing + space_size) * 0.5; - - function normalize(v) = v / norm(v); - - module space(pt) { - intersection_for(p = points) { - if(pt != p) { - v = p - pt; - ryz = __angy_angz(p, pt); - - translate((pt + p) / 2 - normalize(v) * offset_leng) - rotate([0, -ryz[0], ryz[1]]) - cube([space_size, double_space_size, double_space_size], center = true); - } - } - } - - for(p = points) { - space(p); - } -} \ No newline at end of file diff --git a/test/test_all.scad b/test/test_all.scad index 1acbefcb..90a95c4c 100644 --- a/test/test_all.scad +++ b/test/test_all.scad @@ -44,7 +44,6 @@ include ; include ; include ; include ; -include ; include ; include ; include ; From ea9be0180c8f6d8a8e0b0bd79cd059fd7b4293d9 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sat, 6 Feb 2021 18:02:10 +0800 Subject: [PATCH 13/99] update README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 51454c59..ee6c8527 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# dotSCAD 2.5 +# dotSCAD 3.0 Dev > **Reduce the burden of mathematics/algorithm when playing OpenSCAD.** @@ -8,7 +8,7 @@ ## Introduction -**This library requires OpenSCAD 2019.05 or later.** +**This library requires OpenSCAD 2021.01 or later.** Some of my [3D models](https://github.com/JustinSDK/dotSCAD#examples) require complex mathematics/algorithm. I extract them into dotSCAD. Hope it helps when you're playing OpenSCAD. From 968c668ceed95810f9c2011495a60e2e30b90eab Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 7 Feb 2021 12:13:32 +0800 Subject: [PATCH 14/99] by supports a function literal --- README.md | 2 +- docs/{lib2x-sort.md => lib3x-sort.md} | 11 +++++++---- src/util/_impl/_sort_impl.scad | 12 +++++++++++- src/util/sort.scad | 3 ++- test/util/test_sort.scad | 25 +++++++++++++++---------- 5 files changed, 36 insertions(+), 17 deletions(-) rename docs/{lib2x-sort.md => lib3x-sort.md} (59%) diff --git a/README.md b/README.md index ee6c8527..67362a02 100644 --- a/README.md +++ b/README.md @@ -139,7 +139,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [util/parse_number](https://openhome.cc/eGossip/OpenSCAD/lib2x-parse_number.html) - [util/reverse](https://openhome.cc/eGossip/OpenSCAD/lib2x-reverse.html) - [util/slice](https://openhome.cc/eGossip/OpenSCAD/lib2x-slice.html) -- [util/sort](https://openhome.cc/eGossip/OpenSCAD/lib2x-sort.html) +- [util/sort](https://openhome.cc/eGossip/OpenSCAD/lib3x-sort.html) - [util/rand](https://openhome.cc/eGossip/OpenSCAD/lib2x-rand.html) - [util/fibseq](https://openhome.cc/eGossip/OpenSCAD/lib2x-fibseq.html) - [util/bsearch](https://openhome.cc/eGossip/OpenSCAD/lib2x-bsearch.html) diff --git a/docs/lib2x-sort.md b/docs/lib3x-sort.md similarity index 59% rename from docs/lib2x-sort.md rename to docs/lib3x-sort.md index 7a138178..bd0b27e7 100644 --- a/docs/lib2x-sort.md +++ b/docs/lib3x-sort.md @@ -2,14 +2,12 @@ Sorts the elements of a list in ascending order. The list is a list-of-list construct, such as `[[a0, a1, a2...], [b0, b1, b2,...], [c0, c1, c2,...],...]`. When sorting, the function looks only at one index position of each sublist. -From dotSCAD 2.3, when `by` is `"vt"`, it will sort points by zyx (from the last index to the first one). - **Since:** 2.0 ## Parameters - `lt` : The original list. -- `by` : Can be `"x"`、`"y"`、`"z"`, `"idx"` (Default) or `"vt"`. +- `by` : Can be `"x"`、`"y"`、`"z"`, or `"idx"` (Default). `"vt"`. From dotSCAD 2.3, when `by` is `"vt"`, it will sort points by zyx (from the last index to the first one). From dotSCAD 3.0, `by` supports a function literal that compares its two arguments for order. Returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second. - `idx` : When `by` is `"idx"`, the value of `idx` is used. The Default value is 0. ## Examples @@ -29,4 +27,9 @@ From dotSCAD 2.3, when `by` is `"vt"`, it will sort points by zyx (from the last assert( [[0, 2, 0], [0, 5, 0], [0, 7, 0], [0, 9, 0], [0, 10, 0]] == sort([[0, 10, 0], [0, 5, 0], [0, 7, 0], [0, 2, 0], [0, 9, 0]], by = "idx", idx = 1) - ); \ No newline at end of file + ); + + ascending = function(e1, e2) e1 - e2; + descending = function(e1, e2) e2 - e1; + assert(sort([2, 1, 3, 5, 4], by = ascending) == [1, 2, 3, 4, 5]); + assert(sort([2, 1, 3, 5, 4], by = descending) == [5, 4, 3, 2, 1]); \ No newline at end of file diff --git a/src/util/_impl/_sort_impl.scad b/src/util/_impl/_sort_impl.scad index d3b5f5ad..a6934a08 100644 --- a/src/util/_impl/_sort_impl.scad +++ b/src/util/_impl/_sort_impl.scad @@ -25,4 +25,14 @@ function _sort_by(lt, by, idx) = dict = [["x", 0], ["y", 1], ["z", 2], ["i", idx]], i = dict[search(by == "idx" ? "i" : by, dict)[0]][1] ) - _sort_by_idx(lt, i); \ No newline at end of file + _sort_by_idx(lt, i); + +function _sort_by_comp(lt, comp) = + let(leng = len(lt)) + leng <= 1 ? lt : + let( + pivot = lt[0], + before = [for(j = 1; j < leng; j = j + 1) if(comp(lt[j], pivot) < 0) lt[j]], + after = [for(j = 1; j < leng; j = j + 1) if(comp(lt[j], pivot) >= 0) lt[j]] + ) + concat(_sort_by_comp(before, comp), [pivot], _sort_by_comp(after, comp)); \ No newline at end of file diff --git a/src/util/sort.scad b/src/util/sort.scad index 507e47e2..8cb70c06 100644 --- a/src/util/sort.scad +++ b/src/util/sort.scad @@ -4,12 +4,13 @@ * @copyright Justin Lin, 2019 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-sort.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-sort.html * **/ use <_impl/_sort_impl.scad>; function sort(lt, by = "idx", idx = 0) = + is_function(by) ? _sort_by_comp(lt, by) : // support function literal by == "vt" ? _vt_sort(lt) : // for example, sort by zyx for a list of points _sort_by(lt, by, idx); \ No newline at end of file diff --git a/test/util/test_sort.scad b/test/util/test_sort.scad index e45ab38a..262ec525 100644 --- a/test/util/test_sort.scad +++ b/test/util/test_sort.scad @@ -4,20 +4,25 @@ use ; module test_sort() { echo("==== test_sort ===="); - assertEqualPoints( - [[2, 0, 0], [5, 0, 0], [7, 0, 0], [9, 0, 0], [10, 0, 0]], + assert( + [[2, 0, 0], [5, 0, 0], [7, 0, 0], [9, 0, 0], [10, 0, 0]] == + sort([[10, 0, 0], [5, 0, 0], [7, 0, 0], [2, 0, 0], [9, 0, 0]]) + ); + + assert( + [[2, 0, 0], [5, 0, 0], [7, 0, 0], [9, 0, 0], [10, 0, 0]] == sort([[10, 0, 0], [5, 0, 0], [7, 0, 0], [2, 0, 0], [9, 0, 0]], by = "x") ); - assertEqualPoints( - [[2, 0, 0], [5, 0, 0], [7, 0, 0], [9, 0, 0], [10, 0, 0]], - sort([[10, 0, 0], [5, 0, 0], [7, 0, 0], [2, 0, 0], [9, 0, 0]], by = "idx", idx = 0) - ); - - assertEqualPoints( - [[0, 2, 0], [0, 5, 0], [0, 7, 0], [0, 9, 0], [0, 10, 0]], - sort([[0, 10, 0], [0, 5, 0], [0, 7, 0], [0, 2, 0], [0, 9, 0]], by = "y") + assert( + [[0, 2, 0], [0, 5, 0], [0, 7, 0], [0, 9, 0], [0, 10, 0]] == + sort([[0, 10, 0], [0, 5, 0], [0, 7, 0], [0, 2, 0], [0, 9, 0]], by = "idx", idx = 1) ); + + ascending = function(e1, e2) e1 - e2; + descending = function(e1, e2) e2 - e1; + assert(sort([2, 1, 3, 5, 4], by = ascending) == [1, 2, 3, 4, 5]); + assert(sort([2, 1, 3, 5, 4], by = descending) == [5, 4, 3, 2, 1]); } test_sort(); From 19cfe700b50b7b8511c82a2d0fb3eabaa19195db Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 7 Feb 2021 15:02:15 +0800 Subject: [PATCH 15/99] updated --- src/experimental/note.md | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/experimental/note.md b/src/experimental/note.md index ab2579a3..4c07fe63 100644 --- a/src/experimental/note.md +++ b/src/experimental/note.md @@ -2,14 +2,6 @@ to_do: - deprecate `trianglate`, use `tri_ear_clipping`. -next: +dotSCAD 3.0 Dev -- maze/* -- vx_contour -- vx_bezier -- vx_curve -- polygon_hull -- polyhedron_hull -- curve -- bauer_spiral -- fibonacci_lattice \ No newline at end of file +- `util/sort`: `by` accepts a function literal. From 1d79ce373e52306265a02817efbc78b2bf5e13f1 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 7 Feb 2021 16:23:08 +0800 Subject: [PATCH 16/99] rename param --- src/util/_impl/_sort_impl.scad | 8 ++++---- src/util/sort.scad | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/util/_impl/_sort_impl.scad b/src/util/_impl/_sort_impl.scad index a6934a08..b7ef2396 100644 --- a/src/util/_impl/_sort_impl.scad +++ b/src/util/_impl/_sort_impl.scad @@ -27,12 +27,12 @@ function _sort_by(lt, by, idx) = ) _sort_by_idx(lt, i); -function _sort_by_comp(lt, comp) = +function _sort_by_cmp(lt, cmp) = let(leng = len(lt)) leng <= 1 ? lt : let( pivot = lt[0], - before = [for(j = 1; j < leng; j = j + 1) if(comp(lt[j], pivot) < 0) lt[j]], - after = [for(j = 1; j < leng; j = j + 1) if(comp(lt[j], pivot) >= 0) lt[j]] + before = [for(j = 1; j < leng; j = j + 1) if(cmp(lt[j], pivot) < 0) lt[j]], + after = [for(j = 1; j < leng; j = j + 1) if(cmp(lt[j], pivot) >= 0) lt[j]] ) - concat(_sort_by_comp(before, comp), [pivot], _sort_by_comp(after, comp)); \ No newline at end of file + concat(_sort_by_cmp(before, cmp), [pivot], _sort_by_cmp(after, cmp)); \ No newline at end of file diff --git a/src/util/sort.scad b/src/util/sort.scad index 8cb70c06..948446ee 100644 --- a/src/util/sort.scad +++ b/src/util/sort.scad @@ -11,6 +11,6 @@ use <_impl/_sort_impl.scad>; function sort(lt, by = "idx", idx = 0) = - is_function(by) ? _sort_by_comp(lt, by) : // support function literal + is_function(by) ? _sort_by_cmp(lt, by) : // support function literal by == "vt" ? _vt_sort(lt) : // for example, sort by zyx for a list of points _sort_by(lt, by, idx); \ No newline at end of file From 58c6cbc52a4190c67c839902aa035f1b2bdeb7bf Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 7 Feb 2021 16:28:35 +0800 Subject: [PATCH 17/99] remove unnecessary dep --- test/util/test_sort.scad | 1 - 1 file changed, 1 deletion(-) diff --git a/test/util/test_sort.scad b/test/util/test_sort.scad index 262ec525..afe9b427 100644 --- a/test/util/test_sort.scad +++ b/test/util/test_sort.scad @@ -1,4 +1,3 @@ -use ; use ; module test_sort() { From 6ea672df1448aae7bb1631f6e4f5091e0ad33484 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 7 Feb 2021 17:11:57 +0800 Subject: [PATCH 18/99] add bsearch --- docs/lib2x-bsearch.md | 25 ------------------------- docs/lib3x-bsearch.md | 26 ++++++++++++++++++++++++++ src/util/_impl/_bsearch_impl.scad | 17 +++++------------ src/util/bsearch.scad | 8 ++++---- test/util/test_bsearch.scad | 19 +++++++++++++++++++ 5 files changed, 54 insertions(+), 41 deletions(-) delete mode 100644 docs/lib2x-bsearch.md create mode 100644 docs/lib3x-bsearch.md create mode 100644 test/util/test_bsearch.scad diff --git a/docs/lib2x-bsearch.md b/docs/lib2x-bsearch.md deleted file mode 100644 index 326a8aff..00000000 --- a/docs/lib2x-bsearch.md +++ /dev/null @@ -1,25 +0,0 @@ -# bsearch - -The `bsearch` function is a general-purpose function to find a value or a list of values in a vector. The vector must be sorted by zyx (from the last index to the first one). - -**Since:** 2.3 - -## Parameters - -- `sorted` : The sorted vector. -- `elem` : a list of values. -- `by` : Can be `"x"`、`"y"`、`"z"`, `"idx"` (Default) or `"vt"`. -- `idx` : When `by` is `"idx"`, the value of `idx` is used. The Default value is 0. - -## Examples - - use ; - use ; - - points = [[1, 1], [3, 4], [7, 2], [5, 2]]; - sorted = sort(points, by = "vt"); - - echo(sorted); // [[1, 1], [5, 2], [7, 2], [3, 4]] - assert(bsearch(sorted, [5, 4], by = "x") == 1); - assert(bsearch(sorted, [5, 4], by = "y") == 3); - assert(bsearch(sorted, [7, 2], by = "vt") == 2); \ No newline at end of file diff --git a/docs/lib3x-bsearch.md b/docs/lib3x-bsearch.md new file mode 100644 index 00000000..c85fd7c1 --- /dev/null +++ b/docs/lib3x-bsearch.md @@ -0,0 +1,26 @@ +# bsearch + +The `bsearch` function is a general-purpose function to search a value in a list whose elements must be sorted by zyx (from the last index to the first one). + +**Since:** 3.0 + +## Parameters + +- `sorted` : The sorted list. +- `target` : The target vector or a function literal. + +## Examples + + use ; + use ; + + points = [[1, 1], [3, 4], [7, 2], [5, 2]]; + sorted = sort(points, by = "vt"); // [[1, 1], [5, 2], [7, 2], [3, 4]] + + assert(bsearch(sorted, [7, 2]) == 2); + + xIs5 = function(elem) elem[0] - 5; + assert(bsearch(sorted, xIs5) == 1); + + yIs4 = function(elem) elem[1] - 4; + assert(bsearch(sorted, yIs4) == 3); \ No newline at end of file diff --git a/src/util/_impl/_bsearch_impl.scad b/src/util/_impl/_bsearch_impl.scad index bac7d859..2acf475f 100644 --- a/src/util/_impl/_bsearch_impl.scad +++ b/src/util/_impl/_bsearch_impl.scad @@ -1,20 +1,13 @@ use <_vt_default_comparator.scad>; -function _binary_search_by(sorted, elem, low, upper, i) = - low > upper ? -1 : - let(mid = floor((low + upper) / 2)) - sorted[mid][i] < elem[i] ? _binary_search_by(sorted, elem, mid + 1, upper, i) : - sorted[mid][i] > elem[i] ? _binary_search_by(sorted, elem, low, mid - 1, i) : mid; - function _bsearch_vt(sorted, elem, low, upper) = low > upper ? -1 : let(mid = floor((low + upper) / 2)) lessThan(sorted[mid], elem) ? _bsearch_vt(sorted, elem, mid + 1, upper) : greaterThan(sorted[mid], elem) ? _bsearch_vt(sorted, elem, low, mid - 1) : mid; -function _bsearch_by(sorted, elem, by, idx) = - let( - dict = [["x", 0], ["y", 1], ["z", 2], ["i", idx]], - i = dict[search(by == "idx" ? "i" : by, dict)[0]][1] - ) - _binary_search_by(sorted, elem, 0, len(sorted) - 1, i); \ No newline at end of file +function _bsearch_cmp(sorted, cmp, low, upper) = + low > upper ? -1 : + let(mid = floor((low + upper) / 2)) + cmp(sorted[mid]) < 0 ? _bsearch_cmp(sorted, cmp, mid + 1, upper) : + cmp(sorted[mid]) > 0 ? _bsearch_cmp(sorted, cmp, low, mid - 1) : mid; \ No newline at end of file diff --git a/src/util/bsearch.scad b/src/util/bsearch.scad index a8a514db..0bba8f16 100644 --- a/src/util/bsearch.scad +++ b/src/util/bsearch.scad @@ -4,12 +4,12 @@ * @copyright Justin Lin, 2020 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-bsearch.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-bsearch.html * **/ use <_impl/_bsearch_impl.scad>; -function bsearch(sorted, elem, by = "idx", idx = 0) = - by == "vt" ? _bsearch_vt(sorted, elem, 0, len(sorted) - 1) : // for example, `sorted` is by zyx - _bsearch_by(sorted, elem, by, idx); \ No newline at end of file +function bsearch(sorted, target) = + is_function(target) ? _bsearch_cmp(sorted, target, 0, len(sorted) - 1) : + _bsearch_vt(sorted, target, 0, len(sorted) - 1); // `sorted` is by zyx \ No newline at end of file diff --git a/test/util/test_bsearch.scad b/test/util/test_bsearch.scad new file mode 100644 index 00000000..5cb7cd67 --- /dev/null +++ b/test/util/test_bsearch.scad @@ -0,0 +1,19 @@ +use ; +use ; + +module test_bsearch() { + echo("==== test_bsearch ===="); + + points = [[1, 1], [3, 4], [7, 2], [5, 2]]; + sorted = sort(points, by = "vt"); // [[1, 1], [5, 2], [7, 2], [3, 4]] + + assert(bsearch(sorted, [7, 2]) == 2); + + xIs5 = function(elem) elem[0] - 5; + assert(bsearch(sorted, xIs5) == 1); + + yIs4 = function(elem) elem[1] - 4; + assert(bsearch(sorted, yIs4) == 3); +} + +test_bsearch(); \ No newline at end of file From 1b764c758b95e908bbc36ddf4876a6a41a1ce8fd Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 7 Feb 2021 17:12:28 +0800 Subject: [PATCH 19/99] update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 67362a02..548b8bc4 100644 --- a/README.md +++ b/README.md @@ -142,7 +142,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [util/sort](https://openhome.cc/eGossip/OpenSCAD/lib3x-sort.html) - [util/rand](https://openhome.cc/eGossip/OpenSCAD/lib2x-rand.html) - [util/fibseq](https://openhome.cc/eGossip/OpenSCAD/lib2x-fibseq.html) -- [util/bsearch](https://openhome.cc/eGossip/OpenSCAD/lib2x-bsearch.html) +- [util/bsearch](https://openhome.cc/eGossip/OpenSCAD/lib3x-bsearch.html) - [util/has](https://openhome.cc/eGossip/OpenSCAD/lib2x-has.html) - [util/dedup](https://openhome.cc/eGossip/OpenSCAD/lib2x-dedup.html) - [util/flat](https://openhome.cc/eGossip/OpenSCAD/lib2x-flat.html) From 7040d981ad3389a3b8039c061dee46a547dca6e5 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 7 Feb 2021 17:16:35 +0800 Subject: [PATCH 20/99] refactor --- src/util/has.scad | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/has.scad b/src/util/has.scad index dff5d007..00781e23 100644 --- a/src/util/has.scad +++ b/src/util/has.scad @@ -11,5 +11,5 @@ use ; function has(lt, elem, sorted = false) = - sorted ? bsearch(lt, elem, by = "vt") != -1 : + sorted ? bsearch(lt, elem) != -1 : search([elem], lt) != [[]]; \ No newline at end of file From 3edfff3cfd0a9a04115e5ea3ecc0da5dbfaf87cd Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 7 Feb 2021 17:55:40 +0800 Subject: [PATCH 21/99] update doc --- docs/lib3x-bsearch.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/lib3x-bsearch.md b/docs/lib3x-bsearch.md index c85fd7c1..51c68648 100644 --- a/docs/lib3x-bsearch.md +++ b/docs/lib3x-bsearch.md @@ -7,7 +7,7 @@ The `bsearch` function is a general-purpose function to search a value in a list ## Parameters - `sorted` : The sorted list. -- `target` : The target vector or a function literal. +- `target` : The target vector or a function literal that returns a negative integer, zero, or a positive integer as the element is less than, equal to, or greater than the value you want to search. ## Examples From bd38d454d7b1dda5160929e60f8d048740432edf Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 7 Feb 2021 18:13:21 +0800 Subject: [PATCH 22/99] update --- src/experimental/note.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/experimental/note.md b/src/experimental/note.md index 4c07fe63..cb749749 100644 --- a/src/experimental/note.md +++ b/src/experimental/note.md @@ -5,3 +5,4 @@ to_do: dotSCAD 3.0 Dev - `util/sort`: `by` accepts a function literal. +- `util/bsearch`: only supports `sorted` and `target` parameters. I view it as a new function. \ No newline at end of file From 1ea12daa016a052b2926c8209d9fa589a1506801 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Mon, 8 Feb 2021 09:52:06 +0800 Subject: [PATCH 23/99] add test --- test/test_all.scad | 1 + 1 file changed, 1 insertion(+) diff --git a/test/test_all.scad b/test/test_all.scad index 90a95c4c..6ac9304c 100644 --- a/test/test_all.scad +++ b/test/test_all.scad @@ -67,6 +67,7 @@ include ; include ; include ; include ; +include ; // Voxel include ; From 867cc3e75c7c8450636e087047d287f2eb7e89de Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Mon, 8 Feb 2021 09:57:35 +0800 Subject: [PATCH 24/99] update choose --- README.md | 2 +- docs/{lib2x-choose.md => lib3x-choose.md} | 0 src/util/choose.scad | 2 +- test/test_all.scad | 1 + test/util/test_choose.scad | 11 +++++++++++ 5 files changed, 14 insertions(+), 2 deletions(-) rename docs/{lib2x-choose.md => lib3x-choose.md} (100%) create mode 100644 test/util/test_choose.scad diff --git a/README.md b/README.md index 548b8bc4..ef1903e5 100644 --- a/README.md +++ b/README.md @@ -149,7 +149,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [util/sum](https://openhome.cc/eGossip/OpenSCAD/lib2x-sum.html) - [util/zip](https://openhome.cc/eGossip/OpenSCAD/lib2x-zip.html) - [util/lerp](https://openhome.cc/eGossip/OpenSCAD/lib2x-lerp.html) -- [util/choose](https://openhome.cc/eGossip/OpenSCAD/lib2x-choose.html) +- [util/choose](https://openhome.cc/eGossip/OpenSCAD/lib3x-choose.html) ### Matrix - [matrix/m_cumulate](https://openhome.cc/eGossip/OpenSCAD/lib2x-m_cumulate.html) diff --git a/docs/lib2x-choose.md b/docs/lib3x-choose.md similarity index 100% rename from docs/lib2x-choose.md rename to docs/lib3x-choose.md diff --git a/src/util/choose.scad b/src/util/choose.scad index f85bbe08..939d2cc4 100644 --- a/src/util/choose.scad +++ b/src/util/choose.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2021 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-choose.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-choose.html * **/ diff --git a/test/test_all.scad b/test/test_all.scad index 6ac9304c..6ae6677f 100644 --- a/test/test_all.scad +++ b/test/test_all.scad @@ -68,6 +68,7 @@ include ; include ; include ; include ; +include ; // Voxel include ; diff --git a/test/util/test_choose.scad b/test/util/test_choose.scad new file mode 100644 index 00000000..081a809d --- /dev/null +++ b/test/util/test_choose.scad @@ -0,0 +1,11 @@ +use ; + +module test_choose() { + echo("==== test_choose ===="); + + lt = [[1, true], [2, true], [3, true], [4, true], [5, true]]; + c = choose(lt); + assert(c[1]); +} + +test_choose(); \ No newline at end of file From 0821a6d4ae4c467c549f684f117145966f0435a5 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Mon, 8 Feb 2021 10:02:28 +0800 Subject: [PATCH 25/99] add test --- test/test_all.scad | 1 + test/util/test_dedup.scad | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 test/util/test_dedup.scad diff --git a/test/test_all.scad b/test/test_all.scad index 6ae6677f..ad41d935 100644 --- a/test/test_all.scad +++ b/test/test_all.scad @@ -69,6 +69,7 @@ include ; include ; include ; include ; +include ; // Voxel include ; diff --git a/test/util/test_dedup.scad b/test/util/test_dedup.scad new file mode 100644 index 00000000..8ebd9160 --- /dev/null +++ b/test/util/test_dedup.scad @@ -0,0 +1,19 @@ +use ; +use ; + +module test_dedup() { + echo("==== test_dedup ===="); + + points = [[1, 1, 2], [3, 4, 2], [7, 2, 2], [3, 4, 2], [1, 2, 3]]; + assert( + dedup([[1, 1, 2], [3, 4, 2], [7, 2, 2], [3, 4, 2], [1, 2, 3]]) + == [[1, 1, 2], [3, 4, 2], [7, 2, 2], [1, 2, 3]] + ); + + assert( + dedup(sort([[1, 1, 2], [3, 4, 2], [7, 2, 2], [3, 4, 2], [1, 2, 3]]), sorted = true) + == [[1, 1, 2], [1, 2, 3], [3, 4, 2], [7, 2, 2]] + ); +} + +test_dedup(); \ No newline at end of file From 43becee0d8900860e9d29ec189072d7f4892ee44 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Mon, 8 Feb 2021 10:53:18 +0800 Subject: [PATCH 26/99] add the `eq` parameter --- README.md | 2 +- docs/images/lib2x-dedup-1.JPG | Bin 27679 -> 0 bytes docs/images/lib2x-dedup-2.JPG | Bin 33161 -> 0 bytes docs/lib2x-dedup.md | 45 -------------------------------- docs/lib3x-dedup.md | 36 +++++++++++++++++++++++++ src/experimental/note.md | 3 ++- src/util/_impl/_dedup_impl.scad | 38 ++++++++++++++++++++------- src/util/dedup.scad | 7 +++-- test/util/test_dedup.scad | 18 ++++++++++--- 9 files changed, 85 insertions(+), 64 deletions(-) delete mode 100644 docs/images/lib2x-dedup-1.JPG delete mode 100644 docs/images/lib2x-dedup-2.JPG delete mode 100644 docs/lib2x-dedup.md create mode 100644 docs/lib3x-dedup.md diff --git a/README.md b/README.md index ef1903e5..592ba043 100644 --- a/README.md +++ b/README.md @@ -144,7 +144,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [util/fibseq](https://openhome.cc/eGossip/OpenSCAD/lib2x-fibseq.html) - [util/bsearch](https://openhome.cc/eGossip/OpenSCAD/lib3x-bsearch.html) - [util/has](https://openhome.cc/eGossip/OpenSCAD/lib2x-has.html) -- [util/dedup](https://openhome.cc/eGossip/OpenSCAD/lib2x-dedup.html) +- [util/dedup](https://openhome.cc/eGossip/OpenSCAD/lib3x-dedup.html) - [util/flat](https://openhome.cc/eGossip/OpenSCAD/lib2x-flat.html) - [util/sum](https://openhome.cc/eGossip/OpenSCAD/lib2x-sum.html) - [util/zip](https://openhome.cc/eGossip/OpenSCAD/lib2x-zip.html) diff --git a/docs/images/lib2x-dedup-1.JPG b/docs/images/lib2x-dedup-1.JPG deleted file mode 100644 index 9664cf4807727662afcaf21bdc78b2147be21f09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27679 zcmeIa1y~$e)-YVS1_2H zXJ>cc)$jfGf4*tBUAL;M@2zw0Irn(qf4yG-uw*4=Bmo#07{CMi2iz}WEl7A+TL6H( zJiq_|05Sj%BM87kdq~g|*Y2_EnNoejEV|0Kn?oBK_%ebm+MVv;m}B&^P2C zz29HIW8ilT{EmU&G4MMEe#gN7ix`k~1-V$;Lm@|qg!@U8z=diI>5=fi^sAzye(J+< za05Ve^q=~F(khTY{J`ArTE+j1^z%E+zhmHc4E&CP-!bqz2L6Nr4mJ)p0X9wnc794W zet{qVe86A31^}{vD*ysq0Bhif5^}$YMr7sU;wZq%Y7b&DHghmBXEAlKWA!k0WMyYz zV+DjnJsgcqZOmOLP0TH=?S*Og8(U~8t<8jKHM!;4J$t*oWJoXu6e6x2+;Y)tvh zXhlUHpbB{ic-T4GnY$QMdf3_8g9JQ;AOAGE0JQ((GV5azA!joS0hQ;Hf4BpBCj9sh z&*JXx&f?C=;^1t_%FfTv&&tNZ%E7@5y@MI#Y42j}!E6tr`ojRv%|WKl){ZXL4)&Bk z1~fKtaCH%W?CNT5CSYM~!EIt@#?5SE%xT8V&TeMRY;4BK&TPiXX~xUV&c|WFZu0mK z)0>(8GP|Rzv+YlFo0+nj+nU>%+q;0E*kEUU%=+^~|EK1JqUe`N|0?>SFhcJU5O+2= zb}@erZ6ZGwm6?r`nVnzlj|1KSS4_)Le6WsBY^HRbuaF0C4~b z0Ra&K9tjZv5g7>y8TBC=RL4NY!^A>=NQg&FM2JU7KtfLYh=h!WjDYYl%VQckdPXKj zVoFv{Rt64Q21bS-gTNpmBcr0A;-aD9GLRCIGW^r8`&Qr~GR!(`3mnX20QMma+(VfA z4uAq0ctn7PDt|;P|L}r=g@Z>xL_$VEMT6c@jRnBMz`?=7!yzERL*tY%zR=GB_=gDC zkJ!Z!ag>db9y{T3yo$;|rg~Q1hNm)eK+S359EgI7Pe4dSO!I`6j-G*wn}?T=UqJl1 zgrtb^-GY8tDC!rr`PK@L2rZKg@i`Oe1OEp#U~_YW@YE( z=H(X@R#aA1*VNY4H+*jI=FpaG8=sh*`uc5pacOyFb!~lPbL;Tv_~i8L{NnQJ z2V5`!+|OYB0@-iidI*IJ79JiB9_a^MFtF~>2KNvi;SoC`wwN-Ku@lZ?j#tRI&!RHQ z+fb-DRSxh>oJUacsks(u4u6356J-AwV1fSML-_WCzeU4rH`8a2njSQ>mA5O{7-HNMH;>&l^fpAEOfo_IoE%))K84Ir z3@qkOJHn_z5MjC|X^OHlQ@#?B6OH73sZuPTo9p&;JlEt^8N_{pYmw+4AM|YCDdG$C z@=cu+Wog*@76ktstu3A2>*-Hnk7ovpK7XxXBq)k?X`<~+anCI(Tr#={8 zAEP;{CV10kG$S@Ro-GBe*sW=b#a>D}J96sixTV=-Z@MMgrxCo|C2;>MnkKuTNn zsmljt2})GD%zz(_zXiuXZ~GJJNbo+k?wG$T=8HDlM##B;rSoJku(F<^e>$qko9Ev# zwuD&XHQSxlPM!eR6VXJeEIG4JXcK>d^+cp?1)}F@cwi)ORe;P;y8p5ky0(TUsBLe* z21fHx>Sd~^Qwx9EYe5?T5K(`DuTs;PVl&X`1X*)|W(ESKb3)pwLnX!ONwLIw9_OUP z{v+i62SNbd@zmdPGm{3{b;5(!ZhzXc-lv z#V_=;n6!vf#hC3GQCMBT@NbHY&+3wffelobaDm`eSK+&r>*|P;;vb}g=`x=d5Wfm2 zgyw;;0R>h@xW8JyKQ7~c!;$|w4bH=UX-l`Rs&0ps*7?}L8hoaSgY7)C`X=imZ8QpH zBnlBQ?tk#!aN56zqSLFh%IWw)$w=rCrPtzjHO_{ZUUDlwYDT&)0a^OFSA&AA05sCQXd~)ub9B=WA�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 Qa8=<9{tr_+(*3vp53>@rr~m)} diff --git a/docs/images/lib2x-dedup-2.JPG b/docs/images/lib2x-dedup-2.JPG deleted file mode 100644 index c33b9c64f11834a152d188a3b29531fd8b038216..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33161 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 - use ; - - pts1 = vx_circle(10, filled = true); - pts2 = [for(p = vx_circle(5, filled = true)) p + [10, 0]]; - - // simple union - pts3 = dedup(concat(pts1, pts2)); - for(p = pts3) { - translate(p) - square(1, center = true); - } - -![dedup](images/lib2x-dedup-1.JPG) - - use ; - use ; - use ; - - pts1 = vx_circle(20, filled = true); - pts2 = [for(p = vx_circle(10, filled = true)) p + [20, 0]]; - - sorted_pts = sort(concat(pts1, pts2), by = "vt"); - - // simple union - pts3 = dedup(sorted_pts, sorted = true); - for(p = pts3) { - translate(p) - square(1, center = true); - } - -![dedup](images/lib2x-dedup-2.JPG) \ No newline at end of file diff --git a/docs/lib3x-dedup.md b/docs/lib3x-dedup.md new file mode 100644 index 00000000..44481888 --- /dev/null +++ b/docs/lib3x-dedup.md @@ -0,0 +1,36 @@ +# dedup + +Eliminating duplicate copies of repeating vectors. If `lt` has a large number of elements, sorting `lt` first and setting `sorted` to `true` will be faster. + +**Since:** 2.3 + +## Parameters + +- `lt` : A list of vectors. +- `sorted` : If `false` (default), use native `search`. If `true`, `lt` must be sorted by zyx (from the last index to the first one) and `dedup` will use binary search internally. +- `eq` : A equality function. If it's ignored, use `==` to compare elements. **Since: ** 3.0 + +## Examples + + eq = function(e1, e2) e1[0] == e2[0] && e1[1] == e2[1] && e1[2] == e2[2]; + + points = [[1, 1, 2], [3, 4, 2], [7, 2, 2], [3, 4, 2], [1, 2, 3]]; + assert( + dedup([[1, 1, 2], [3, 4, 2], [7, 2, 2], [3, 4, 2], [1, 2, 3]]) + == [[1, 1, 2], [3, 4, 2], [7, 2, 2], [1, 2, 3]] + ); + + assert( + dedup([[1, 1, 2], [3, 4, 2], [7, 2, 2], [3, 4, 2], [1, 2, 3]], eq = eq) + == [[1, 1, 2], [3, 4, 2], [7, 2, 2], [1, 2, 3]] + ); + + sorted = sort([[1, 1, 2], [3, 4, 2], [7, 2, 2], [3, 4, 2], [1, 2, 3]]); + + assert( + dedup(sorted, sorted = true) == [[1, 1, 2], [1, 2, 3], [3, 4, 2], [7, 2, 2]] + ); + + assert( + dedup(sorted, sorted = true, eq = eq) == [[1, 1, 2], [1, 2, 3], [3, 4, 2], [7, 2, 2]] + ); \ No newline at end of file diff --git a/src/experimental/note.md b/src/experimental/note.md index cb749749..dc13b94b 100644 --- a/src/experimental/note.md +++ b/src/experimental/note.md @@ -5,4 +5,5 @@ to_do: dotSCAD 3.0 Dev - `util/sort`: `by` accepts a function literal. -- `util/bsearch`: only supports `sorted` and `target` parameters. I view it as a new function. \ No newline at end of file +- `util/bsearch`: only supports `sorted` and `target` parameters. I view it as a new function. +- `util/dedup`: add the `eq` parameter. \ No newline at end of file diff --git a/src/util/_impl/_dedup_impl.scad b/src/util/_impl/_dedup_impl.scad index 65f9f0d9..425ba329 100644 --- a/src/util/_impl/_dedup_impl.scad +++ b/src/util/_impl/_dedup_impl.scad @@ -1,13 +1,31 @@ -use <../has.scad>; - -function _dedup_sorted(lt, leng) = +function _dedup_sorted(lt, leng, eq) = leng == 0 ? lt : - concat( - [lt[0]], - [for(i = [1:leng - 1]) if(lt[i] != lt[i - 1]) lt[i]] - ); + is_function(eq) ? + concat( + [lt[0]], + [for(i = [1:leng - 1]) if(!eq(lt[i], lt[i - 1])) lt[i]] + ) : + concat( + [lt[0]], + [for(i = [1:leng - 1]) if(lt[i] != lt[i - 1]) lt[i]] + ); -function _dedup(src, dest, leng, i = 0) = +function _some(dest, assert_func, leng, i = 0) = + i == leng ? false : + assert_func(dest[i]) ? true : _some(dest, assert_func, leng, i + 1); + +function some(dest, assert_func) = _some(dest, assert_func, len(dest)); + +function _dedup_vt(src, dest, leng, i = 0) = i == leng ? dest : - has(dest, src[i]) ? _dedup(src, dest, leng, i + 1) : - _dedup(src, concat(dest, [src[i]]), leng, i + 1); \ No newline at end of file + // src[i] in dest ? + search([src[i]], dest) != [[]] ? _dedup_vt(src, dest, leng, i + 1) : + _dedup_vt(src, concat(dest, [src[i]]), leng, i + 1); + +function _dedup_eq(src, dest, eq, leng, i = 0) = + i == leng ? dest : + some(dest, function(el) eq(el, src[i])) ? _dedup_eq(src, dest, eq, leng, i + 1) : + _dedup_eq(src, concat(dest, [src[i]]), eq, leng, i + 1); + +function _dedup(src, dest, leng, eq) = + is_function(eq) ? _dedup_eq(src, dest, eq, leng) : _dedup_vt(src, dest, leng); \ No newline at end of file diff --git a/src/util/dedup.scad b/src/util/dedup.scad index f6f4d800..bfb9a50e 100644 --- a/src/util/dedup.scad +++ b/src/util/dedup.scad @@ -4,12 +4,11 @@ * @copyright Justin Lin, 2020 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-dedup.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-dedup.html * **/ use <_impl/_dedup_impl.scad>; -function dedup(lt, sorted = false) = - sorted ? _dedup_sorted(lt, len(lt)) : - _dedup(lt, [], len(lt)); \ No newline at end of file +function dedup(lt, sorted = false, eq) = + sorted ? _dedup_sorted(lt, len(lt), eq) : _dedup(lt, [], len(lt), eq); \ No newline at end of file diff --git a/test/util/test_dedup.scad b/test/util/test_dedup.scad index 8ebd9160..798c6811 100644 --- a/test/util/test_dedup.scad +++ b/test/util/test_dedup.scad @@ -4,15 +4,27 @@ use ; module test_dedup() { echo("==== test_dedup ===="); + eq = function(e1, e2) e1[0] == e2[0] && e1[1] == e2[1] && e1[2] == e2[2]; + points = [[1, 1, 2], [3, 4, 2], [7, 2, 2], [3, 4, 2], [1, 2, 3]]; assert( dedup([[1, 1, 2], [3, 4, 2], [7, 2, 2], [3, 4, 2], [1, 2, 3]]) == [[1, 1, 2], [3, 4, 2], [7, 2, 2], [1, 2, 3]] ); - + assert( - dedup(sort([[1, 1, 2], [3, 4, 2], [7, 2, 2], [3, 4, 2], [1, 2, 3]]), sorted = true) - == [[1, 1, 2], [1, 2, 3], [3, 4, 2], [7, 2, 2]] + dedup([[1, 1, 2], [3, 4, 2], [7, 2, 2], [3, 4, 2], [1, 2, 3]], eq = eq) + == [[1, 1, 2], [3, 4, 2], [7, 2, 2], [1, 2, 3]] + ); + + sorted = sort([[1, 1, 2], [3, 4, 2], [7, 2, 2], [3, 4, 2], [1, 2, 3]]); + + assert( + dedup(sorted, sorted = true) == [[1, 1, 2], [1, 2, 3], [3, 4, 2], [7, 2, 2]] + ); + + assert( + dedup(sorted, sorted = true, eq = eq) == [[1, 1, 2], [1, 2, 3], [3, 4, 2], [7, 2, 2]] ); } From 9e9f86f11d511206feda585cc02e9abe58f3c4cb Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Mon, 8 Feb 2021 11:00:37 +0800 Subject: [PATCH 27/99] dict order --- README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 592ba043..1d5984e1 100644 --- a/README.md +++ b/README.md @@ -134,22 +134,22 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [sphere_spiral_extrude](https://openhome.cc/eGossip/OpenSCAD/lib2x-sphere_spiral_extrude.html) ### Util -- [util/sub_str](https://openhome.cc/eGossip/OpenSCAD/lib2x-sub_str.html) -- [util/split_str](https://openhome.cc/eGossip/OpenSCAD/lib2x-split_str.html) +- [util/bsearch](https://openhome.cc/eGossip/OpenSCAD/lib3x-bsearch.html) +- [util/choose](https://openhome.cc/eGossip/OpenSCAD/lib3x-choose.html) +- [util/dedup](https://openhome.cc/eGossip/OpenSCAD/lib3x-dedup.html) +- [util/fibseq](https://openhome.cc/eGossip/OpenSCAD/lib2x-fibseq.html) +- [util/flat](https://openhome.cc/eGossip/OpenSCAD/lib2x-flat.html) +- [util/has](https://openhome.cc/eGossip/OpenSCAD/lib2x-has.html) +- [util/lerp](https://openhome.cc/eGossip/OpenSCAD/lib2x-lerp.html) - [util/parse_number](https://openhome.cc/eGossip/OpenSCAD/lib2x-parse_number.html) +- [util/rand](https://openhome.cc/eGossip/OpenSCAD/lib2x-rand.html) - [util/reverse](https://openhome.cc/eGossip/OpenSCAD/lib2x-reverse.html) - [util/slice](https://openhome.cc/eGossip/OpenSCAD/lib2x-slice.html) - [util/sort](https://openhome.cc/eGossip/OpenSCAD/lib3x-sort.html) -- [util/rand](https://openhome.cc/eGossip/OpenSCAD/lib2x-rand.html) -- [util/fibseq](https://openhome.cc/eGossip/OpenSCAD/lib2x-fibseq.html) -- [util/bsearch](https://openhome.cc/eGossip/OpenSCAD/lib3x-bsearch.html) -- [util/has](https://openhome.cc/eGossip/OpenSCAD/lib2x-has.html) -- [util/dedup](https://openhome.cc/eGossip/OpenSCAD/lib3x-dedup.html) -- [util/flat](https://openhome.cc/eGossip/OpenSCAD/lib2x-flat.html) +- [util/sub_str](https://openhome.cc/eGossip/OpenSCAD/lib2x-sub_str.html) +- [util/split_str](https://openhome.cc/eGossip/OpenSCAD/lib2x-split_str.html) - [util/sum](https://openhome.cc/eGossip/OpenSCAD/lib2x-sum.html) - [util/zip](https://openhome.cc/eGossip/OpenSCAD/lib2x-zip.html) -- [util/lerp](https://openhome.cc/eGossip/OpenSCAD/lib2x-lerp.html) -- [util/choose](https://openhome.cc/eGossip/OpenSCAD/lib3x-choose.html) ### Matrix - [matrix/m_cumulate](https://openhome.cc/eGossip/OpenSCAD/lib2x-m_cumulate.html) From 36718451b9aa753f2cbfa6a2016dd6d220ca0d39 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Mon, 8 Feb 2021 11:17:06 +0800 Subject: [PATCH 28/99] re-order --- README.md | 142 +++++++++++++++++++++++++++--------------------------- 1 file changed, 71 insertions(+), 71 deletions(-) diff --git a/README.md b/README.md index 1d5984e1..b3b2a38e 100644 --- a/README.md +++ b/README.md @@ -45,92 +45,92 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp ### 2D Module - [arc](https://openhome.cc/eGossip/OpenSCAD/lib2x-arc.html) -- [pie](https://openhome.cc/eGossip/OpenSCAD/lib2x-pie.html) -- [rounded_square](https://openhome.cc/eGossip/OpenSCAD/lib2x-rounded_square.html) -- [line2d](https://openhome.cc/eGossip/OpenSCAD/lib2x-line2d.html) -- [polyline2d](https://openhome.cc/eGossip/OpenSCAD/lib2x-polyline2d.html) -- [hull_polyline2d](https://openhome.cc/eGossip/OpenSCAD/lib2x-hull_polyline2d.html) - [hexagons](https://openhome.cc/eGossip/OpenSCAD/lib2x-hexagons.html) +- [hull_polyline2d](https://openhome.cc/eGossip/OpenSCAD/lib2x-hull_polyline2d.html) +- [line2d](https://openhome.cc/eGossip/OpenSCAD/lib2x-line2d.html) - [multi_line_text](https://openhome.cc/eGossip/OpenSCAD/lib2x-multi_line_text.html) +- [pie](https://openhome.cc/eGossip/OpenSCAD/lib2x-pie.html) +- [polyline2d](https://openhome.cc/eGossip/OpenSCAD/lib2x-polyline2d.html) - [polygon_hull](https://openhome.cc/eGossip/OpenSCAD/lib2x-polygon_hull.html) +- [rounded_square](https://openhome.cc/eGossip/OpenSCAD/lib2x-rounded_square.html) ### 3D Module +- [crystal_ball](https://openhome.cc/eGossip/OpenSCAD/lib2x-crystal_ball.html) +- [function_grapher](https://openhome.cc/eGossip/OpenSCAD/lib2x-function_grapher.html) +- [hull_polyline3d](https://openhome.cc/eGossip/OpenSCAD/lib2x-hull_polyline3d.html) +- [line3d](https://openhome.cc/eGossip/OpenSCAD/lib2x-line3d.html) +- [loft](https://openhome.cc/eGossip/OpenSCAD/lib2x-loft.html) +- [polyhedron_hull](https://openhome.cc/eGossip/OpenSCAD/lib2x-polyhedron_hull.html) +- [polyline3d](https://openhome.cc/eGossip/OpenSCAD/lib2x-polyline3d.html) - [rounded_cube](https://openhome.cc/eGossip/OpenSCAD/lib2x-rounded_cube.html) - [rounded_cylinder](https://openhome.cc/eGossip/OpenSCAD/lib2x-rounded_cylinder.html) -- [crystal_ball](https://openhome.cc/eGossip/OpenSCAD/lib2x-crystal_ball.html) -- [line3d](https://openhome.cc/eGossip/OpenSCAD/lib2x-line3d.html) -- [polyline3d](https://openhome.cc/eGossip/OpenSCAD/lib2x-polyline3d.html) -- [hull_polyline3d](https://openhome.cc/eGossip/OpenSCAD/lib2x-hull_polyline3d.html) -- [function_grapher](https://openhome.cc/eGossip/OpenSCAD/lib2x-function_grapher.html) -- [sweep](https://openhome.cc/eGossip/OpenSCAD/lib2x-sweep.html) -- [loft](https://openhome.cc/eGossip/OpenSCAD/lib2x-loft.html) - [starburst](https://openhome.cc/eGossip/OpenSCAD/lib2x-starburst.html) -- [polyhedron_hull](https://openhome.cc/eGossip/OpenSCAD/lib2x-polyhedron_hull.html) +- [sweep](https://openhome.cc/eGossip/OpenSCAD/lib2x-sweep.html) ### Transformation - [along_with](https://openhome.cc/eGossip/OpenSCAD/lib2x-along_with.html) -- [hollow_out](https://openhome.cc/eGossip/OpenSCAD/lib2x-hollow_out.html) - [bend](https://openhome.cc/eGossip/OpenSCAD/lib2x-bend.html) +- [hollow_out](https://openhome.cc/eGossip/OpenSCAD/lib2x-hollow_out.html) - [shear](https://openhome.cc/eGossip/OpenSCAD/lib2x-shear.html) ### 2D Function +- [bijection_offset](https://openhome.cc/eGossip/OpenSCAD/lib2x-bijection_offset.html) +- [contours](https://openhome.cc/eGossip/OpenSCAD/lib2x-contours.html) - [in_shape](https://openhome.cc/eGossip/OpenSCAD/lib2x-in_shape.html) -- [bijection_offset](https://openhome.cc/eGossip/OpenSCAD/lib2x-bijection_offset.html) +- [lines_intersection](https://openhome.cc/eGossip/OpenSCAD/lib2x-lines_intersection.html) - [trim_shape](https://openhome.cc/eGossip/OpenSCAD/lib2x-trim_shape.html) - [triangulate](https://openhome.cc/eGossip/OpenSCAD/lib2x-triangulate.html) -- [contours](https://openhome.cc/eGossip/OpenSCAD/lib2x-contours.html) -- [lines_intersection](https://openhome.cc/eGossip/OpenSCAD/lib2x-lines_intersection.html) ### 2D/3D Function -- [cross_sections](https://openhome.cc/eGossip/OpenSCAD/lib2x-cross_sections.html) -- [paths2sections](https://openhome.cc/eGossip/OpenSCAD/lib2x-paths2sections.html) -- [path_scaling_sections](https://openhome.cc/eGossip/OpenSCAD/lib2x-path_scaling_sections.html) - [bezier_surface](https://openhome.cc/eGossip/OpenSCAD/lib2x-bezier_surface.html) - [bezier_smooth](https://openhome.cc/eGossip/OpenSCAD/lib2x-bezier_smooth.html) -- [midpt_smooth](https://openhome.cc/eGossip/OpenSCAD/lib2x-midpt_smooth.html) +- [cross_sections](https://openhome.cc/eGossip/OpenSCAD/lib2x-cross_sections.html) - [in_polyline](https://openhome.cc/eGossip/OpenSCAD/lib2x-in_polyline.html) +- [paths2sections](https://openhome.cc/eGossip/OpenSCAD/lib2x-paths2sections.html) +- [path_scaling_sections](https://openhome.cc/eGossip/OpenSCAD/lib2x-path_scaling_sections.html) +- [midpt_smooth](https://openhome.cc/eGossip/OpenSCAD/lib2x-midpt_smooth.html) ### Path - [arc_path](https://openhome.cc/eGossip/OpenSCAD/lib2x-arc_path.html) -- [bspline_curve](https://openhome.cc/eGossip/OpenSCAD/lib2x-bspline_curve.html) -- [bezier_curve](https://openhome.cc/eGossip/OpenSCAD/lib2x-bezier_curve.html) -- [helix](https://openhome.cc/eGossip/OpenSCAD/lib2x-helix.html) -- [golden_spiral](https://openhome.cc/eGossip/OpenSCAD/lib2x-golden_spiral.html) - [archimedean_spiral](https://openhome.cc/eGossip/OpenSCAD/lib2x-archimedean_spiral.html) +- [bauer_spiral](https://openhome.cc/eGossip/OpenSCAD/lib2x-bauer_spiral.html) +- [bezier_curve](https://openhome.cc/eGossip/OpenSCAD/lib2x-bezier_curve.html) +- [bspline_curve](https://openhome.cc/eGossip/OpenSCAD/lib2x-bspline_curve.html) +- [curve](https://openhome.cc/eGossip/OpenSCAD/lib2x-curve.html) +- [fibonacci_lattice](https://openhome.cc/eGossip/OpenSCAD/lib2x-fibonacci_lattice.html) +- [golden_spiral](https://openhome.cc/eGossip/OpenSCAD/lib2x-golden_spiral.html) +- [helix](https://openhome.cc/eGossip/OpenSCAD/lib2x-helix.html) - [sphere_spiral](https://openhome.cc/eGossip/OpenSCAD/lib2x-sphere_spiral.html) - [torus_knot](https://openhome.cc/eGossip/OpenSCAD/lib2x-torus_knot.html) -- [curve](https://openhome.cc/eGossip/OpenSCAD/lib2x-curve.html) -- [bauer_spiral](https://openhome.cc/eGossip/OpenSCAD/lib2x-bauer_spiral.html) -- [fibonacci_lattice](https://openhome.cc/eGossip/OpenSCAD/lib2x-fibonacci_lattice.html) ### Extrusion +- [bend_extrude](https://openhome.cc/eGossip/OpenSCAD/lib2x-bend_extrude.html) - [box_extrude](https://openhome.cc/eGossip/OpenSCAD/lib2x-box_extrude.html) - [ellipse_extrude](https://openhome.cc/eGossip/OpenSCAD/lib2x-ellipse_extrude.html) -- [stereographic_extrude](https://openhome.cc/eGossip/OpenSCAD/lib2x-stereographic_extrude.html) - [rounded_extrude](https://openhome.cc/eGossip/OpenSCAD/lib2x-rounded_extrude.html) -- [bend_extrude](https://openhome.cc/eGossip/OpenSCAD/lib2x-bend_extrude.html) +- [stereographic_extrude](https://openhome.cc/eGossip/OpenSCAD/lib2x-stereographic_extrude.html) ### 2D Shape -- [shape_taiwan](https://openhome.cc/eGossip/OpenSCAD/lib2x-shape_taiwan.html) - [shape_arc](https://openhome.cc/eGossip/OpenSCAD/lib2x-shape_arc.html) -- [shape_pie](https://openhome.cc/eGossip/OpenSCAD/lib2x-shape_pie.html) - [shape_circle](https://openhome.cc/eGossip/OpenSCAD/lib2x-shape_circle.html) -- [shape_ellipse](https://openhome.cc/eGossip/OpenSCAD/lib2x-shape_ellipse.html) -- [shape_square](https://openhome.cc/eGossip/OpenSCAD/lib2x-shape_square.html) -- [shape_trapezium](https://openhome.cc/eGossip/OpenSCAD/lib2x-shape_trapezium.html) - [shape_cyclicpolygon](https://openhome.cc/eGossip/OpenSCAD/lib2x-shape_cyclicpolygon.html) -- [shape_pentagram](https://openhome.cc/eGossip/OpenSCAD/lib2x-shape_pentagram.html) -- [shape_starburst](https://openhome.cc/eGossip/OpenSCAD/lib2x-shape_starburst.html) -- [shape_superformula](https://openhome.cc/eGossip/OpenSCAD/lib2x-shape_superformula.html) -- [shape_path_extend](https://openhome.cc/eGossip/OpenSCAD/lib2x-shape_path_extend.html) +- [shape_ellipse](https://openhome.cc/eGossip/OpenSCAD/lib2x-shape_ellipse.html) - [shape_liquid_splitting](https://openhome.cc/eGossip/OpenSCAD/lib2x-shape_liquid_splitting.html) +- [shape_path_extend](https://openhome.cc/eGossip/OpenSCAD/lib2x-shape_path_extend.html) +- [shape_pentagram](https://openhome.cc/eGossip/OpenSCAD/lib2x-shape_pentagram.html) +- [shape_pie](https://openhome.cc/eGossip/OpenSCAD/lib2x-shape_pie.html) +- [shape_square](https://openhome.cc/eGossip/OpenSCAD/lib2x-shape_square.html) +- [shape_starburst](https://openhome.cc/eGossip/OpenSCAD/lib2x-shape_starburst.html) +- [shape_superformula](https://openhome.cc/eGossip/OpenSCAD/lib2x-shape_superformula.html) +- [shape_taiwan](https://openhome.cc/eGossip/OpenSCAD/lib2x-shape_taiwan.html) +- [shape_trapezium](https://openhome.cc/eGossip/OpenSCAD/lib2x-shape_trapezium.html) ### 2D Shape Extrusion +- [archimedean_spiral_extrude](https://openhome.cc/eGossip/OpenSCAD/lib2x-archimedean_spiral_extrude.html) +- [golden_spiral_extrude](https://openhome.cc/eGossip/OpenSCAD/lib2x-golden_spiral_extrude.html) +- [helix_extrude](https://openhome.cc/eGossip/OpenSCAD/lib2x-helix_extrude.html) - [path_extrude](https://openhome.cc/eGossip/OpenSCAD/lib2x-path_extrude.html) - [ring_extrude](https://openhome.cc/eGossip/OpenSCAD/lib2x-ring_extrude.html) -- [helix_extrude](https://openhome.cc/eGossip/OpenSCAD/lib2x-helix_extrude.html) -- [golden_spiral_extrude](https://openhome.cc/eGossip/OpenSCAD/lib2x-golden_spiral_extrude.html) -- [archimedean_spiral_extrude](https://openhome.cc/eGossip/OpenSCAD/lib2x-archimedean_spiral_extrude.html) - [sphere_spiral_extrude](https://openhome.cc/eGossip/OpenSCAD/lib2x-sphere_spiral_extrude.html) ### Util @@ -153,51 +153,51 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp ### Matrix - [matrix/m_cumulate](https://openhome.cc/eGossip/OpenSCAD/lib2x-m_cumulate.html) -- [matrix/m_translation](https://openhome.cc/eGossip/OpenSCAD/lib2x-m_translation.html) +- [matrix/m_determinant](https://openhome.cc/eGossip/OpenSCAD/lib2x-m_determinant.html) +- [matrix/m_mirror](https://openhome.cc/eGossip/OpenSCAD/lib2x-m_mirror.html) - [matrix/m_rotation](https://openhome.cc/eGossip/OpenSCAD/lib2x-m_rotation.html) - [matrix/m_scaling](https://openhome.cc/eGossip/OpenSCAD/lib2x-m_scaling.html) -- [matrix/m_mirror](https://openhome.cc/eGossip/OpenSCAD/lib2x-m_mirror.html) - [matrix/m_shearing](https://openhome.cc/eGossip/OpenSCAD/lib2x-m_shearing.html) -- [matrix/m_determinant](https://openhome.cc/eGossip/OpenSCAD/lib2x-m_determinant.html) +- [matrix/m_translation](https://openhome.cc/eGossip/OpenSCAD/lib2x-m_translation.html) ### Point Transformation -- [ptf/ptf_rotate](https://openhome.cc/eGossip/OpenSCAD/lib2x-ptf_rotate.html) -- [ptf/ptf_x_twist](https://openhome.cc/eGossip/OpenSCAD/lib2x-ptf_x_twist.html) -- [ptf/ptf_y_twist](https://openhome.cc/eGossip/OpenSCAD/lib2x-ptf_y_twist.html) -- [ptf/ptf_circle](https://openhome.cc/eGossip/OpenSCAD/lib2x-ptf_circle.html) - [ptf/ptf_bend](https://openhome.cc/eGossip/OpenSCAD/lib2x-ptf_bend.html) +- [ptf/ptf_circle](https://openhome.cc/eGossip/OpenSCAD/lib2x-ptf_circle.html) - [ptf/ptf_ring](https://openhome.cc/eGossip/OpenSCAD/lib2x-ptf_ring.html) +- [ptf/ptf_rotate](https://openhome.cc/eGossip/OpenSCAD/lib2x-ptf_rotate.html) - [ptf/ptf_sphere](https://openhome.cc/eGossip/OpenSCAD/lib2x-ptf_sphere.html) - [ptf/ptf_torus](https://openhome.cc/eGossip/OpenSCAD/lib2x-ptf_torus.html) +- [ptf/ptf_x_twist](https://openhome.cc/eGossip/OpenSCAD/lib2x-ptf_x_twist.html) +- [ptf/ptf_y_twist](https://openhome.cc/eGossip/OpenSCAD/lib2x-ptf_y_twist.html) ---- ### Turtle -- [turtle/turtle2d](https://openhome.cc/eGossip/OpenSCAD/lib2x-turtle2d.html) -- [turtle/turtle3d](https://openhome.cc/eGossip/OpenSCAD/lib2x-turtle3d.html) -- [turtle/t2d](https://openhome.cc/eGossip/OpenSCAD/lib2x-t2d.html) -- [turtle/t3d](https://openhome.cc/eGossip/OpenSCAD/lib2x-t3d.html) - [turtle/footprints2](https://openhome.cc/eGossip/OpenSCAD/lib2x-footprints2.html) - [turtle/footprints3](https://openhome.cc/eGossip/OpenSCAD/lib2x-footprints3.html) - [turtle/lsystem2](https://openhome.cc/eGossip/OpenSCAD/lib2x-lsystem2.html) - [turtle/lsystem3](https://openhome.cc/eGossip/OpenSCAD/lib2x-lsystem3.html) +- [turtle/t2d](https://openhome.cc/eGossip/OpenSCAD/lib2x-t2d.html) +- [turtle/t3d](https://openhome.cc/eGossip/OpenSCAD/lib2x-t3d.html) +- [turtle/turtle2d](https://openhome.cc/eGossip/OpenSCAD/lib2x-turtle2d.html) +- [turtle/turtle3d](https://openhome.cc/eGossip/OpenSCAD/lib2x-turtle3d.html) ### Voxel -- [voxel/vx_line](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_line.html) -- [voxel/vx_polyline](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_polyline.html) -- [voxel/vx_circle](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_circle.html) -- [voxel/vx_cylinder](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_cylinder.html) -- [voxel/vx_sphere](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_sphere.html) -- [voxel/vx_polygon](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_polygon.html) -- [voxel/vx_from](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_from.html) - [voxel/vx_ascii](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_ascii.html) -- [voxel/vx_gray](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_gray.html) -- [voxel/vx_union](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_union.html) -- [voxel/vx_intersection](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_intersection.html) -- [voxel/vx_difference](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_difference.html) - [voxel/vx_bezier](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_bezier.html) -- [voxel/vx_curve](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_curve.html) - [voxel/vx_contour](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_contour.html) +- [voxel/vx_circle](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_circle.html) +- [voxel/vx_curve](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_curve.html) +- [voxel/vx_cylinder](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_cylinder.html) +- [voxel/vx_difference](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_difference.html) +- [voxel/vx_from](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_from.html) +- [voxel/vx_gray](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_gray.html) +- [voxel/vx_intersection](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_intersection.html) +- [voxel/vx_line](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_line.html) +- [voxel/vx_polygon](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_polygon.html) +- [voxel/vx_polyline](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_polyline.html) +- [voxel/vx_sphere](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_sphere.html) +- [voxel/vx_union](https://openhome.cc/eGossip/OpenSCAD/lib2x-vx_union.html) ### Part - [part/connector_peg](https://openhome.cc/eGossip/OpenSCAD/lib2x-connector_peg.html) @@ -205,14 +205,15 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [part/joint_T](https://openhome.cc/eGossip/OpenSCAD/lib2x-joint_T.html) ### Surface -- [surface/sf_square](https://openhome.cc/eGossip/OpenSCAD/lib2x-sf_square.html) - [surface/sf_bend](https://openhome.cc/eGossip/OpenSCAD/lib2x-sf_bend.html) - [surface/sf_ring](https://openhome.cc/eGossip/OpenSCAD/lib2x-sf_ring.html) -- [surface/sf_sphere](https://openhome.cc/eGossip/OpenSCAD/lib2x-sf_sphere.html) -- [surface/sf_torus](https://openhome.cc/eGossip/OpenSCAD/lib2x-sf_torus.html) - [surface/sf_solidify](https://openhome.cc/eGossip/OpenSCAD/lib2x-sf_solidify.html) +- [surface/sf_sphere](https://openhome.cc/eGossip/OpenSCAD/lib2x-sf_sphere.html) +- [surface/sf_square](https://openhome.cc/eGossip/OpenSCAD/lib2x-sf_square.html) +- [surface/sf_torus](https://openhome.cc/eGossip/OpenSCAD/lib2x-sf_torus.html ### Noise +- [noise/nz_cell](https://openhome.cc/eGossip/OpenSCAD/lib2x-nz_cell.html) - [noise/nz_perlin1](https://openhome.cc/eGossip/OpenSCAD/lib2x-nz_perlin1.html) - [noise/nz_perlin1s](https://openhome.cc/eGossip/OpenSCAD/lib2x-nz_perlin1s.html) - [noise/nz_perlin2](https://openhome.cc/eGossip/OpenSCAD/lib2x-nz_perlin2.html) @@ -223,14 +224,13 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [noise/nz_worley2s](https://openhome.cc/eGossip/OpenSCAD/lib2x-nz_worley2s.html) - [noise/nz_worley3](https://openhome.cc/eGossip/OpenSCAD/lib2x-nz_worley3.html) - [noise/nz_worley3s](https://openhome.cc/eGossip/OpenSCAD/lib2x-nz_worley3s.html) -- [noise/nz_cell](https://openhome.cc/eGossip/OpenSCAD/lib2x-nz_cell.html) ### Voronoi -- [voronoi/vrn2_from](https://openhome.cc/eGossip/OpenSCAD/lib2x-vrn2_from.html) -- [voronoi/vrn2_space](https://openhome.cc/eGossip/OpenSCAD/lib2x-vrn2_space.html) - [voronoi/vrn2_cells_from](https://openhome.cc/eGossip/OpenSCAD/lib2x-vrn2_cells_from.html) - [voronoi/vrn2_cells_space](https://openhome.cc/eGossip/OpenSCAD/lib2x-vrn2_cells_space.html) +- [voronoi/vrn2_from](https://openhome.cc/eGossip/OpenSCAD/lib2x-vrn2_from.html) +- [voronoi/vrn2_space](https://openhome.cc/eGossip/OpenSCAD/lib2x-vrn2_space.html) - [voronoi/vrn3_from](https://openhome.cc/eGossip/OpenSCAD/lib2x-vrn3_from.html) - [voronoi/vrn3_space](https://openhome.cc/eGossip/OpenSCAD/lib2x-vrn3_space.html) From 831f1d04e955843a29fa1e43dd52e9c536458911 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Mon, 8 Feb 2021 18:03:08 +0800 Subject: [PATCH 29/99] update to lib3x --- README.md | 2 +- docs/{lib2x-fibseq.md => lib3x-fibseq.md} | 0 src/util/fibseq.scad | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename docs/{lib2x-fibseq.md => lib3x-fibseq.md} (100%) diff --git a/README.md b/README.md index b3b2a38e..ef90240e 100644 --- a/README.md +++ b/README.md @@ -137,7 +137,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [util/bsearch](https://openhome.cc/eGossip/OpenSCAD/lib3x-bsearch.html) - [util/choose](https://openhome.cc/eGossip/OpenSCAD/lib3x-choose.html) - [util/dedup](https://openhome.cc/eGossip/OpenSCAD/lib3x-dedup.html) -- [util/fibseq](https://openhome.cc/eGossip/OpenSCAD/lib2x-fibseq.html) +- [util/fibseq](https://openhome.cc/eGossip/OpenSCAD/lib3x-fibseq.html) - [util/flat](https://openhome.cc/eGossip/OpenSCAD/lib2x-flat.html) - [util/has](https://openhome.cc/eGossip/OpenSCAD/lib2x-has.html) - [util/lerp](https://openhome.cc/eGossip/OpenSCAD/lib2x-lerp.html) diff --git a/docs/lib2x-fibseq.md b/docs/lib3x-fibseq.md similarity index 100% rename from docs/lib2x-fibseq.md rename to docs/lib3x-fibseq.md diff --git a/src/util/fibseq.scad b/src/util/fibseq.scad index f729bab8..162709b2 100644 --- a/src/util/fibseq.scad +++ b/src/util/fibseq.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2019 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-fibseq.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-fibseq.html * **/ From d4042c93e375c0aff059a169082c0779f34201e0 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Tue, 9 Feb 2021 10:29:23 +0800 Subject: [PATCH 30/99] refactor --- src/experimental/note.md | 6 +++++- src/util/_impl/_dedup_impl.scad | 8 ++------ src/util/some.scad | 5 +++++ 3 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 src/util/some.scad diff --git a/src/experimental/note.md b/src/experimental/note.md index dc13b94b..9f522d97 100644 --- a/src/experimental/note.md +++ b/src/experimental/note.md @@ -6,4 +6,8 @@ dotSCAD 3.0 Dev - `util/sort`: `by` accepts a function literal. - `util/bsearch`: only supports `sorted` and `target` parameters. I view it as a new function. -- `util/dedup`: add the `eq` parameter. \ No newline at end of file +- `util/dedup`: add the `eq` parameter. + +New modules/functions + +- `some` \ No newline at end of file diff --git a/src/util/_impl/_dedup_impl.scad b/src/util/_impl/_dedup_impl.scad index 425ba329..35c35d89 100644 --- a/src/util/_impl/_dedup_impl.scad +++ b/src/util/_impl/_dedup_impl.scad @@ -1,3 +1,5 @@ +use <../some.scad> ; + function _dedup_sorted(lt, leng, eq) = leng == 0 ? lt : is_function(eq) ? @@ -10,12 +12,6 @@ function _dedup_sorted(lt, leng, eq) = [for(i = [1:leng - 1]) if(lt[i] != lt[i - 1]) lt[i]] ); -function _some(dest, assert_func, leng, i = 0) = - i == leng ? false : - assert_func(dest[i]) ? true : _some(dest, assert_func, leng, i + 1); - -function some(dest, assert_func) = _some(dest, assert_func, len(dest)); - function _dedup_vt(src, dest, leng, i = 0) = i == leng ? dest : // src[i] in dest ? diff --git a/src/util/some.scad b/src/util/some.scad new file mode 100644 index 00000000..75d6e437 --- /dev/null +++ b/src/util/some.scad @@ -0,0 +1,5 @@ +function _some(dest, assert_func, leng, i = 0) = + i == leng ? false : + assert_func(dest[i]) ? true : _some(dest, assert_func, leng, i + 1); + +function some(dest, assert_func) = _some(dest, assert_func, len(dest)); \ No newline at end of file From e61e564c474e1abefdc5be017306c4f7e9b2b861 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Tue, 9 Feb 2021 10:38:24 +0800 Subject: [PATCH 31/99] add spherical_coordinate --- src/experimental/note.md | 3 ++- src/spherical_coordinate.scad | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 src/spherical_coordinate.scad diff --git a/src/experimental/note.md b/src/experimental/note.md index 9f522d97..09985ed6 100644 --- a/src/experimental/note.md +++ b/src/experimental/note.md @@ -10,4 +10,5 @@ dotSCAD 3.0 Dev New modules/functions -- `some` \ No newline at end of file +- `spherical_coordinate` +- `util/some` diff --git a/src/spherical_coordinate.scad b/src/spherical_coordinate.scad new file mode 100644 index 00000000..295315d5 --- /dev/null +++ b/src/spherical_coordinate.scad @@ -0,0 +1,6 @@ +use <__comm__/__angy_angz.scad>; + +function spherical_coordinate(point) = + let(ayz = __angy_angz([0, 0, 0], point)) + // mathematics, r, theta, phi + [norm(point), ayz[1], ayz[0]]; \ No newline at end of file From a32305148d50947598f98dbeaae9da0892b55569 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Tue, 9 Feb 2021 10:41:58 +0800 Subject: [PATCH 32/99] add angles_between --- src/angles_between.scad | 1 + src/experimental/note.md | 1 + 2 files changed, 2 insertions(+) create mode 100644 src/angles_between.scad diff --git a/src/angles_between.scad b/src/angles_between.scad new file mode 100644 index 00000000..53251a8e --- /dev/null +++ b/src/angles_between.scad @@ -0,0 +1 @@ +function angles_between(vt1, vt2) = acos((vt1 * vt2) / (norm(vt1) * norm(vt2))); \ No newline at end of file diff --git a/src/experimental/note.md b/src/experimental/note.md index 09985ed6..d949d99a 100644 --- a/src/experimental/note.md +++ b/src/experimental/note.md @@ -10,5 +10,6 @@ dotSCAD 3.0 Dev New modules/functions +- `angles_between` - `spherical_coordinate` - `util/some` From 8b7d07e1d33b67fb0f35afaa5bd70d57e76acf7b Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Tue, 9 Feb 2021 10:43:14 +0800 Subject: [PATCH 33/99] rename param --- src/util/some.scad | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/util/some.scad b/src/util/some.scad index 75d6e437..99e137b4 100644 --- a/src/util/some.scad +++ b/src/util/some.scad @@ -1,5 +1,5 @@ -function _some(dest, assert_func, leng, i = 0) = +function _some(lt, assert_func, leng, i = 0) = i == leng ? false : - assert_func(dest[i]) ? true : _some(dest, assert_func, leng, i + 1); + assert_func(lt[i]) ? true : _some(lt, assert_func, leng, i + 1); -function some(dest, assert_func) = _some(dest, assert_func, len(dest)); \ No newline at end of file +function some(lt, assert_func) = _some(lt, assert_func, len(lt)); \ No newline at end of file From a345c6cd24222bcca70d6fbbdce88f65b4dda856 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Tue, 9 Feb 2021 10:44:42 +0800 Subject: [PATCH 34/99] add every --- src/experimental/note.md | 2 ++ src/util/every.scad | 5 +++++ 2 files changed, 7 insertions(+) create mode 100644 src/util/every.scad diff --git a/src/experimental/note.md b/src/experimental/note.md index d949d99a..5504a5f3 100644 --- a/src/experimental/note.md +++ b/src/experimental/note.md @@ -12,4 +12,6 @@ New modules/functions - `angles_between` - `spherical_coordinate` +- `util/every` - `util/some` + diff --git a/src/util/every.scad b/src/util/every.scad new file mode 100644 index 00000000..652bc441 --- /dev/null +++ b/src/util/every.scad @@ -0,0 +1,5 @@ +function _every(lt, assert_func, leng, i = 0) = + i == leng ? true : + assert_func(lt[i]) ? _every(lt, assert_func, leng, i + 1) : false; + +function every(lt, assert_func) = _every(lt, assert_func, len(lt)); \ No newline at end of file From 65c2b496964d8c25f9f1c1350d63f4c771e1d282 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Tue, 9 Feb 2021 10:46:16 +0800 Subject: [PATCH 35/99] rename --- src/angle_between.scad | 1 + src/angles_between.scad | 1 - src/experimental/note.md | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 src/angle_between.scad delete mode 100644 src/angles_between.scad diff --git a/src/angle_between.scad b/src/angle_between.scad new file mode 100644 index 00000000..c08d6cf7 --- /dev/null +++ b/src/angle_between.scad @@ -0,0 +1 @@ +function angle_between(vt1, vt2) = acos((vt1 * vt2) / (norm(vt1) * norm(vt2))); \ No newline at end of file diff --git a/src/angles_between.scad b/src/angles_between.scad deleted file mode 100644 index 53251a8e..00000000 --- a/src/angles_between.scad +++ /dev/null @@ -1 +0,0 @@ -function angles_between(vt1, vt2) = acos((vt1 * vt2) / (norm(vt1) * norm(vt2))); \ No newline at end of file diff --git a/src/experimental/note.md b/src/experimental/note.md index 5504a5f3..cba43313 100644 --- a/src/experimental/note.md +++ b/src/experimental/note.md @@ -10,7 +10,7 @@ dotSCAD 3.0 Dev New modules/functions -- `angles_between` +- `angle_between` - `spherical_coordinate` - `util/every` - `util/some` From c9565403c375e798357ed4cbcd8d3b8b35994318 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Tue, 9 Feb 2021 10:52:17 +0800 Subject: [PATCH 36/99] add polar_coordinate --- src/experimental/note.md | 1 + src/polar_coordinate.scad | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 src/polar_coordinate.scad diff --git a/src/experimental/note.md b/src/experimental/note.md index cba43313..5358658b 100644 --- a/src/experimental/note.md +++ b/src/experimental/note.md @@ -11,6 +11,7 @@ dotSCAD 3.0 Dev New modules/functions - `angle_between` +- `polar_coordinate` - `spherical_coordinate` - `util/every` - `util/some` diff --git a/src/polar_coordinate.scad b/src/polar_coordinate.scad new file mode 100644 index 00000000..0b377a8b --- /dev/null +++ b/src/polar_coordinate.scad @@ -0,0 +1,3 @@ +use <__comm__/__angy_angz.scad>; + +function polar_coordinate(point) = [norm(point), atan2(point[1], point[0])]; // r, theta \ No newline at end of file From ab0cd4cf83e4270df6833568d34926a82bebd7c1 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Tue, 9 Feb 2021 10:55:18 +0800 Subject: [PATCH 37/99] add radians degrees --- src/degrees.scad | 1 + src/experimental/note.md | 2 ++ src/radians.scad | 1 + 3 files changed, 4 insertions(+) create mode 100644 src/degrees.scad create mode 100644 src/radians.scad diff --git a/src/degrees.scad b/src/degrees.scad new file mode 100644 index 00000000..fe02a304 --- /dev/null +++ b/src/degrees.scad @@ -0,0 +1 @@ +function degrees(radians) = 180 / PI * radians; \ No newline at end of file diff --git a/src/experimental/note.md b/src/experimental/note.md index 5358658b..f7267c54 100644 --- a/src/experimental/note.md +++ b/src/experimental/note.md @@ -10,6 +10,8 @@ dotSCAD 3.0 Dev New modules/functions +- `degrees` +- `radians` - `angle_between` - `polar_coordinate` - `spherical_coordinate` diff --git a/src/radians.scad b/src/radians.scad new file mode 100644 index 00000000..cdefb799 --- /dev/null +++ b/src/radians.scad @@ -0,0 +1 @@ +function radians(degrees) = PI / 180 * degrees; \ No newline at end of file From 7f8fa0eeb0fc9c4f4b43bbda72d0ebfd2beb0cb4 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Tue, 9 Feb 2021 12:23:23 +0800 Subject: [PATCH 38/99] refactor --- src/util/_impl/_every.scad | 3 +++ src/util/every.scad | 4 +--- 2 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 src/util/_impl/_every.scad diff --git a/src/util/_impl/_every.scad b/src/util/_impl/_every.scad new file mode 100644 index 00000000..af70ca2b --- /dev/null +++ b/src/util/_impl/_every.scad @@ -0,0 +1,3 @@ +function _every(lt, assert_func, leng, i = 0) = + i == leng ? true : + assert_func(lt[i]) ? _every(lt, assert_func, leng, i + 1) : false; \ No newline at end of file diff --git a/src/util/every.scad b/src/util/every.scad index 652bc441..c01a527a 100644 --- a/src/util/every.scad +++ b/src/util/every.scad @@ -1,5 +1,3 @@ -function _every(lt, assert_func, leng, i = 0) = - i == leng ? true : - assert_func(lt[i]) ? _every(lt, assert_func, leng, i + 1) : false; +use <_impl/_every.scad>; function every(lt, assert_func) = _every(lt, assert_func, len(lt)); \ No newline at end of file From 34d09cf88fa296b50b775eb5c35e87520f8f9d67 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Tue, 9 Feb 2021 12:24:08 +0800 Subject: [PATCH 39/99] refactor --- src/util/_impl/_some.scad | 3 +++ src/util/some.scad | 4 +--- 2 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 src/util/_impl/_some.scad diff --git a/src/util/_impl/_some.scad b/src/util/_impl/_some.scad new file mode 100644 index 00000000..390f1108 --- /dev/null +++ b/src/util/_impl/_some.scad @@ -0,0 +1,3 @@ +function _some(lt, assert_func, leng, i = 0) = + i == leng ? false : + assert_func(lt[i]) ? true : _some(lt, assert_func, leng, i + 1); \ No newline at end of file diff --git a/src/util/some.scad b/src/util/some.scad index 99e137b4..34b4a49c 100644 --- a/src/util/some.scad +++ b/src/util/some.scad @@ -1,5 +1,3 @@ -function _some(lt, assert_func, leng, i = 0) = - i == leng ? false : - assert_func(lt[i]) ? true : _some(lt, assert_func, leng, i + 1); +use <_impl/_some.scad>; function some(lt, assert_func) = _some(lt, assert_func, len(lt)); \ No newline at end of file From 8d6fd0b2903739f3bd9c8a4e0bef12910225dd1b Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Tue, 9 Feb 2021 14:30:44 +0800 Subject: [PATCH 40/99] refactor --- src/spherical_coordinate.scad | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/spherical_coordinate.scad b/src/spherical_coordinate.scad index 295315d5..47608097 100644 --- a/src/spherical_coordinate.scad +++ b/src/spherical_coordinate.scad @@ -1,6 +1,7 @@ -use <__comm__/__angy_angz.scad>; - function spherical_coordinate(point) = - let(ayz = __angy_angz([0, 0, 0], point)) - // mathematics, r, theta, phi - [norm(point), ayz[1], ayz[0]]; \ No newline at end of file + // mathematics [r, theta, phi] + [ + norm(point), + atan2(point[1], point[0]), + atan2(point[2], sqrt(point[0]^2 + point[1]^2)) + ]; From 3789cb11a61c12d716a0eee410a530e11c73fe54 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Tue, 9 Feb 2021 15:15:08 +0800 Subject: [PATCH 41/99] simplify LINES and HULL_LINES --- src/function_grapher.scad | 96 ++++++++++++++++++--------------------- 1 file changed, 44 insertions(+), 52 deletions(-) diff --git a/src/function_grapher.scad b/src/function_grapher.scad index 1ee333c9..89dc4893 100644 --- a/src/function_grapher.scad +++ b/src/function_grapher.scad @@ -11,8 +11,10 @@ use ; use ; use ; +use ; +use ; -module function_grapher(points, thickness, style = "FACES", slicing = "SLASH") { +module function_grapher(points, thickness, style = "FACES") { rows = len(points); columns = len(points[0]); @@ -221,59 +223,12 @@ module function_grapher(points, thickness, style = "FACES", slicing = "SLASH") { hull_pts(tri1); hull_pts(tri2); } - - module tri_to_graph(twintri_lt) { - if(style == "LINES") { - if(slicing == "SLASH") { - for(twintri = twintri_lt) { - tri_to_slash_lines(twintri[0], twintri[1]); - } - } - else { - for(twintri = twintri_lt) { - tri_to_backslash_lines(twintri[0], twintri[1]); - } - } - } else if(style == "HULL_FACES") { // Warning: May be very slow!! - for(twintri = twintri_lt) { - tri_to_hull_faces(twintri[0], twintri[1]); - } - } else if(style == "HULL_LINES") { // Warning: May be very slow!! - if(slicing == "SLASH") { - for(twintri = twintri_lt) { - tri_to_slash_hull_lines(twintri[0], twintri[1]); - } - } - else { - for(twintri = twintri_lt) { - tri_to_backslash_hull_lines(twintri[0], twintri[1]); - } - } - } - } - if(style == "FACES") { faces(); - } else { - twintri_lt = slicing == "SLASH" ? - [ - for(yi = yi_range) - for(xi = xi_range) - [ - [ - points[yi][xi], - points[yi][xi + 1], - points[yi + 1][xi + 1] - ], - [ - points[yi][xi], - points[yi + 1][xi + 1], - points[yi + 1][xi] - ] - ] - ] - : + } + else if(style == "HULL_FACES") { + twintri_lt = [ for(yi = yi_range) for(xi = xi_range) @@ -291,7 +246,44 @@ module function_grapher(points, thickness, style = "FACES", slicing = "SLASH") { ] ]; - tri_to_graph(twintri_lt); + for(twintri = twintri_lt) { + tri_to_hull_faces(twintri[0], twintri[1]); + } + } + else { + if(style == "LINES") { + for(row = points) { + polyline3d(row, thickness); + } + + for(x = [0:columns - 1]) { + polyline3d([for(y = [0:rows - 1]) points[y][x]], thickness); + } + + for(c = [0:columns - 1]) { + polyline3d([for(r = [0:rows - 1 - c]) points[r + c][r]], thickness); + } + for(c = [0:columns - 1]) { + polyline3d([for(r = [0:rows - 1 - c]) points[r][r + c]], thickness); + } + } + else { + for(row = points) { + hull_polyline3d(row, thickness); + } + + for(x = [0:columns - 1]) { + hull_polyline3d([for(y = [0:rows - 1]) points[y][x]], thickness); + } + + for(c = [0:columns - 1]) { + hull_polyline3d([for(r = [0:rows - 1 - c]) points[r + c][r]], thickness); + } + + for(c = [0:columns - 1]) { + hull_polyline3d([for(r = [0:rows - 1 - c]) points[r][r + c]], thickness); + } + } } } From 6fe210331ab4edca5b1c018a9f90381cd377f1f2 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Tue, 9 Feb 2021 15:36:40 +0800 Subject: [PATCH 42/99] LINES use path_extrude --- src/function_grapher.scad | 90 +++++++-------------------------------- 1 file changed, 15 insertions(+), 75 deletions(-) diff --git a/src/function_grapher.scad b/src/function_grapher.scad index 89dc4893..0afdcc12 100644 --- a/src/function_grapher.scad +++ b/src/function_grapher.scad @@ -4,12 +4,11 @@ * @copyright Justin Lin, 2017 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-function_grapher.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-function_grapher.html * **/ use ; -use ; use ; use ; use ; @@ -22,6 +21,8 @@ module function_grapher(points, thickness, style = "FACES") { yi_range = [0:rows - 2]; xi_range = [0:columns - 2]; + half_thickness = thickness / 2; + // Increasing $fn will be slow when you use "LINES", "HULL_FACES" or "HULL_LINES". module faces() { @@ -40,7 +41,7 @@ module function_grapher(points, thickness, style = "FACES") { leng_pts = len(top_pts); - top_tri_faces1 = slicing == "SLASH" ? [ + top_tri_faces1 = [ for(yi = yi_range) for(xi = xi_range) [ @@ -48,17 +49,9 @@ module function_grapher(points, thickness, style = "FACES") { xy_to_index(xi + 1, yi + 1, columns), xy_to_index(xi + 1, yi, columns) ] - ] : [ - for(yi = yi_range) - for(xi = xi_range) - [ - xy_to_index(xi, yi, columns), - xy_to_index(xi, yi + 1, columns), - xy_to_index(xi + 1, yi, columns) - ] ]; - top_tri_faces2 = slicing == "SLASH" ? [ + top_tri_faces2 = [ for(yi = yi_range) for(xi = xi_range) [ @@ -66,14 +59,6 @@ module function_grapher(points, thickness, style = "FACES") { xy_to_index(xi, yi + 1, columns), xy_to_index(xi + 1, yi + 1, columns) ] - ] : [ - for(yi = yi_range) - for(xi = xi_range) - [ - xy_to_index(xi, yi + 1, columns), - xy_to_index(xi + 1, yi + 1, columns), - xy_to_index(xi + 1, yi, columns) - ] ]; offset_v = [leng_pts, leng_pts, leng_pts]; @@ -164,54 +149,7 @@ module function_grapher(points, thickness, style = "FACES") { test_function_grapher_faces(pts, face_idxs); } - module tri_to_slash_lines(tri1, tri2) { - polyline3d(concat(tri1, [tri1[0]]), thickness); - if(tri2[0][0] == points[0][0][0]) { - polyline3d([tri2[0], tri2[2]], thickness); - } - - if(tri2[1][1] == points[rows - 1][0][1]) { - polyline3d([tri2[1], tri2[2]], thickness); - } - } - - module tri_to_backslash_lines(tri1, tri2) { - polyline3d(concat(tri1, [tri1[0]]), thickness); - if(tri2[1][0] == points[0][columns - 1][0]) { - polyline3d([tri2[1], tri2[2]], thickness); - } - - if(tri2[2][1] == points[rows - 1][columns - 1][1]) { - polyline3d([tri2[0], tri2[2]], thickness); - } - } - - module tri_to_slash_hull_lines(tri1, tri2) { - hull_polyline3d(concat(tri1, [tri1[0]]), thickness); - - if(tri2[0][0] == points[0][0][0]) { - hull_polyline3d([tri2[0], tri2[2]], thickness); - } - - if(tri2[1][1] == points[rows - 1][0][1]) { - hull_polyline3d([tri2[1], tri2[2]], thickness); - } - } - - module tri_to_backslash_hull_lines(tri1, tri2) { - hull_polyline3d(concat(tri1, [tri1[0]]), thickness); - - if(tri2[1][0] == points[0][columns - 1][0]) { - hull_polyline3d([tri2[1], tri2[2]], thickness); - } - - if(tri2[2][1] == points[rows - 1][columns - 1][1]) { - hull_polyline3d([tri2[0], tri2[2]], thickness); - } - } - module hull_pts(tri) { - half_thickness = thickness / 2; hull() { translate(tri[0]) sphere(half_thickness); translate(tri[1]) sphere(half_thickness); @@ -252,19 +190,21 @@ module function_grapher(points, thickness, style = "FACES") { } else { if(style == "LINES") { + section = shape_circle(radius = half_thickness); for(row = points) { - polyline3d(row, thickness); + path_extrude(section, row, method = "AXIS_ANGLE"); } for(x = [0:columns - 1]) { - polyline3d([for(y = [0:rows - 1]) points[y][x]], thickness); + path_extrude(section, [for(y = [0:rows - 1]) points[y][x]], method = "AXIS_ANGLE"); } - for(c = [0:columns - 1]) { - polyline3d([for(r = [0:rows - 1 - c]) points[r + c][r]], thickness); + for(c = [0:columns - 2]) { + path_extrude(section, [for(r = [0:rows - 1 - c]) points[r + c][r]], method = "AXIS_ANGLE"); } - for(c = [0:columns - 1]) { - polyline3d([for(r = [0:rows - 1 - c]) points[r][r + c]], thickness); + + for(c = [0:columns - 2]) { + path_extrude(section, [for(r = [0:rows - 1 - c]) points[r][r + c]], method = "AXIS_ANGLE"); } } else { @@ -276,11 +216,11 @@ module function_grapher(points, thickness, style = "FACES") { hull_polyline3d([for(y = [0:rows - 1]) points[y][x]], thickness); } - for(c = [0:columns - 1]) { + for(c = [0:columns - 2]) { hull_polyline3d([for(r = [0:rows - 1 - c]) points[r + c][r]], thickness); } - for(c = [0:columns - 1]) { + for(c = [0:columns - 2]) { hull_polyline3d([for(r = [0:rows - 1 - c]) points[r][r + c]], thickness); } } From 207e921fa1fbd2f93839361b1994f8b6322ac5f5 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Tue, 9 Feb 2021 15:40:22 +0800 Subject: [PATCH 43/99] update doc --- docs/images/lib2x-function_grapher-4.JPG | Bin 114210 -> 0 bytes ...her-1.JPG => lib3x-function_grapher-1.JPG} | Bin ...her-2.JPG => lib3x-function_grapher-2.JPG} | Bin ...her-3.JPG => lib3x-function_grapher-3.JPG} | Bin ...n_grapher.md => lib3x-function_grapher.md} | 34 ++---------------- 5 files changed, 3 insertions(+), 31 deletions(-) delete mode 100644 docs/images/lib2x-function_grapher-4.JPG rename docs/images/{lib2x-function_grapher-1.JPG => lib3x-function_grapher-1.JPG} (100%) rename docs/images/{lib2x-function_grapher-2.JPG => lib3x-function_grapher-2.JPG} (100%) rename docs/images/{lib2x-function_grapher-3.JPG => lib3x-function_grapher-3.JPG} (100%) rename docs/{lib2x-function_grapher.md => lib3x-function_grapher.md} (72%) diff --git a/docs/images/lib2x-function_grapher-4.JPG b/docs/images/lib2x-function_grapher-4.JPG deleted file mode 100644 index 39c5b58525510ecc98a51f8af1351897776a1350..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114210 zcmce;bx>SSyDmBj5CQ~u_h1161cDPBhA_b3{!4%mWN-7A-GF$ z7~I`m58ofV?mboe?)vt=r%qR`T2T@OnX-F3`|UH0!-|GWdpE?NtmCJlCcN~ z%968cVNI7j{pb=H zmrXu$%qApXxvWhBc>46w924u&@Cnwx8vNM1f7xmsVmul@+E)A}&1zXXk^^IsvC4mZ zm;t=NczlTXDG5LZa36)>GQn+yA&9`RY+Nu*76|^q1=Pag0x}`E6vz;qf&cv?@`08I zKok7r0ibQ%d^u{DTk1e~cUqQlojmsd=u82Jssh1T|7H!P{%hmLA65d=ZpzuByuFLf1GC_Z~w&4v#|Wb~b#dly9l zTF&JimKqq0!^|qi_98|OdAxo5mKnVl2I))du$8ClFMPqy#cjOLMwA`AE7GZl8rFe& zhondqM(|b;<#2UL%({1(vKp6)B1MOX*ga3^TB4~_k;{;D^+Cs)?; z<#0a-At;MoK+n?yqvWYzG^GxM2A6|G%HpzcHE(C7*2`n-~|&!3~Ca{5e)F zj)*2{3!zP7R2Ya#H{L^te?@bHLo?9QXHcWlg0O-`u_7ftW7;>R#Di>b*R)G78GaS# zSDovupjCVYk?d^0imz_*;os16lZDy@v*-_dM&j0DVbcaUz2PLeMKxa}QY{9)9NfQs zPZ|;oz2Xab0OTdUy2FKE-Rhc@8s&;#i&Nmv?EXZG=Ac7hh*p7Uh~dy)qqhrT+d7hB zX8TjEkoMrQ*lhb{Zx~-Hp=-@K6}v9uS!hxV(B)Rnx2fj=P;K(N&UhDJUO-94l`dLhA zs%uNs9M?SO!b?B5Y6oq{tzmO032u7%MsPwkfQ^ecGcFZw?;^r68>yRg3##~n71Zd= z7Hz<^wb9gl`+U^1;+mc(L7q@CNL-_1K6JD}r|c)4qrGKJCax^AJWaXe>X$N#LADyn zp|^2KGw5wvn{t?BUbrkS(A|?`;p%%;ppYrq10W0|wCV#@wYk6drrYqZW~}w}j_A6| zlI9B@pICdxQ{z<;c6kj{w-y02vnURvS~GYHL<*JFXpAzJ5Um_%nS21GbphAfy5h2r ziSSfaIuVlJzwWny!MaAVWlom$J?k!JS~6Ux36p!f0TZ-dvw9)kI@^^62}uSuHT#M* zYNRa4m#hQL^sCr3?uZcP_Sl%**a}R#K%S@nn^#g@dY-0Tx$FAUfL+DVB$PL`JajAv z&IJ(-snXL(eB(-xYTNPYaM_{YMx~kMa`kQQ%Tb4sTamFDdJS=i0X$>ml&q8+r=c~!O`>~t7KONTVaMX)7g1W$_;NseIh!lRaKCijhE#}}hx~{9jq1b* z8chNyHTSzAe@P!W&GGp_c~!DbgQg?3Z{_CUt;}^oyOP?)vo*ifnzqRSjYT(`wfqNw zZH%D1h1=zY@X`;5{u;N0XLOe)jz3RBsUe)MXP9qDrp9!9Z!9+L^jG-jSCpy^Oyq9b zT-lgSi{D5o@L-Z#{6h%$A%g4oNu@QnDt%u5kAkA+L)3P7d-heI{HeZ{fYH;XlZw0J#`+eHr_V|Nx-1SWM(j-W)JuXVly}ukvQvJjvWqJ4VqE9r+ z`&Z9+$(2xkPo=NWQE`{YYBjA@lUZ<6HBOti&T|RaBHcH1?VkZzTd02spSi~0QVZVd zv5HLgY9Dp3p#c&qWAFcYM^6tw>nLc&`ioi;6#e6D$H$=hG zyH0dg(b46)D0J{clRUHsvWDrR2kmiYH=yMJ90WR7yK{b*=hk_xn9rl++Vs&{okSl_ zg5lz6-a2KyGcx6jo$!E!_*Y&2?1v9fEb1k9W z_bD6XDI&Cb5#$NWr_DdZe#E|1a3^P48<>9Fohc}95bsx68z?_EC@0QVJFZz!qFBG|;`xQfRYav03IB=9 z__i1Bpig6C^ediP?h?w}fyE#8CvF43g{R;iA~jpsIPa(ddtU`M{xEPyhV=%7S{=@< z^9bx~PT|@-S5b4Uik_JNW1$fvQ2q5SPWtWkmlC*w9hkWSb0DCrP*oC^$|zo6iPQ2q zclXx>tx789@@s48kp?WbLthYhz902#+BL%CYnW5&mE8ki?k@VkU^w6a;rjp>n>e_C zGt-GQbaOgoU|O=S6%yBRO)|IR-=s0Y7M+D%4dN`^>YfCNhEN_<@odk&`>5?v@TzVw zYg_(AnCxJsR%W#GUZX^*_Vwht!XZz(W^qmvg3FXg;J-%6JQ>S4{Igbm)2N13FH%-;BTqGF-u(f-n*uxokn?hB{txi`zX7=Zx4nWqxAyC7iI>1D`>HrZi5Y2hVPR3= z@;%qrE@Ihg4RgVn&;Yt%rUw95tL_;Hh@+8eNtD^3FEVOeY4ux#F`z7agm`R7z~SQA zmjtVI_q2WESI;I&U69IFKwR9lcvNPZf(2{qkCu`jv$6!N@d;rnexXjM{>DH(1P^^J zbx&{1QztTw$jidoJ>kv@GmD=qZ#k`jX!AZZiNJ=%^WEn|MYlV#%N)}5odVLk)7MdH z1CCuvUK+g5xrbpvxx8ElopG{j1(vD$F^kt9vdU_lDQg=RdZnpMso*n<$-?1h7fAu( zCU`l2>ju2*byrr)G>TM5(#)2qN9T~;v#LVN)z7Y#|GICTmM-La*5QKV$ZK&ruYc!a zt?td~g`A_^8lCR;F{{M{#bQky{l|$bDPj)_&8`>-!`oM?*%$a?X@d{=-gxb`*|baK z9NEc&$;&yO?`g4io1w#twggIA-ls^Y|ILVv`lXZNaqW37Li`~Fvdl@bReYvC`;T~A zsSVD01Lc5mx=S2rg@GVOz)-(RV~KFjv*j;8@yGfc;}T}&vwYR=cVi_##``*38cv}p(X6T(aUwL8B3uPuI%=xT{EnCCdnl%a45FaojWkXE z85r0V(jH*l1O4I|hi55DO)(sNBHP*G@zrQ?o}kx|Ne1#ntVX99eWl(RO>+zAmSfML z)Jc5xq;SM}^hhWC5+8q#{Y}E;*6^|y^!m(WZ*hAHVIW4H=oRg}XdKY$Z-H7Z!`JI?nQw4W7nU>r*7*YfiJ+Ic4}sJ3932$471(R#?iuMNE+dHJ zqh<32v48y-DfFRmkW?hNXghM44W)^-Ngr8n*Ax5Otw)whXGyx!>31kgPB_Ej&x`Bx zzV}M6V9T#PKya*S0SzK)h+O635|*Jh_-M*&?!`;;m-tK>nCj_P%@q{*^c-#fPi%E_ zg~lLNENR&N;QoGPBE7dooOkf1_}L2nUdk9F`u4s>g{Yf$y}U|#|6hf;ofDa?K^)e|*usli<1l3Dq48wby%6P7j&77c{D zcyMrr^h|u9)Lmnd(C$h2%JE-ZA1>%*jV_J;R!nYiH9}tNxhoE6dSPp^Xdr7puZ=RK z&g}uv8!hieH#$25Of}E<8!g7j04u6HE}h# z;JJzZGqN5{OSDnQNbiCfoEzlwEH#8Fdrg8302JLAn-{`}th;XoqDW ze+M{3^)yrOcwDA7RL@u1iM;~Q#pPCyE5qNqn*a?z^W6^PPu8DjHM%{$2`4wR9n}!q zwgz9mZM-b)@dp~z3tTtX!(xOAv3CM-7&pGvXegV*d%i9Z9W{6fraNbZRWnmezqdB# zdz~9w+Ykt@Phk1~U{%PCmYgDN16O+nkCPl3a|?lNUttI)l1D0rjqRz93V`HYk?;We z0kEPtSKpR#Y}&Y71d4u-pa>`Dkp?=gKr_8n#@6*HrWLY2bvVMR6TO;*Z`JQU+my(f z(z!Hb!4_l4z(giYMc}T2Ed1cTk^d{Zb67UDue=Ym?Ob`IUkga9dVbNuWc`POiuw-+ zMo*~+Bxgy+GyP{9c+SOWI_0*=BzQ|7waE}$fR%#-e zaE)a@rhQN^B6{7Mg15OG0m^#-5QPjx4B(@-zXMHr4jcB$*|yOEB92^k_qaKra*#rL zZ0CA5D0;v(X+Aq+#Jv#6C4E;@MyIl|Ai-1e8cHu!FnBw3KoQkBo}npqvxiV$ofHoJ zV$`}|+;h{|At1J6&XYJiU~JT^GMWV(4Zg%U2Zoo;x&D&MZZ|l-(+OBv_##1A)dwkB zv}qWGn7${^PgoXNcf10!o)&fbMcwm=kdI&!-$B(Q9#^`W*UdB&GjZEWNPhe4UY*P` z*9~XwPQ0d>B{|2RD@40A>GA<3U53LjI)_YUp$|(c=f!Wj{5h~^F6%?Z(~Zl~ptBb641V2@%;gtX zX$|zvKy%F0mf|-x9#YhZ9G%Q%K#UW5@as&}_6l*YfMUHmQL6{vf-SawJpceD^UTo@ z7l*_ZqmR7N5L~CY;4f24CGUcEt7xLy+B9q8cN>d*2>iv-EXt}pT5>Cm1K{|1>}Xlh z2LLKB$xk_P=*PQNp$la#-Qfyc$1YKh@4Q9<)izPbVxhHpvIN$&7tF|&P3K0}2|K@` z5K$#;as&5ncckdR1m%SbjeL=Y&~{ub>YeDZa+%)3^hemqs9{Y&uSk^(-ASS3BpK3z zJ_MIb71P?S2>lFI!~ClCrjIsxp{GG|9U9*!7Y8RiKEDPBsbw8h2yGGXZO6IWP|;z_ ztb_+Se#ku)>0*p&8c;RUPdI+QE9MH;$bc2=HRBj%O5ug=#(BB0`Wo)N58x()*<1`| zU=M1?nm|G$W7{MR-D3~$l?m&ai6{G1Zuwn*fnd>KVb|Z^R=SQSKQLHIFw!2mCJ&EB zDMC4FrJCRz=s&&jspB5LFY+d94l>wmmg)A4 z30*7S1TCqkCA%n(SzxPc?(oMtHe=WCTn@DjG}iW+Zy;QVdtF6)edT$Rt-ib9LqH8*wyeO}(jU%UN2tv#G_vbAO-rxE9Q zl(A!?Jj23}a$Y@RoCYau#H!`=xg!>|%=LT$OH-3Y`vz1NZyRt*eVuPh?fMnMlWgtU z{vxl(Y4M^y*X_4BVRBj0iP75j(fvZnN53+0ct`jMjfSAO+J0@WFA7%0R4CI_!W5m| zJiWZuUb*IE+)TQ=%!8R{sTz)Y0KAniZ2g1n7F)~ec+4gI=?dS|pMH6#n!^kgq}618 z0RdDlyZib5xv<*-4iY{~ac@?+2@d~dKT$qkO5xS-^Z=mT+SZHxI|z&llfT0KLBG;@ zld%(6+EnXva(**8J=D(Ud@ui(m|dp77ZwASy@r~vOEng;e!Uz~C?H}!A}Dbg_NIYveI7N=aRdlO0myf+ZpSIK*IEQT)-W}|Aa&TXkJQ^I%!p2pMAt0kGNx2 z{TgD$BL6jzfWVDue>qO6M=e4YcT(nZTwFaY9qq=EqCURh2@e)$K}c_b$pV)&xj4_s4c3t@a` zaQO41k56z`rNqT=Fr+$vSjQzZFoe-6U#y64R&QYKCr@?%nq*L(EfHLhvUaTqcOpJG zzEJh~p|CCUOU*`LSlBC|V-orLyqq4YH^o46EQG93jA7|rpwtf*M8SXSbmezhwcaku zhSc48KN>r`AhwQW0>-Lo7O_huQ?HGyjD;%rHWivmva>a?0#<0j zz!Tg=Gg0*=8F1~zTf}>6*=#LDwM_Us0!Gi+?zAF^o{;{OcZ$jiv5%XFt**FnmqeIW zN8We+Bfw)sYs>AWcCVbQ>L@xC=+RXp+-tlf(I!B%obp0n?A*{1?Wm>Msy`4(&&Q=Y zORq}vc4&)wZ`^2B$T_;5j*B#OZ$TiGk08rin4Lgzasb@$6jq2gEY(_dGahkR4q%GK zNNaM_(nFu{`z4x`Ob$}l8XGy^7b5TZ*EaXGKcFU}S+Vf<1y%HZA=_dM8vLS#Fn$Oh zdw~QG0zCWNjg)RIZ9v%3806hZ+ghg!(+-h@nA<_dI#no(jEneG_;5}UNJ**jT>%80 zq4;@9-6lWx@u__+`@c0q8$3xAo2T&eYq2m5PiSX}u@3Ii=fpvl6(5DM zx7`Up%Y@cU63J$6ZiCXy{#=$ihM?;}%U39#6`Amj4hM_5eRupWxx;0oBcgp%b+Enm z{*~r=WZp#NzI0p$UcCR>=LF+{?`K~cTGoAmL!<8#x`a93f2X%EIrqdQB1^@{7>$M7 zlzcH!e`#v!}NSU9BD|0lr5j$C2@!ny@5s;pI>3L7#hakN1M!PDX z-38o?x0`;Ls^Qu5AWI*NGoDGeu&k!!I`gEn!5eOf#0*X)maiV^Cx^Q23+SobGx6 zquK*NmSSety7~af7(cgyu9cY_a1XHY<#&vScwdy|#ROxjt~~$-lQBu+o=}6`LY}&A zQe)z_EFs@Dqc6h>79Ie+@*59;Z})CzTnZTbO@|`WX52$|^~%UDW*IB0kw#F_9#80p zIZ+42E+9GsKc~k%1AJ2b>JA(*S4(dE^}xyTmgX*xaw4u{fzdl6S$YYKs@lLy3 z3@va%>bb;6SXKD|@I|eh(8)J%q7Sb3<@97qI|~jE2xg@>(EJ|CBN3->>RQkIO*)6S z<7mvIaZ~_%r)U5|bSLib=b(nQN4nhd+{>JH$&3iuzlQ90%9=Q}-HXzl$&FvKfvAdI zoEN3C+lTruh9&U8)Sp++vMKF#eQfP*jZqF1`+31Q@yjn+E)vbIkPK?o8w_&tCtGb_KpB9~Eyp!&=YJx9# zd|8U(+dANPYCQjFmPFm!M{;pBCBg1>_vO&Vbw#XnzWLSCj-=N`{_X{TduQDYO|8hr zMdWRVO-s+5K>twG!DUOC*z|fAmdeaqVM~~X0LXM z$sq9XO$Ik#ynA_5q0oqv558c50(x0_-3()!q&$A_fvD)A}P> znRcwG3AYLHSZQJ_H(9x7IB|$(S6dIr5r4wqcVF+ZFJR`(=jSl_&MCU=*8;A%U*9a# z$?JVzUA%Q>``Jle?*{;UEc)b5MuX94xrXsa$*jzIym)`VL&BW9Hl%GIl%SKQrr|ti z<5oLU90&Rq$*IdnmF9VQb`b0kCBC+A{*vDac~Qcws&jJLK{+4#Yl6XVlz|FB~#^ijvmlBc66$6T$wff6i-YezMmCP z$j5%(1-qPO^}QN5iGI?JJbVDm1mC=HxIC`yt*)Ot9@8zcj~4%?<~5d6VWZl4X8v7t z*{&L|5>fqYx5y5nVl5Z9j1a7x0zG{POf1ujA;7J=B6qp?Q#$(vftCjw+k*G-)u2+S zD{cpEzWnC$HSusH9RzMokHq&9rlDaI@%uzp73bMA;ne5Qu~Nz#G1tA`8Mokhtu$D6 zk?0l#PV1q=p6g6)3!KJ>V99hLBVY5He>5nD7^(4jL-N^Y>xo`2cKaCx z2W2$L{2fVgsQLA#7wi2H!s*tWdxv%J8U1`~U!$9w#NnPZG7l6S_0f|FmN3@%eaY&;VF*LhRV6FBE06u{?_)7Wb` zIuH{`o?GO{ZUm3sg}rpLCbQ z1N^kLYJ0!&W@bbUf}Mm6Zmaj~(#Yc^&_kNk)RU$Q`f-Vt`?O)#_|2t5K!m(s(-d{r zDRq%lXY~26Vbv^2T4}9a;LpE?IEK))G2l9!5%S%PGE>7+?FBc*^G+-dhV~O za$8gXo@XeP&Aei()PO(flu56k^Y(BqQ`+{z4EpuLQl9sB%|fHGfA|uDyCUvS4**EmW%rQH!QY@k&}&?cB1i1|u-EI=$U>iQjse*Ly-YV| zi#OWC#O?h7g!LU>+}k;s>|pY*r2R~uu+1mpfnR4Wo)rpt)y+xwd=g+FY~S1M5U7nU zPtx-GjLAMRCTIGDtH&LI#aWD5VSG{Tf2k0C9HHe;v^yywylEVH&TRHfsjAq2Z-R7~ z&8UWtknAv_TI`UhW9DT>!nK=?cC)Ff{x-&~`M|Hc(zgxYSXeVFp>JYyH;5Eg`pAF% zrM}O${E>BabYXQ)-op*5ioqp9LgD~my*L8$W{!^@x=j|difw<^Gff&eW9Hp4r!Gh|EQrDAnhy}yZZRl1R|f7)}+6O(8>QwIu; zQc7AMf@WKYx`YTeKQP&*^Ne}*3F_U+8H4KC%b8WB6#wRqO5l2RfD0iPWLxiRX4A(% zL$KHaXt|(BhwJDsYQQFH?@id20RnXFLfdC)fI;U-C4cYWFklJplOCU1trnJ(f2kwnk13CaEUQiV}Q+ zvOcu0UUFSSZ(@|rcrU^Y(=PlEi2WpMD4E8(`7Dx0^xlY7bowWCZJ$f%r&K97FUF!% zywNFRFW36lz3=}SUf&qvS4CqB+eVSo8O?_J{8i9K_)8H`QbWJdyX&5tKKyb zoq=P(Am?k%Ajvpt8sxw{F|q;#4mWUdtDa#j2AM?9$VWG}ZK7ny$KD$?j}HgKUol=w zJOC2V%LN7>XTR8X+1DCtv#dO|^hiy@ml}M7$fbvTeTyO5mFhLLwF%J%6&1EudHapO zDO7ZqxYm_09ps&#pY7(E80oq*e*iqrK*YCT-cRF3(gMR=6FUSl;V2dtPw}WXb+iz5u($wK(cJ2zuG{33mPG! zWh4zNZv{Q<*^EstW>(d=udr|BfENJH;Hv*I`ul%$U3xXfnRA)7xH|-rn^7xC3~H** z$i+ZG_)~)CLucfq75g&OpA@|IPQ`I86+EP~vxN}q#hhexu|=8&%v=Db)s(Sp>Jqb* zd*&mmN?ypH-ig~e92*F}xfmb2qPUNaiWaWQqtXr66#?w_=&cd?^v_}3($uv({LKh6 zyYr!IA-4@XHfBK)QdPWMl@+YZX*W_(?`-@w;h)k4A=oiNQh}UKx7kKQF^>_51cYE? z{WD$=oHG7jNiw-{Drdf7J<@J4kr7-Ng7HS9`mAv0>kW9BKiD|C3T>)CsCJ+v;=jLC2dbVamJKxZx^@@Jda ze{XrSg>^d)<)p_wE~7DI>5EDpdgFaZA@F;g8%2w-;>}y~E+d3%ni`~<6*yW5Dtb~b zpJJt4kH#SH3o5s1xzrful@4$*6I(VO$dCNTY)?RM=hcbU=tWKmqzX%{h%u9WK$VT2 z2Usa!sy3-0bspMA`J6{>xJ+a+#l|~8*>0w~D>i@Vh8yqh_hPf#y|K2DVjBWJAUkpZ zCQGEyu4&;m>~zBYdSv3-={S8cgI_t+ZQd&VvQVU>3>=@ey6K*K!3Zj8>>10c{6!lc zPiXU#3D%yJ)kRuDCvaZq*u)zuQ-7IWe0=q#)ub~H7{3GXL9TGQ2`!+52gwG$>`C3nz6O_p-@#2I zB@J?YX+q$H=&(0~+B1nyBWj-*cEQ;&;V-VZORIla$=xipB=RBXLK*x}rgBK;K|87D zJ#i;reW`Ye&FY%nh0^fhv6Mam-FfXxOI}Es7S(K#xrd*)-wumg$6@NFBu_hk;|RL6 zVqc^-N)+x-nv@SK2Dp4H_!do#ffOd&Rx{bn4H}g=1+Ty&nr&ktsHQiS3svdxmbdL_$D{{9yw6(EP|ay4{Y-Flrm{L^|1!I=2&4=pOq!1 z^Qmv_UM#0UXLo;Fh&g><#w8o=aeDfOG>zRjGK1DyLN}s~kz$E}yZ*D$b*jkFeOQPk z$+N|f#3y$#gyC6T=Uy(mMa!iW+X3N9khfIc?k7oHG<2h>+saY14}jmg@@lgTCzqvS zHoG|MKXvM87;T^uZlTNx^uq%c-`F30`Wh!DN;?D7)7lAF;7;r&x0X((?QIl!qslh# zF%{pGRc#1+XPmpsRm#(MI9yaG<)UjFMZe#qOg@?CbES1m@=)6`5;5md;l#mP(8L8M z5PsD+qyJ{VEK^BEuamB=l`Vo=-A`8=$XDJg*VL5R!=BH?6I<!{gFnd5FaW&a;|SZa;Hs}r zDF_3}izEHhWRQxjlrJHSpDLS$%Yqx3LxuB4NNkN2)q0M<-$m7xIuwWSl9hH z8I09SAd$oylt2_((rGMW125aXP0q3-nl;f4S(&Lzi)0i3mimvk^UCv+sMU4!oWs^R zw8P^PbTZZKE3qzoJ@ry9wX^I|M9oOcg{i-(H}MhKl`4<3{-_D>`mhf~?>SR}Dfc3+ z2YoY6N}rKxi7M|!?XRUv#4pLAx{P;s@N{$vCtG2u`?vvqr-ggpEe?W6L%#0 z>S?#wb>>Lg29Wak)Qg^V$lbiw17QDAHCHNUyXVV%4j)3vZ3su%Rm==^x9X8qSzu6s zkK<$BWMI&E+f?h^omb3#cqEkEs9&7Oj9oROu0XE?+Fx@A>&-Mkk`bM*mWq62|7d)FSKLS<jtmV8+F|gmrG1Kep-H6O6Vp;^l^@+ z*DSL53P2aMf=LIxSfIubmYaW+*kpJ{^xV(kB$*7DZw~Q4eo7C3dXpU}>krX=iDTA# z65~o%VP=~6D+mXk21<6XrF*a;{I|6=K16ag@J&V7RU^H6HS1}e{ws%SKI%23|E)c~ zisLfp2$UM#NIjHxEOd6C#^&{^&r*VVtR{Nre&tjK>8-OPd^ej`Q_N0t%3d6CHh#%l zK`@apUpHW&@F@}g8I&8!sEPTnV3eq>F}F-kE}Marf$<3TWc5z4i8JxvBG{lUtG0v5J`ZqVZB69^mkN*yqJTxl;o2mKtSN`tjl9)) zHB<85=wo4?&dOk2d^p90?Wl4`#%;;L{55a5WXO&Jy03K ziytCd9$RRO19b80{Q>Za!%{P(n1tM_QB1evzg~ypdJ{@q(NU?jP&1LUy2U*mNhFKU z2ahVeY6-mc0a`uXNBC50&)^ztQQ+hs}pc;&2A6()}c>U=u}U>W8ri}pN{F1=d&jmKzB7} zCIC1PS#S+@{Z#$wc*!m#4ehEFgJ0GbP~VG6i>^L$>woRBHcR z292=!YNgGFQKLv6RZWG8m6hco`*L6vB>)X92dL?E_AR&u; zi;c;!8VAQ80jj(t`u(3Nal_vyWVL&|4?&=kWR1p(?EyVv!dC}G9p2V}*)Q=w^VS-6 zgjhWTTxRa|p%=JDT_H~!IYy0ropweS#VmslxO#}^+%H~}_gUfWPhItlqxM|H$~A7X@mpI zP7V3Ar1;P|B_pK|Yn@)H(QvswV?EcNM*m53eB7Fwxy|j)c={?@ypG36Ys~Aal*{7x z*4OkkjFq(v?~C?ZDbg_ME=bh-n4gs&{(Mp+@%mt-LxZ_$A+8aJeY}B9&JMRfqMXM1 zd+(i*#zk0ajo{uUdQGCFqB8RRXoYLP%U!PsZ`KGu+ahu3T^=9&hAQq$RKTnkDy3*f zG(N=Y^+w^N0x!i#j?FXjU^VTc^+)TD<6g**(HaP`7hO*``?{I(FL5Pd&dc3%>Gn-b zM+0BSHkZ6Z_3DT{^W#8XXx=hxXIucDMH61`l%1icdz%?Q#p692-PnNP+z7n?D>zSM zvnMZC#YD~}VI}5@l%ExeVqi$>-r0DBS`SnlhXF9Td>Q@Z5GLw0z4X+YcWShpPz zoxyDN)O=5&2IEDyw>M>AZ$47+mtPBzHM^}xgqs2Gx?RmljE!dFNQ%)2C2~I1@tK=* zaKPBM?wcTHtGtw)u@-1=wj^ch)P@X(5v%uDKL9vW)2u~rThol1e(BxY$z2*Y-X*tO zR+-gKJ5PCz&cb2QKi|YSNp-X047e@;Y9-n{N?%q957f#-x<|8-Q-w!yl~H5CVpZ>st8oogf~PV*G}*qJb{!<{lcW(i%$^_XTS-EZDjqO)$3^q;k} zdHS10B0z++!6?MHgWRunyJoZwcP+=fzD?H4o=`q_%L(e{Pf0S5Ga;z#PKL8{WHo-b0lw}vVs(j2? z601C7op!ku6!)y{sA=cXo^7?A$%PWWd=9Sb4`L4hL?pyygRt+Wn#I0IhnjGP;VQ~^ z|6CJJ&&SG9izWS>A&sqwJjvB?TA*_>#o=H)078y8xKJC_v zM~G`@a9BZf+?A01Z4|E^F{BTw6;!JZ(x)rzjbHl@mpNbgHkAqqHn&W}iUPLF&bLeL z3gL_qt7i5@Nmn5YZFc*~umWr#>29Nn-n%)IMq}tNtl2UGXADSpBC%sFv2$vT(ntwD z9Lx1JP>HCF=^JWFf@W(Kh*X4sx|FCebpWio)UJRHNAnlhjg&5r0|tM4jH@3yf2FY& z_?3q5+#FCF^#GtT_CJwt?6}P@IcBXbJE0zyPlm;&=5Ga^U68{e)unysB@8<2xy_L{h9T?6-d$nf)L02Oss6hhdJ%drv zu#`~Jd2cD?niUllf+qeq6UEL{I&>Nzwvt>Iu-n zoR6gz?Ea#x>Si^Nyq4CQ4YwQORx$R9h3=K)oqKd;8bO>d4V@z80eNe{J)uo_bJ=

      Nxm4O>8mkPd|1qhD$dgmZ5+N#Q-cKs9C4B&x`x) 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 @@ -50,7 +49,7 @@ Given a list of points `[x, y, f(x, y)]` where `f(x, y)` is a mathematics functi function_grapher(points, thickness); -![function_grapher](images/lib2x-function_grapher-2.JPG) +![function_grapher](images/lib3x-function_grapher-2.JPG) use ; @@ -76,31 +75,4 @@ Given a list of points `[x, y, f(x, y)]` where `f(x, y)` is a mathematics functi function_grapher(points, thickness, style); -![function_grapher](images/lib2x-function_grapher-3.JPG) - - use ; - - function f(x, y) = - 30 * ( - cos(sqrt(pow(x, 2) + pow(y, 2))) + - cos(3 * sqrt(pow(x, 2) + pow(y, 2))) - ); - - thickness = 2; - min_value = -200; - max_value = 200; - resolution = 10; - style = "LINES"; - slicing = "BACK_SLASH"; - - points = [ - for(y = [min_value:resolution:max_value]) - [ - for(x = [min_value:resolution:max_value]) - [x, y, f(x, y)] - ] - ]; - - function_grapher(points, thickness, style, slicing); - -![function_grapher](images/lib2x-function_grapher-4.JPG) \ No newline at end of file +![function_grapher](images/lib3x-function_grapher-3.JPG) \ No newline at end of file From 050acfd524dac2e750de4a589167c9320c57e713 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Tue, 9 Feb 2021 15:42:16 +0800 Subject: [PATCH 44/99] update --- README.md | 2 +- src/experimental/note.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ef90240e..dcf06600 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp ### 3D Module - [crystal_ball](https://openhome.cc/eGossip/OpenSCAD/lib2x-crystal_ball.html) -- [function_grapher](https://openhome.cc/eGossip/OpenSCAD/lib2x-function_grapher.html) +- [function_grapher](https://openhome.cc/eGossip/OpenSCAD/lib3x-function_grapher.html) - [hull_polyline3d](https://openhome.cc/eGossip/OpenSCAD/lib2x-hull_polyline3d.html) - [line3d](https://openhome.cc/eGossip/OpenSCAD/lib2x-line3d.html) - [loft](https://openhome.cc/eGossip/OpenSCAD/lib2x-loft.html) diff --git a/src/experimental/note.md b/src/experimental/note.md index f7267c54..a447b08e 100644 --- a/src/experimental/note.md +++ b/src/experimental/note.md @@ -4,6 +4,7 @@ to_do: dotSCAD 3.0 Dev +- `function_grapher`: delete `slicing` parameter. Improve `"LINES"`、`"HULL_LINES"` performance. - `util/sort`: `by` accepts a function literal. - `util/bsearch`: only supports `sorted` and `target` parameters. I view it as a new function. - `util/dedup`: add the `eq` parameter. From c12666f048774e143fd26f77f529e2efd267be12 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Wed, 10 Feb 2021 07:44:31 +0800 Subject: [PATCH 45/99] refactor --- src/function_grapher.scad | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/function_grapher.scad b/src/function_grapher.scad index 0afdcc12..7a82b2bd 100644 --- a/src/function_grapher.scad +++ b/src/function_grapher.scad @@ -192,19 +192,19 @@ module function_grapher(points, thickness, style = "FACES") { if(style == "LINES") { section = shape_circle(radius = half_thickness); for(row = points) { - path_extrude(section, row, method = "AXIS_ANGLE"); + path_extrude(section, row); } for(x = [0:columns - 1]) { - path_extrude(section, [for(y = [0:rows - 1]) points[y][x]], method = "AXIS_ANGLE"); + path_extrude(section, [for(y = [0:rows - 1]) points[y][x]]); } for(c = [0:columns - 2]) { - path_extrude(section, [for(r = [0:rows - 1 - c]) points[r + c][r]], method = "AXIS_ANGLE"); + path_extrude(section, [for(r = [0:rows - 1 - c]) points[r + c][r]]); } for(c = [0:columns - 2]) { - path_extrude(section, [for(r = [0:rows - 1 - c]) points[r][r + c]], method = "AXIS_ANGLE"); + path_extrude(section, [for(r = [0:rows - 1 - c]) points[r][r + c]]); } } else { From c9476d6fa61141833225275f8203b2c2acb5b1bd Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Wed, 10 Feb 2021 08:34:01 +0800 Subject: [PATCH 46/99] rename params --- src/util/_impl/_every.scad | 4 ++-- src/util/_impl/_some.scad | 4 ++-- src/util/every.scad | 2 +- src/util/some.scad | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/util/_impl/_every.scad b/src/util/_impl/_every.scad index af70ca2b..8fbfa2c4 100644 --- a/src/util/_impl/_every.scad +++ b/src/util/_impl/_every.scad @@ -1,3 +1,3 @@ -function _every(lt, assert_func, leng, i = 0) = +function _every(lt, test, leng, i = 0) = i == leng ? true : - assert_func(lt[i]) ? _every(lt, assert_func, leng, i + 1) : false; \ No newline at end of file + test(lt[i]) ? _every(lt, test, leng, i + 1) : false; \ No newline at end of file diff --git a/src/util/_impl/_some.scad b/src/util/_impl/_some.scad index 390f1108..ae7e606c 100644 --- a/src/util/_impl/_some.scad +++ b/src/util/_impl/_some.scad @@ -1,3 +1,3 @@ -function _some(lt, assert_func, leng, i = 0) = +function _some(lt, test, leng, i = 0) = i == leng ? false : - assert_func(lt[i]) ? true : _some(lt, assert_func, leng, i + 1); \ No newline at end of file + test(lt[i]) ? true : _some(lt, test, leng, i + 1); \ No newline at end of file diff --git a/src/util/every.scad b/src/util/every.scad index c01a527a..73009fe2 100644 --- a/src/util/every.scad +++ b/src/util/every.scad @@ -1,3 +1,3 @@ use <_impl/_every.scad>; -function every(lt, assert_func) = _every(lt, assert_func, len(lt)); \ No newline at end of file +function every(lt, test) = _every(lt, test, len(lt)); \ No newline at end of file diff --git a/src/util/some.scad b/src/util/some.scad index 34b4a49c..ecaf79e3 100644 --- a/src/util/some.scad +++ b/src/util/some.scad @@ -1,3 +1,3 @@ use <_impl/_some.scad>; -function some(lt, assert_func) = _some(lt, assert_func, len(lt)); \ No newline at end of file +function some(lt, test) = _some(lt, test, len(lt)); \ No newline at end of file From de300cc5abb8aae74fbba662250d1956e21de01c Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Wed, 10 Feb 2021 08:39:15 +0800 Subject: [PATCH 47/99] add every --- README.md | 1 + docs/lib3x-every.md | 17 +++++++++++++++++ src/util/every.scad | 10 ++++++++++ 3 files changed, 28 insertions(+) create mode 100644 docs/lib3x-every.md diff --git a/README.md b/README.md index dcf06600..aeb5d945 100644 --- a/README.md +++ b/README.md @@ -137,6 +137,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [util/bsearch](https://openhome.cc/eGossip/OpenSCAD/lib3x-bsearch.html) - [util/choose](https://openhome.cc/eGossip/OpenSCAD/lib3x-choose.html) - [util/dedup](https://openhome.cc/eGossip/OpenSCAD/lib3x-dedup.html) +- [util/every](https://openhome.cc/eGossip/OpenSCAD/lib3x-every.html) - [util/fibseq](https://openhome.cc/eGossip/OpenSCAD/lib3x-fibseq.html) - [util/flat](https://openhome.cc/eGossip/OpenSCAD/lib2x-flat.html) - [util/has](https://openhome.cc/eGossip/OpenSCAD/lib2x-has.html) diff --git a/docs/lib3x-every.md b/docs/lib3x-every.md new file mode 100644 index 00000000..2cf3748d --- /dev/null +++ b/docs/lib3x-every.md @@ -0,0 +1,17 @@ +# every + +The `every` function tests whether all elements in the list pass the test implemented by the provided function. + +**Since:** 3.0 + +## Parameters + +- `lt` : the list. +- `test` : a test function that accepts an element and returns `true` or `false`. + +## Examples + + use ; + + biggerThanZero = function(elem) elem > 0; + assert(every([1, 30, 39, 29, 10, 13], biggerThanZero)); \ No newline at end of file diff --git a/src/util/every.scad b/src/util/every.scad index 73009fe2..6dbae6c4 100644 --- a/src/util/every.scad +++ b/src/util/every.scad @@ -1,3 +1,13 @@ +/** +* every.scad +* +* @copyright Justin Lin, 2021 +* @license https://opensource.org/licenses/lgpl-3.0.html +* +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-dedup.html +* +**/ + use <_impl/_every.scad>; function every(lt, test) = _every(lt, test, len(lt)); \ No newline at end of file From cddfde26f4dff7114af8bbd80d6d22685f97d68c Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Wed, 10 Feb 2021 08:39:47 +0800 Subject: [PATCH 48/99] update comment --- src/util/every.scad | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/every.scad b/src/util/every.scad index 6dbae6c4..00765da2 100644 --- a/src/util/every.scad +++ b/src/util/every.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2021 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-dedup.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-every.html * **/ From 1767fc5ba8c47b0154cad43014ee223ebc8f7fab Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Wed, 10 Feb 2021 08:42:30 +0800 Subject: [PATCH 49/99] add some --- README.md | 1 + docs/lib3x-some.md | 17 +++++++++++++++++ src/util/some.scad | 10 ++++++++++ 3 files changed, 28 insertions(+) create mode 100644 docs/lib3x-some.md diff --git a/README.md b/README.md index aeb5d945..4ba83851 100644 --- a/README.md +++ b/README.md @@ -146,6 +146,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [util/rand](https://openhome.cc/eGossip/OpenSCAD/lib2x-rand.html) - [util/reverse](https://openhome.cc/eGossip/OpenSCAD/lib2x-reverse.html) - [util/slice](https://openhome.cc/eGossip/OpenSCAD/lib2x-slice.html) +- [util/some](https://openhome.cc/eGossip/OpenSCAD/lib3x-some.html) - [util/sort](https://openhome.cc/eGossip/OpenSCAD/lib3x-sort.html) - [util/sub_str](https://openhome.cc/eGossip/OpenSCAD/lib2x-sub_str.html) - [util/split_str](https://openhome.cc/eGossip/OpenSCAD/lib2x-split_str.html) diff --git a/docs/lib3x-some.md b/docs/lib3x-some.md new file mode 100644 index 00000000..f6d0b201 --- /dev/null +++ b/docs/lib3x-some.md @@ -0,0 +1,17 @@ +# some + +The `some` function tests whether at least one element in the list passes the test implemented by the provided function. + +**Since:** 3.0 + +## Parameters + +- `lt` : the list. +- `test` : a test function that accepts an element and returns `true` or `false`. + +## Examples + + use ; + + isOdd = function(elem) elem % 2 == 1; + assert(some([1, 30, 39, 29, 10, 13], isOdd)); \ No newline at end of file diff --git a/src/util/some.scad b/src/util/some.scad index ecaf79e3..57eeeb02 100644 --- a/src/util/some.scad +++ b/src/util/some.scad @@ -1,3 +1,13 @@ +/** +* some.scad +* +* @copyright Justin Lin, 2021 +* @license https://opensource.org/licenses/lgpl-3.0.html +* +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-some.html +* +**/ + use <_impl/_some.scad>; function some(lt, test) = _some(lt, test, len(lt)); \ No newline at end of file From c2c2bcaa93d3c83bafb55a049c256c32b6b3dff0 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Wed, 10 Feb 2021 14:47:27 +0800 Subject: [PATCH 50/99] delete `trianglate` --- README.md | 1 - docs/images/lib2x-triangulate-1.JPG | Bin 40481 -> 0 bytes docs/lib2x-triangulate.md | 41 ---------------------------- src/experimental/note.md | 3 +- 4 files changed, 2 insertions(+), 43 deletions(-) delete mode 100644 docs/images/lib2x-triangulate-1.JPG delete mode 100644 docs/lib2x-triangulate.md diff --git a/README.md b/README.md index 4ba83851..da9519fc 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,6 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [in_shape](https://openhome.cc/eGossip/OpenSCAD/lib2x-in_shape.html) - [lines_intersection](https://openhome.cc/eGossip/OpenSCAD/lib2x-lines_intersection.html) - [trim_shape](https://openhome.cc/eGossip/OpenSCAD/lib2x-trim_shape.html) -- [triangulate](https://openhome.cc/eGossip/OpenSCAD/lib2x-triangulate.html) ### 2D/3D Function - [bezier_surface](https://openhome.cc/eGossip/OpenSCAD/lib2x-bezier_surface.html) diff --git a/docs/images/lib2x-triangulate-1.JPG b/docs/images/lib2x-triangulate-1.JPG deleted file mode 100644 index b7d379b86a01eb28e4a28e59ef64eaa1f979ec38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40481 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 L{<6jVz5KrbR{ps@ diff --git a/docs/lib2x-triangulate.md b/docs/lib2x-triangulate.md deleted file mode 100644 index c1bf8c07..00000000 --- a/docs/lib2x-triangulate.md +++ /dev/null @@ -1,41 +0,0 @@ -# triangulate - -Given a 2D shape. This function performs a simple polygon triangulation algorithm and returns the indices of each triangle. - -**Since:** 1.3. - -## Parameters - -- `shape_pts` : The shape points. -- `epsilon` : An upper bound on the relative error due to rounding in floating point arithmetic. Default to 0.0001. - -## Examples - - use ; - - shape = [ - [0, 0], - [10, 0], - [12, 5], - [5, 10], - [10, 15], - [0, 20], - [-5, 18], - [-18, 3], - [-4, 10] - ]; - - tris = triangulate(shape); - - difference() { - polygon(shape); - - for(tri = tris) { - offset(-.2) - polygon([for(idx = tri) shape[idx]]); - - } - } - -![triangulate](images/lib2x-triangulate-1.JPG) - diff --git a/src/experimental/note.md b/src/experimental/note.md index a447b08e..8b7303c1 100644 --- a/src/experimental/note.md +++ b/src/experimental/note.md @@ -1,6 +1,6 @@ to_do: -- deprecate `trianglate`, use `tri_ear_clipping`. + dotSCAD 3.0 Dev @@ -19,3 +19,4 @@ New modules/functions - `util/every` - `util/some` +- delete `trianglate`, use `tri_ear_clipping`? From 3e940e3409be5aa6874ec4d4e27b4929b8c261db Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Wed, 10 Feb 2021 14:48:02 +0800 Subject: [PATCH 51/99] delete triangulate --- test/test_all.scad | 1 - test/test_triangulate.scad | 26 -------------------------- 2 files changed, 27 deletions(-) delete mode 100644 test/test_triangulate.scad diff --git a/test/test_all.scad b/test/test_all.scad index ad41d935..e5b62161 100644 --- a/test/test_all.scad +++ b/test/test_all.scad @@ -21,7 +21,6 @@ include ; include ; include ; include ; -include ; include ; include ; diff --git a/test/test_triangulate.scad b/test/test_triangulate.scad deleted file mode 100644 index b07d2b2c..00000000 --- a/test/test_triangulate.scad +++ /dev/null @@ -1,26 +0,0 @@ -use ; -use ; - -module test_triangulate() { - echo("==== test_triangulate ===="); - - - shape = [ - [0, 0], - [10, 0], - [12, 5], - [5, 10], - [10, 15], - [0, 20], - [-5, 18], - [-18, 3], - [-4, 10] - ]; - - expected = [[8, 0, 1], [1, 2, 3], [3, 4, 5], [5, 6, 7], [8, 1, 3], [5, 7, 8], [8, 3, 5]]; - actual = triangulate(shape); - - assertEqualPoints(expected, actual); -} - -test_triangulate(); \ No newline at end of file From 3c588db20d995157fdd841b4486771cc8d410e79 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Wed, 10 Feb 2021 14:50:05 +0800 Subject: [PATCH 52/99] delete triangulate --- src/_impl/_triangulate_impl.scad | 92 -------------------------------- 1 file changed, 92 deletions(-) delete mode 100644 src/_impl/_triangulate_impl.scad diff --git a/src/_impl/_triangulate_impl.scad b/src/_impl/_triangulate_impl.scad deleted file mode 100644 index 726e7df8..00000000 --- a/src/_impl/_triangulate_impl.scad +++ /dev/null @@ -1,92 +0,0 @@ -function _triangulate_in_triangle(p0, p1, p2, p) = - let( - v0 = p0 - p, - v1 = p1 - p, - v2 = p2 - p, - c0 = cross(v0, v1), - c1 = cross(v1, v2), - c2 = cross(v2, v0) - ) - (c0 > 0 && c1 > 0 && c2 > 0) || (c0 < 0 && c1 < 0 && c2 < 0); - -function _triangulate_snipable(shape_pts, u, v, w, n, indices, epsilon = 0.0001) = - let( - a = shape_pts[indices[u]], - b = shape_pts[indices[v]], - c = shape_pts[indices[w]], - ax = a[0], - ay = a[1], - bx = b[0], - by = b[1], - cx = c[0], - cy = c[1], - determinant = cross([bx - ax, by - ay], [cx - ax, cy - ay]) - ) - epsilon > determinant ? - false : _triangulate_snipable_sub(shape_pts, n, u, v, w, a, b, c, indices); - -function _triangulate_snipable_sub(shape_pts, n, u, v, w, a, b, c, indices, p = 0) = - p == n ? true : ( - ((p == u) || (p == v) || (p == w)) ? _triangulate_snipable_sub(shape_pts, n, u, v, w, a, b, c, indices, p + 1) : ( - _triangulate_in_triangle(a, b, c, shape_pts[indices[p]]) ? - false : _triangulate_snipable_sub(shape_pts, n, u, v, w, a, b, c, indices, p + 1) - ) - ); - -// remove the elem at idx v from indices -function _triangulate_remove_v(indices, v, num_of_vertices) = - let( - nv_minuns_one = num_of_vertices - 1 - ) - v == 0 ? [for(i = 1; i <= nv_minuns_one; i = i + 1) indices[i]] : ( - v == nv_minuns_one ? [for(i = 0; i < v; i = i + 1) indices[i]] : concat( - [for(i = 0; i < v; i = i + 1) indices[i]], - [for(i = v + 1; i <= nv_minuns_one; i = i + 1) indices[i]] - ) - ); - -function _triangulate_zero_or_value(num_of_vertices, value) = - num_of_vertices <= value ? 0 : value; - -function _triangulate_real_triangulate_sub(shape_pts, collector, indices, v, num_of_vertices, count, epsilon) = - let( - // idxes of three consecutive vertices - u = _triangulate_zero_or_value(num_of_vertices, v), - vi = _triangulate_zero_or_value(num_of_vertices, u + 1), - w = _triangulate_zero_or_value(num_of_vertices, vi + 1) - ) - _triangulate_snipable(shape_pts, u, vi, w, num_of_vertices, indices, epsilon) ? - _triangulate_snip(shape_pts, collector, indices, u, vi, w, num_of_vertices, count, epsilon) : - _triangulate_real_triangulate(shape_pts, collector, indices, vi, num_of_vertices, count, epsilon); - -function _triangulate_snip(shape_pts, collector, indices, u, v, w, num_of_vertices, count, epsilon) = - let( - a = indices[u], - b = indices[v], - c = indices[w], - new_nv = num_of_vertices - 1 - ) - _triangulate_real_triangulate( - shape_pts, - concat(collector, [[a, b, c]]), - _triangulate_remove_v(indices, v, num_of_vertices), - v, - new_nv, - 2 * new_nv, - epsilon - ); - -function _triangulate_real_triangulate(shape_pts, collector, indices, v, num_of_vertices, count, epsilon) = - count <= 0 ? [] : ( - num_of_vertices == 2 ? - collector : _triangulate_real_triangulate_sub(shape_pts, collector, indices, v, num_of_vertices, count - 1, epsilon) - ); - -function _triangulate_impl(shape_pts, epsilon) = - let( - num_of_vertices = len(shape_pts), - v = num_of_vertices - 1, - indices = [for(vi = 0; vi <= v; vi = vi + 1) vi], - count = 2 * num_of_vertices - ) - num_of_vertices < 3 ? [] : _triangulate_real_triangulate(shape_pts, [], indices, v, num_of_vertices, count, epsilon); \ No newline at end of file From 213d635f367f468034021a703b065428a324dcb8 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Wed, 10 Feb 2021 14:53:04 +0800 Subject: [PATCH 53/99] update --- README.md | 2 +- docs/{lib2x-flat.md => lib3x-flat.md} | 2 +- src/util/flat.scad | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename docs/{lib2x-flat.md => lib3x-flat.md} (87%) diff --git a/README.md b/README.md index da9519fc..ec12e1c2 100644 --- a/README.md +++ b/README.md @@ -138,7 +138,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [util/dedup](https://openhome.cc/eGossip/OpenSCAD/lib3x-dedup.html) - [util/every](https://openhome.cc/eGossip/OpenSCAD/lib3x-every.html) - [util/fibseq](https://openhome.cc/eGossip/OpenSCAD/lib3x-fibseq.html) -- [util/flat](https://openhome.cc/eGossip/OpenSCAD/lib2x-flat.html) +- [util/flat](https://openhome.cc/eGossip/OpenSCAD/lib3x-flat.html) - [util/has](https://openhome.cc/eGossip/OpenSCAD/lib2x-has.html) - [util/lerp](https://openhome.cc/eGossip/OpenSCAD/lib2x-lerp.html) - [util/parse_number](https://openhome.cc/eGossip/OpenSCAD/lib2x-parse_number.html) diff --git a/docs/lib2x-flat.md b/docs/lib3x-flat.md similarity index 87% rename from docs/lib2x-flat.md rename to docs/lib3x-flat.md index ee73ebf8..b42559c5 100644 --- a/docs/lib2x-flat.md +++ b/docs/lib3x-flat.md @@ -7,7 +7,7 @@ returns a new list with all sub-list elements concatenated into it recursively u ## Parameters - `lt` : The original list. -- `depth` : Defaults to 1. The depth level specifying how deep a nested list should be flattened. +- `depth` : Default to 1. The depth level specifying how deep a nested list should be flattened. ## Examples diff --git a/src/util/flat.scad b/src/util/flat.scad index eb8942a1..1a4bb7b2 100644 --- a/src/util/flat.scad +++ b/src/util/flat.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2020 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-flat.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-flat.html * **/ From ac452516e802099e5f4088388528db3fcbdb83df Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Wed, 10 Feb 2021 15:45:07 +0800 Subject: [PATCH 54/99] update to 3.0 --- README.md | 12 ++++++------ docs/{lib2x-has.md => lib3x-has.md} | 0 docs/{lib2x-lerp.md => lib3x-lerp.md} | 0 .../{lib2x-parse_number.md => lib3x-parse_number.md} | 4 ++-- docs/{lib2x-rand.md => lib3x-rand.md} | 0 docs/{lib2x-reverse.md => lib3x-reverse.md} | 2 +- docs/{lib2x-slice.md => lib3x-slice.md} | 4 ++-- src/util/has.scad | 2 +- src/util/lerp.scad | 7 ++----- src/util/parse_number.scad | 2 +- src/util/rand.scad | 2 +- src/util/reverse.scad | 2 +- src/util/slice.scad | 2 +- 13 files changed, 18 insertions(+), 21 deletions(-) rename docs/{lib2x-has.md => lib3x-has.md} (100%) rename docs/{lib2x-lerp.md => lib3x-lerp.md} (100%) rename docs/{lib2x-parse_number.md => lib3x-parse_number.md} (70%) rename docs/{lib2x-rand.md => lib3x-rand.md} (100%) rename docs/{lib2x-reverse.md => lib3x-reverse.md} (75%) rename docs/{lib2x-slice.md => lib3x-slice.md} (71%) diff --git a/README.md b/README.md index ec12e1c2..0d5e6dbe 100644 --- a/README.md +++ b/README.md @@ -139,12 +139,12 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [util/every](https://openhome.cc/eGossip/OpenSCAD/lib3x-every.html) - [util/fibseq](https://openhome.cc/eGossip/OpenSCAD/lib3x-fibseq.html) - [util/flat](https://openhome.cc/eGossip/OpenSCAD/lib3x-flat.html) -- [util/has](https://openhome.cc/eGossip/OpenSCAD/lib2x-has.html) -- [util/lerp](https://openhome.cc/eGossip/OpenSCAD/lib2x-lerp.html) -- [util/parse_number](https://openhome.cc/eGossip/OpenSCAD/lib2x-parse_number.html) -- [util/rand](https://openhome.cc/eGossip/OpenSCAD/lib2x-rand.html) -- [util/reverse](https://openhome.cc/eGossip/OpenSCAD/lib2x-reverse.html) -- [util/slice](https://openhome.cc/eGossip/OpenSCAD/lib2x-slice.html) +- [util/has](https://openhome.cc/eGossip/OpenSCAD/lib3x-has.html) +- [util/lerp](https://openhome.cc/eGossip/OpenSCAD/lib3x-lerp.html) +- [util/parse_number](https://openhome.cc/eGossip/OpenSCAD/lib3x-parse_number.html) +- [util/rand](https://openhome.cc/eGossip/OpenSCAD/lib3x-rand.html) +- [util/reverse](https://openhome.cc/eGossip/OpenSCAD/lib3x-reverse.html) +- [util/slice](https://openhome.cc/eGossip/OpenSCAD/lib3x-slice.html) - [util/some](https://openhome.cc/eGossip/OpenSCAD/lib3x-some.html) - [util/sort](https://openhome.cc/eGossip/OpenSCAD/lib3x-sort.html) - [util/sub_str](https://openhome.cc/eGossip/OpenSCAD/lib2x-sub_str.html) diff --git a/docs/lib2x-has.md b/docs/lib3x-has.md similarity index 100% rename from docs/lib2x-has.md rename to docs/lib3x-has.md diff --git a/docs/lib2x-lerp.md b/docs/lib3x-lerp.md similarity index 100% rename from docs/lib2x-lerp.md rename to docs/lib3x-lerp.md diff --git a/docs/lib2x-parse_number.md b/docs/lib3x-parse_number.md similarity index 70% rename from docs/lib2x-parse_number.md rename to docs/lib3x-parse_number.md index 3b7aaaf5..4ee66065 100644 --- a/docs/lib2x-parse_number.md +++ b/docs/lib3x-parse_number.md @@ -12,5 +12,5 @@ Parses the string argument as an number. use ; - echo(parse_number("10") + 1); // ECHO: 11 - echo(parse_number("-1.1") + 1); // ECHO: -0.1 + assert((parse_number("10") + 1) == 11); + assert((parse_number("-1.1") + 1) == -0.1); diff --git a/docs/lib2x-rand.md b/docs/lib3x-rand.md similarity index 100% rename from docs/lib2x-rand.md rename to docs/lib3x-rand.md diff --git a/docs/lib2x-reverse.md b/docs/lib3x-reverse.md similarity index 75% rename from docs/lib2x-reverse.md rename to docs/lib3x-reverse.md index 40206f55..3d2fac9b 100644 --- a/docs/lib2x-reverse.md +++ b/docs/lib3x-reverse.md @@ -12,5 +12,5 @@ Reverse a list. use ; - echo(reverse([1, 2, 3])); // ECHO: [3, 2, 1] + assert(reverse([1, 2, 3]) == [3, 2, 1]); diff --git a/docs/lib2x-slice.md b/docs/lib3x-slice.md similarity index 71% rename from docs/lib2x-slice.md rename to docs/lib3x-slice.md index a73e42c3..b6458034 100644 --- a/docs/lib2x-slice.md +++ b/docs/lib3x-slice.md @@ -14,5 +14,5 @@ Returns a list selected from `begin` to `end`, or to the `end` of the list (`end use ; - echo(slice([for(c = "helloworld") c], 0, 5)); // ECHO: ["h", "e", "l", "l", "o"] - echo(slice([for(c = "helloworld") c], 5)); // ECHO: ["w", "o", "r", "l", "d"] + assert(slice([for(c = "helloworld") c], 0, 5) == ["h", "e", "l", "l", "o"]); + assert(slice([for(c = "helloworld") c], 5) == ["w", "o", "r", "l", "d"]); diff --git a/src/util/has.scad b/src/util/has.scad index 00781e23..c0326fda 100644 --- a/src/util/has.scad +++ b/src/util/has.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2020 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-has.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-has.html * **/ diff --git a/src/util/lerp.scad b/src/util/lerp.scad index e1fe65be..4eb2127b 100644 --- a/src/util/lerp.scad +++ b/src/util/lerp.scad @@ -4,13 +4,10 @@ * @copyright Justin Lin, 2020 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-lerp.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-lerp.html * **/ function lerp(v1, v2, amt) = - let( - v = v2 - v1, - leng = len(v1) - ) + let(v = v2 - v1, leng = len(v1)) [for(i = 0; i < leng; i = i + 1) v1[i] + v[i] * amt]; \ No newline at end of file diff --git a/src/util/parse_number.scad b/src/util/parse_number.scad index 868f8e76..beb45ae6 100644 --- a/src/util/parse_number.scad +++ b/src/util/parse_number.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2017 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-parse_number.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-parse_number.html * **/ diff --git a/src/util/rand.scad b/src/util/rand.scad index 1b7286fe..f21b7656 100644 --- a/src/util/rand.scad +++ b/src/util/rand.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2019 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-rand.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-rand.html * **/ diff --git a/src/util/reverse.scad b/src/util/reverse.scad index 1826ae51..e18be2e0 100644 --- a/src/util/reverse.scad +++ b/src/util/reverse.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2019 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-reverse.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-reverse.html * **/ diff --git a/src/util/slice.scad b/src/util/slice.scad index dfbe749a..7a296ba9 100644 --- a/src/util/slice.scad +++ b/src/util/slice.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2019 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-slice.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-slice.html * **/ From 780c536da9b94fd87b87d16ce0d25f3eb4b91c1f Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Wed, 10 Feb 2021 15:59:03 +0800 Subject: [PATCH 55/99] update to 3.0 --- README.md | 4 ++-- docs/{lib2x-split_str.md => lib3x-split_str.md} | 2 +- docs/{lib2x-sub_str.md => lib3x-sub_str.md} | 4 ++-- src/util/split_str.scad | 2 +- src/util/sub_str.scad | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) rename docs/{lib2x-split_str.md => lib3x-split_str.md} (78%) rename docs/{lib2x-sub_str.md => lib3x-sub_str.md} (80%) diff --git a/README.md b/README.md index 0d5e6dbe..ca6ec904 100644 --- a/README.md +++ b/README.md @@ -147,8 +147,8 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [util/slice](https://openhome.cc/eGossip/OpenSCAD/lib3x-slice.html) - [util/some](https://openhome.cc/eGossip/OpenSCAD/lib3x-some.html) - [util/sort](https://openhome.cc/eGossip/OpenSCAD/lib3x-sort.html) -- [util/sub_str](https://openhome.cc/eGossip/OpenSCAD/lib2x-sub_str.html) -- [util/split_str](https://openhome.cc/eGossip/OpenSCAD/lib2x-split_str.html) +- [util/sub_str](https://openhome.cc/eGossip/OpenSCAD/lib3x-sub_str.html) +- [util/split_str](https://openhome.cc/eGossip/OpenSCAD/lib3x-split_str.html) - [util/sum](https://openhome.cc/eGossip/OpenSCAD/lib2x-sum.html) - [util/zip](https://openhome.cc/eGossip/OpenSCAD/lib2x-zip.html) diff --git a/docs/lib2x-split_str.md b/docs/lib3x-split_str.md similarity index 78% rename from docs/lib2x-split_str.md rename to docs/lib3x-split_str.md index e9d9073e..6768a15e 100644 --- a/docs/lib2x-split_str.md +++ b/docs/lib3x-split_str.md @@ -13,5 +13,5 @@ Splits the given string around matches of the given delimiting character. use ; - echo(split_str("hello,world", ",")); // ECHO: ["hello", "world"] + assert(split_str("hello,world", ",") == ["hello", "world"]); diff --git a/docs/lib2x-sub_str.md b/docs/lib3x-sub_str.md similarity index 80% rename from docs/lib2x-sub_str.md rename to docs/lib3x-sub_str.md index c7b95f3a..8caac44e 100644 --- a/docs/lib2x-sub_str.md +++ b/docs/lib3x-sub_str.md @@ -14,5 +14,5 @@ Returns the part of the string from `begin` to `end`, or to the `end` of the str use ; - echo(sub_str("helloworld", 0, 5)); // ECHO: "hello" - echo(sub_str("helloworld", 5)); // ECHO: "world" + assert(sub_str("helloworld", 0, 5) == "hello"); + assert(sub_str("helloworld", 5) == "world"); \ No newline at end of file diff --git a/src/util/split_str.scad b/src/util/split_str.scad index d785159b..5fec1e1d 100644 --- a/src/util/split_str.scad +++ b/src/util/split_str.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2017 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-split_str.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-split_str.html * **/ diff --git a/src/util/sub_str.scad b/src/util/sub_str.scad index 92d87a41..3d93070d 100644 --- a/src/util/sub_str.scad +++ b/src/util/sub_str.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2017 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-sub_str.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-sub_str.html * **/ From bb54168fa5f7ad6b63ebc634262cce4321097e93 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Wed, 10 Feb 2021 16:03:38 +0800 Subject: [PATCH 56/99] delete triangulate --- src/triangulate.scad | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 src/triangulate.scad diff --git a/src/triangulate.scad b/src/triangulate.scad deleted file mode 100644 index 0c2df8a5..00000000 --- a/src/triangulate.scad +++ /dev/null @@ -1,13 +0,0 @@ -/** -* triangulate.scad -* -* @copyright Justin Lin, 2019 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-triangulate.html -* -**/ - -use <_impl/_triangulate_impl.scad>; - -function triangulate(shape_pts, epsilon = 0.0001) = _triangulate_impl(shape_pts, epsilon); \ No newline at end of file From 6331738081d582f012ce828914db9a28a915cd63 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Wed, 10 Feb 2021 16:16:27 +0800 Subject: [PATCH 57/99] delete m_cumulate --- README.md | 1 - docs/lib2x-m_cumulate.md | 32 -------------------------- src/matrix/_impl/_m_cumulate_impl.scad | 8 ------- src/matrix/m_cumulate.scad | 14 ----------- 4 files changed, 55 deletions(-) delete mode 100644 docs/lib2x-m_cumulate.md delete mode 100644 src/matrix/_impl/_m_cumulate_impl.scad delete mode 100644 src/matrix/m_cumulate.scad diff --git a/README.md b/README.md index ca6ec904..a644d389 100644 --- a/README.md +++ b/README.md @@ -153,7 +153,6 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [util/zip](https://openhome.cc/eGossip/OpenSCAD/lib2x-zip.html) ### Matrix -- [matrix/m_cumulate](https://openhome.cc/eGossip/OpenSCAD/lib2x-m_cumulate.html) - [matrix/m_determinant](https://openhome.cc/eGossip/OpenSCAD/lib2x-m_determinant.html) - [matrix/m_mirror](https://openhome.cc/eGossip/OpenSCAD/lib2x-m_mirror.html) - [matrix/m_rotation](https://openhome.cc/eGossip/OpenSCAD/lib2x-m_rotation.html) diff --git a/docs/lib2x-m_cumulate.md b/docs/lib2x-m_cumulate.md deleted file mode 100644 index ac5f6e12..00000000 --- a/docs/lib2x-m_cumulate.md +++ /dev/null @@ -1,32 +0,0 @@ -# m_cumulate - -The power of using transformation matrice is that you can cumulate all transformations in a matrix. This function multipies all transformation matrice. - -**Since:** 1.1 - -## Parameters - -The dir changed since 2.0. - -- `matrice` : A list of 4x4 transformation matrice. - -## Examples - - use ; - use ; - use ; - use - - m = m_cumulate([ - m_translation([10, 20, 10]), m_scaling(2), m_rotation(60)] - ); - - multmatrix(m) - cube(1); - - multmatrix(m) - sphere(1); - - -![m_cumulate](images/lib2x-m_cumulate-1.JPG) - diff --git a/src/matrix/_impl/_m_cumulate_impl.scad b/src/matrix/_impl/_m_cumulate_impl.scad deleted file mode 100644 index 30736910..00000000 --- a/src/matrix/_impl/_m_cumulate_impl.scad +++ /dev/null @@ -1,8 +0,0 @@ -function _m_cumulate(matrice, i) = - i == len(matrice) - 2 ? - matrice[i] * matrice[i + 1] : - matrice[i] * _m_cumulate(matrice, i + 1); - -function _m_cumulate_impl(matrice) = - len(matrice) == 1 ? matrice[0] : _m_cumulate(matrice, 0); - \ No newline at end of file diff --git a/src/matrix/m_cumulate.scad b/src/matrix/m_cumulate.scad deleted file mode 100644 index a9cc23fb..00000000 --- a/src/matrix/m_cumulate.scad +++ /dev/null @@ -1,14 +0,0 @@ -/** -* m_cumulate.scad -* -* @copyright Justin Lin, 2019 -* @license https://opensource.org/licenses/lgpl-3.0.html -* -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-m_cumulate.html -* -**/ - -use <_impl/_m_cumulate_impl.scad>; - -function m_cumulate(matrice) = _m_cumulate_impl(matrice); - From 311cb70eec24f98f58c2f21d20ca6145ca5dee8a Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Wed, 10 Feb 2021 16:16:48 +0800 Subject: [PATCH 58/99] update --- src/experimental/note.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/experimental/note.md b/src/experimental/note.md index 8b7303c1..66be6bd2 100644 --- a/src/experimental/note.md +++ b/src/experimental/note.md @@ -19,4 +19,5 @@ New modules/functions - `util/every` - `util/some` +- delete `m_cumulate` - delete `trianglate`, use `tri_ear_clipping`? From ed5dc9dfd835bd1188bab5bb57ead4afe3c672cd Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Thu, 11 Feb 2021 11:23:16 +0800 Subject: [PATCH 59/99] update to 3.0 --- README.md | 2 +- docs/{lib2x-sum.md => lib3x-sum.md} | 0 src/util/sum.scad | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename docs/{lib2x-sum.md => lib3x-sum.md} (100%) diff --git a/README.md b/README.md index a644d389..41a28cda 100644 --- a/README.md +++ b/README.md @@ -149,7 +149,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [util/sort](https://openhome.cc/eGossip/OpenSCAD/lib3x-sort.html) - [util/sub_str](https://openhome.cc/eGossip/OpenSCAD/lib3x-sub_str.html) - [util/split_str](https://openhome.cc/eGossip/OpenSCAD/lib3x-split_str.html) -- [util/sum](https://openhome.cc/eGossip/OpenSCAD/lib2x-sum.html) +- [util/sum](https://openhome.cc/eGossip/OpenSCAD/lib3x-sum.html) - [util/zip](https://openhome.cc/eGossip/OpenSCAD/lib2x-zip.html) ### Matrix diff --git a/docs/lib2x-sum.md b/docs/lib3x-sum.md similarity index 100% rename from docs/lib2x-sum.md rename to docs/lib3x-sum.md diff --git a/src/util/sum.scad b/src/util/sum.scad index c2e5c1be..762afe92 100644 --- a/src/util/sum.scad +++ b/src/util/sum.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2020 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-sum.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-sum.html * **/ From 26330309ab2753f00cb7284a19c9c73e1e88ec4a Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Thu, 11 Feb 2021 11:29:16 +0800 Subject: [PATCH 60/99] add test --- test/test_all.scad | 1 + test/util/test_zip.scad | 13 +++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 test/util/test_zip.scad diff --git a/test/test_all.scad b/test/test_all.scad index e5b62161..208f33fd 100644 --- a/test/test_all.scad +++ b/test/test_all.scad @@ -69,6 +69,7 @@ include ; include ; include ; include ; +include ; // Voxel include ; diff --git a/test/util/test_zip.scad b/test/util/test_zip.scad new file mode 100644 index 00000000..1cb6da56 --- /dev/null +++ b/test/util/test_zip.scad @@ -0,0 +1,13 @@ +use ; + +module test_zip() { + echo("==== test_zip ===="); + + xs = [10, 20, 30]; + ys = [5, 15, 25]; + zs = [2.5, 7.5, 12.4]; + + assert(zip([xs, ys, zs]) == [[10, 5, 2.5], [20, 15, 7.5], [30, 25, 12.4]]); +} + +test_zip(); \ No newline at end of file From 1c23556ef45df23ad14a366ec723700aea78d361 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Thu, 11 Feb 2021 11:45:28 +0800 Subject: [PATCH 61/99] add zipper param --- src/util/_impl/_zip_impl.scad | 10 ++++++---- src/util/zip.scad | 4 ++-- test/util/test_zip.scad | 4 ++++ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/util/_impl/_zip_impl.scad b/src/util/_impl/_zip_impl.scad index fbcd5462..08504d21 100644 --- a/src/util/_impl/_zip_impl.scad +++ b/src/util/_impl/_zip_impl.scad @@ -1,5 +1,7 @@ -function _zipAll_sub(lists, list_to, elem_to, i = 0) = - i > elem_to ? [] : - concat([[for(j = [0:list_to]) lists[j][i]]], _zipAll_sub(lists, list_to, elem_to, i + 1)); +_identity = function(elems) elems; -function _zipAll(lists) = _zipAll_sub(lists, len(lists) - 1, len(lists[0]) - 1); \ No newline at end of file +function _zipAll_sub(lts, list_to, elem_to, zipper, i = 0) = + i > elem_to ? [] : + concat([zipper([for(j = [0:list_to]) lts[j][i]])], _zipAll_sub(lts, list_to, elem_to, zipper, i + 1)); + +function _zipAll(lts, zipper = _identity) = _zipAll_sub(lts, len(lts) - 1, len(lts[0]) - 1, zipper); \ No newline at end of file diff --git a/src/util/zip.scad b/src/util/zip.scad index a5255457..64ed2753 100644 --- a/src/util/zip.scad +++ b/src/util/zip.scad @@ -4,10 +4,10 @@ * @copyright Justin Lin, 2020 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-zip.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-zip.html * **/ use <_impl/_zip_impl.scad>; -function zip(lts) = _zipAll(lts); \ No newline at end of file +function zip(lts, zipper) = is_function(zipper) ? _zipAll(lts, zipper) : _zipAll(lts); \ No newline at end of file diff --git a/test/util/test_zip.scad b/test/util/test_zip.scad index 1cb6da56..0bb20b22 100644 --- a/test/util/test_zip.scad +++ b/test/util/test_zip.scad @@ -1,4 +1,5 @@ use ; +use ; module test_zip() { echo("==== test_zip ===="); @@ -8,6 +9,9 @@ module test_zip() { zs = [2.5, 7.5, 12.4]; assert(zip([xs, ys, zs]) == [[10, 5, 2.5], [20, 15, 7.5], [30, 25, 12.4]]); + + sum_up = function(elems) sum(elems); + assert(zip([xs, ys, zs], sum_up) == [17.5, 42.5, 67.4]); } test_zip(); \ No newline at end of file From e79231bdc76e69f7b79ccd8b9a6fe618d2e49dd6 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Thu, 11 Feb 2021 11:50:32 +0800 Subject: [PATCH 62/99] update to 3.0 --- README.md | 2 +- docs/{lib2x-zip.md => lib3x-zip.md} | 8 ++++++-- src/experimental/note.md | 1 + src/util/_impl/_zip_impl.scad | 6 +++--- src/util/zip.scad | 2 +- 5 files changed, 12 insertions(+), 7 deletions(-) rename docs/{lib2x-zip.md => lib3x-zip.md} (64%) diff --git a/README.md b/README.md index 41a28cda..b08b1973 100644 --- a/README.md +++ b/README.md @@ -150,7 +150,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [util/sub_str](https://openhome.cc/eGossip/OpenSCAD/lib3x-sub_str.html) - [util/split_str](https://openhome.cc/eGossip/OpenSCAD/lib3x-split_str.html) - [util/sum](https://openhome.cc/eGossip/OpenSCAD/lib3x-sum.html) -- [util/zip](https://openhome.cc/eGossip/OpenSCAD/lib2x-zip.html) +- [util/zip](https://openhome.cc/eGossip/OpenSCAD/lib3x-zip.html) ### Matrix - [matrix/m_determinant](https://openhome.cc/eGossip/OpenSCAD/lib2x-m_determinant.html) diff --git a/docs/lib2x-zip.md b/docs/lib3x-zip.md similarity index 64% rename from docs/lib2x-zip.md rename to docs/lib3x-zip.md index ac11c33f..782acea5 100644 --- a/docs/lib2x-zip.md +++ b/docs/lib3x-zip.md @@ -6,7 +6,8 @@ Make a list that aggregates elements from each of the lists. Returns a list of l ## Parameters -- `lts` : a list of lists. +- `lts` : A list of lists. +- `head` : Rather than listing the elements, the elements are combined using the function. **Since:** 3.0 ## Examples @@ -16,4 +17,7 @@ Make a list that aggregates elements from each of the lists. Returns a list of l ys = [5, 15, 25]; zs = [2.5, 7.5, 12.4]; - assert(zip([xs, ys, zs]) == [[10, 5, 2.5], [20, 15, 7.5], [30, 25, 12.4]]); \ No newline at end of file + assert(zip([xs, ys, zs]) == [[10, 5, 2.5], [20, 15, 7.5], [30, 25, 12.4]]); + + sum_up = function(elems) sum(elems); + assert(zip([xs, ys, zs], sum_up) == [17.5, 42.5, 67.4]); \ No newline at end of file diff --git a/src/experimental/note.md b/src/experimental/note.md index 66be6bd2..21d85406 100644 --- a/src/experimental/note.md +++ b/src/experimental/note.md @@ -8,6 +8,7 @@ dotSCAD 3.0 Dev - `util/sort`: `by` accepts a function literal. - `util/bsearch`: only supports `sorted` and `target` parameters. I view it as a new function. - `util/dedup`: add the `eq` parameter. +- `util/zip`: add the `head` parameter. New modules/functions diff --git a/src/util/_impl/_zip_impl.scad b/src/util/_impl/_zip_impl.scad index 08504d21..753f9f4c 100644 --- a/src/util/_impl/_zip_impl.scad +++ b/src/util/_impl/_zip_impl.scad @@ -1,7 +1,7 @@ _identity = function(elems) elems; -function _zipAll_sub(lts, list_to, elem_to, zipper, i = 0) = +function _zipAll_sub(lts, list_to, elem_to, head, i = 0) = i > elem_to ? [] : - concat([zipper([for(j = [0:list_to]) lts[j][i]])], _zipAll_sub(lts, list_to, elem_to, zipper, i + 1)); + concat([head([for(j = [0:list_to]) lts[j][i]])], _zipAll_sub(lts, list_to, elem_to, head, i + 1)); -function _zipAll(lts, zipper = _identity) = _zipAll_sub(lts, len(lts) - 1, len(lts[0]) - 1, zipper); \ No newline at end of file +function _zipAll(lts, head = _identity) = _zipAll_sub(lts, len(lts) - 1, len(lts[0]) - 1, head); \ No newline at end of file diff --git a/src/util/zip.scad b/src/util/zip.scad index 64ed2753..c91040ff 100644 --- a/src/util/zip.scad +++ b/src/util/zip.scad @@ -10,4 +10,4 @@ use <_impl/_zip_impl.scad>; -function zip(lts, zipper) = is_function(zipper) ? _zipAll(lts, zipper) : _zipAll(lts); \ No newline at end of file +function zip(lts, head) = is_function(head) ? _zipAll(lts, head) : _zipAll(lts); \ No newline at end of file From 66054ae60310e346be12836be235700457cf8f3e Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Thu, 11 Feb 2021 11:54:51 +0800 Subject: [PATCH 63/99] rename --- docs/lib3x-zip.md | 2 +- src/util/_impl/_zip_impl.scad | 6 +++--- src/util/zip.scad | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/lib3x-zip.md b/docs/lib3x-zip.md index 782acea5..39c0f496 100644 --- a/docs/lib3x-zip.md +++ b/docs/lib3x-zip.md @@ -7,7 +7,7 @@ Make a list that aggregates elements from each of the lists. Returns a list of l ## Parameters - `lts` : A list of lists. -- `head` : Rather than listing the elements, the elements are combined using the function. **Since:** 3.0 +- `slider` : Rather than listing the elements, the elements are combined using the function. **Since:** 3.0 ## Examples diff --git a/src/util/_impl/_zip_impl.scad b/src/util/_impl/_zip_impl.scad index 753f9f4c..28cbc88b 100644 --- a/src/util/_impl/_zip_impl.scad +++ b/src/util/_impl/_zip_impl.scad @@ -1,7 +1,7 @@ _identity = function(elems) elems; -function _zipAll_sub(lts, list_to, elem_to, head, i = 0) = +function _zipAll_sub(lts, list_to, elem_to, slider, i = 0) = i > elem_to ? [] : - concat([head([for(j = [0:list_to]) lts[j][i]])], _zipAll_sub(lts, list_to, elem_to, head, i + 1)); + concat([slider([for(j = [0:list_to]) lts[j][i]])], _zipAll_sub(lts, list_to, elem_to, slider, i + 1)); -function _zipAll(lts, head = _identity) = _zipAll_sub(lts, len(lts) - 1, len(lts[0]) - 1, head); \ No newline at end of file +function _zipAll(lts, slider = _identity) = _zipAll_sub(lts, len(lts) - 1, len(lts[0]) - 1, slider); \ No newline at end of file diff --git a/src/util/zip.scad b/src/util/zip.scad index c91040ff..2430151d 100644 --- a/src/util/zip.scad +++ b/src/util/zip.scad @@ -10,4 +10,4 @@ use <_impl/_zip_impl.scad>; -function zip(lts, head) = is_function(head) ? _zipAll(lts, head) : _zipAll(lts); \ No newline at end of file +function zip(lts, slider) = is_function(slider) ? _zipAll(lts, slider) : _zipAll(lts); \ No newline at end of file From cf359b04feb3379154bd10143c6b3f17718c01b7 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Thu, 11 Feb 2021 14:31:28 +0800 Subject: [PATCH 64/99] add angle_threshold param --- src/_impl/_bezier_smooth_impl.scad | 17 ++++++++++------- src/bezier_smooth.scad | 4 ++-- test/test_bezier_smooth.scad | 18 +++++++++++++++++- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/_impl/_bezier_smooth_impl.scad b/src/_impl/_bezier_smooth_impl.scad index 834477e3..b56572d2 100644 --- a/src/_impl/_bezier_smooth_impl.scad +++ b/src/_impl/_bezier_smooth_impl.scad @@ -2,6 +2,7 @@ use <../__comm__/__to3d.scad>; use <../__comm__/__to2d.scad>; use <../__comm__/__angy_angz.scad>; use <../bezier_curve.scad>; +use <../angle_between.scad>; function _corner_ctrl_pts(round_d, p1, p2, p3) = let( @@ -24,32 +25,34 @@ function _corner_ctrl_pts(round_d, p1, p2, p3) = p2 - [dx2, dy2, dz2] ]; - function _bezier_corner(round_d, t_step, p1, p2, p3) = bezier_curve(t_step, _corner_ctrl_pts(round_d, p1, p2, p3)); -function _recursive_bezier_smooth(pts, round_d, t_step, leng) = +function _recursive_bezier_smooth(pts, round_d, t_step, leng, angle_threshold) = let(end_i = leng - 2) [ for(i = 0; i < end_i; i = i + 1) - each _bezier_corner(round_d, t_step, pts[i], pts[i + 1], pts[i + 2]) + each + angle_between(pts[i] - pts[i + 1], pts[i + 1] - pts[i + 2]) > angle_threshold ? + _bezier_corner(round_d, t_step, pts[i], pts[i + 1], pts[i + 2]) : + [pts[i + 1]] ]; -function _bezier_smooth_impl(path_pts, round_d, t_step, closed) = +function _bezier_smooth_impl(path_pts, round_d, t_step, closed, angle_threshold) = let( pts = len(path_pts[0]) == 3 ? path_pts : [for(p = path_pts) __to3d(p)], leng = len(pts), - middle_pts = _recursive_bezier_smooth(pts, round_d, t_step, leng), + middle_pts = _recursive_bezier_smooth(pts, round_d, t_step, leng, angle_threshold), pth_pts = closed ? concat( _recursive_bezier_smooth( [pts[leng - 1], pts[0], pts[1]], - round_d, t_step, 3 + round_d, t_step, 3, angle_threshold ), middle_pts, _recursive_bezier_smooth( [pts[leng - 2], pts[leng - 1], pts[0]], - round_d, t_step, 3 + round_d, t_step, 3, angle_threshold ) ) : concat( diff --git a/src/bezier_smooth.scad b/src/bezier_smooth.scad index 9ea01a34..baba9243 100644 --- a/src/bezier_smooth.scad +++ b/src/bezier_smooth.scad @@ -10,5 +10,5 @@ use <_impl/_bezier_smooth_impl.scad>; -function bezier_smooth(path_pts, round_d, t_step = 0.1, closed = false) = - _bezier_smooth_impl(path_pts, round_d, t_step, closed); \ No newline at end of file +function bezier_smooth(path_pts, round_d, t_step = 0.1, closed = false, angle_threshold = 0) = + _bezier_smooth_impl(path_pts, round_d, t_step, closed, angle_threshold); \ No newline at end of file diff --git a/test/test_bezier_smooth.scad b/test/test_bezier_smooth.scad index f30cac66..83c2ad0c 100644 --- a/test/test_bezier_smooth.scad +++ b/test/test_bezier_smooth.scad @@ -39,5 +39,21 @@ module test_bezier_smooth_closed() { assertEqualPoints(expected, actual); } +module test_bezier_smooth_angle_threshold() { + echo("==== test_bezier_smooth_angle_threshold ===="); + + round_d = 15; + + path_pts = [ + [0, 0, 0], + [0, 40, 0], + [0, 60, 0], + [0, 70, 1] + ]; + + assert(path_pts == bezier_smooth(path_pts, round_d, angle_threshold = 15)); +} + test_bezier_smooth_no_closed(); -test_bezier_smooth_closed(); \ No newline at end of file +test_bezier_smooth_closed(); +test_bezier_smooth_angle_threshold(); \ No newline at end of file From 0836202e175ba93d69da35e1a066063e82667f72 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Thu, 11 Feb 2021 14:39:09 +0800 Subject: [PATCH 65/99] update to 3.0 --- README.md | 2 +- ...ezier_smooth-1.JPG => lib3x-bezier_smooth-1.JPG} | Bin ...ezier_smooth-2.JPG => lib3x-bezier_smooth-2.JPG} | Bin ...ib2x-bezier_smooth.md => lib3x-bezier_smooth.md} | 5 +++-- src/bezier_smooth.scad | 2 +- 5 files changed, 5 insertions(+), 4 deletions(-) rename docs/images/{lib2x-bezier_smooth-1.JPG => lib3x-bezier_smooth-1.JPG} (100%) rename docs/images/{lib2x-bezier_smooth-2.JPG => lib3x-bezier_smooth-2.JPG} (100%) rename docs/{lib2x-bezier_smooth.md => lib3x-bezier_smooth.md} (81%) diff --git a/README.md b/README.md index b08b1973..fec08799 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp ### 2D/3D Function - [bezier_surface](https://openhome.cc/eGossip/OpenSCAD/lib2x-bezier_surface.html) -- [bezier_smooth](https://openhome.cc/eGossip/OpenSCAD/lib2x-bezier_smooth.html) +- [bezier_smooth](https://openhome.cc/eGossip/OpenSCAD/lib3x-bezier_smooth.html) - [cross_sections](https://openhome.cc/eGossip/OpenSCAD/lib2x-cross_sections.html) - [in_polyline](https://openhome.cc/eGossip/OpenSCAD/lib2x-in_polyline.html) - [paths2sections](https://openhome.cc/eGossip/OpenSCAD/lib2x-paths2sections.html) diff --git a/docs/images/lib2x-bezier_smooth-1.JPG b/docs/images/lib3x-bezier_smooth-1.JPG similarity index 100% rename from docs/images/lib2x-bezier_smooth-1.JPG rename to docs/images/lib3x-bezier_smooth-1.JPG diff --git a/docs/images/lib2x-bezier_smooth-2.JPG b/docs/images/lib3x-bezier_smooth-2.JPG similarity index 100% rename from docs/images/lib2x-bezier_smooth-2.JPG rename to docs/images/lib3x-bezier_smooth-2.JPG diff --git a/docs/lib2x-bezier_smooth.md b/docs/lib3x-bezier_smooth.md similarity index 81% rename from docs/lib2x-bezier_smooth.md rename to docs/lib3x-bezier_smooth.md index 3484d9fa..a7cca394 100644 --- a/docs/lib2x-bezier_smooth.md +++ b/docs/lib3x-bezier_smooth.md @@ -8,6 +8,7 @@ Given a path, the `bezier_smooth` function uses bazier curves to smooth all corn - `round_d` : Used to create the other two control points at the corner. - `t_step` : The distance between two points of the Bézier path at the corner. It defaults to 0.1. - `closed` : It defaults to `false`. If you have a closed path, set it to `true`. +- `angle_threshold` : Default to 0. If the angle between two line segments is bigger than `angle_threshold`, smooth those two segments. **Since:** 3.0 ## Examples @@ -34,7 +35,7 @@ Given a path, the `bezier_smooth` function uses bazier curves to smooth all corn smoothed_path_pts, width ); -![bezier_smooth](images/lib2x-bezier_smooth-1.JPG) +![bezier_smooth](images/lib3x-bezier_smooth-1.JPG) use ; @@ -52,4 +53,4 @@ Given a path, the `bezier_smooth` function uses bazier curves to smooth all corn translate([50, 0, 0]) polygon(smoothed_path_pts); -![bezier_smooth](images/lib2x-bezier_smooth-2.JPG) \ No newline at end of file +![bezier_smooth](images/lib3x-bezier_smooth-2.JPG) \ No newline at end of file diff --git a/src/bezier_smooth.scad b/src/bezier_smooth.scad index baba9243..b9ebe3f0 100644 --- a/src/bezier_smooth.scad +++ b/src/bezier_smooth.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2017 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-bezier_curve.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-bezier_curve.html * **/ From 633a8fa5ef54138045db19e9d8a54eda7b962182 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Thu, 11 Feb 2021 15:50:35 +0800 Subject: [PATCH 66/99] delete a test --- test/test_all.scad | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/test_all.scad b/test/test_all.scad index 208f33fd..5f289e5f 100644 --- a/test/test_all.scad +++ b/test/test_all.scad @@ -78,6 +78,3 @@ include ; include ; include ; include ; - -// Matrix -include ; \ No newline at end of file From d007f09ac503c5dcbf5580e5fc6f89f9322e96bc Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Thu, 11 Feb 2021 15:53:25 +0800 Subject: [PATCH 67/99] refactor --- src/_impl/_bezier_smooth_impl.scad | 2 +- src/{ => util}/angle_between.scad | 0 src/{ => util}/degrees.scad | 0 src/{ => util}/polar_coordinate.scad | 2 +- src/{ => util}/radians.scad | 0 src/{ => util}/spherical_coordinate.scad | 0 6 files changed, 2 insertions(+), 2 deletions(-) rename src/{ => util}/angle_between.scad (100%) rename src/{ => util}/degrees.scad (100%) rename src/{ => util}/polar_coordinate.scad (71%) rename src/{ => util}/radians.scad (100%) rename src/{ => util}/spherical_coordinate.scad (100%) diff --git a/src/_impl/_bezier_smooth_impl.scad b/src/_impl/_bezier_smooth_impl.scad index b56572d2..8ff0c56f 100644 --- a/src/_impl/_bezier_smooth_impl.scad +++ b/src/_impl/_bezier_smooth_impl.scad @@ -2,7 +2,7 @@ use <../__comm__/__to3d.scad>; use <../__comm__/__to2d.scad>; use <../__comm__/__angy_angz.scad>; use <../bezier_curve.scad>; -use <../angle_between.scad>; +use <../util/angle_between.scad>; function _corner_ctrl_pts(round_d, p1, p2, p3) = let( diff --git a/src/angle_between.scad b/src/util/angle_between.scad similarity index 100% rename from src/angle_between.scad rename to src/util/angle_between.scad diff --git a/src/degrees.scad b/src/util/degrees.scad similarity index 100% rename from src/degrees.scad rename to src/util/degrees.scad diff --git a/src/polar_coordinate.scad b/src/util/polar_coordinate.scad similarity index 71% rename from src/polar_coordinate.scad rename to src/util/polar_coordinate.scad index 0b377a8b..56ea5335 100644 --- a/src/polar_coordinate.scad +++ b/src/util/polar_coordinate.scad @@ -1,3 +1,3 @@ -use <__comm__/__angy_angz.scad>; +use <../__comm__/__angy_angz.scad>; function polar_coordinate(point) = [norm(point), atan2(point[1], point[0])]; // r, theta \ No newline at end of file diff --git a/src/radians.scad b/src/util/radians.scad similarity index 100% rename from src/radians.scad rename to src/util/radians.scad diff --git a/src/spherical_coordinate.scad b/src/util/spherical_coordinate.scad similarity index 100% rename from src/spherical_coordinate.scad rename to src/util/spherical_coordinate.scad From b342fecb6f4d7ee6eeba2e671f017b099d1ad524 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Thu, 11 Feb 2021 15:55:41 +0800 Subject: [PATCH 68/99] update --- README.md | 11 ++++++++++- src/experimental/note.md | 10 +++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index fec08799..8386dc9b 100644 --- a/README.md +++ b/README.md @@ -131,22 +131,31 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [path_extrude](https://openhome.cc/eGossip/OpenSCAD/lib2x-path_extrude.html) - [ring_extrude](https://openhome.cc/eGossip/OpenSCAD/lib2x-ring_extrude.html) - [sphere_spiral_extrude](https://openhome.cc/eGossip/OpenSCAD/lib2x-sphere_spiral_extrude.html) - +- `util/degrees` +- `util/radians` +- `util/angle_between` +- `util/polar_coordinate` +- `util/spherical_coordinate` ### Util +- util/angle_between - [util/bsearch](https://openhome.cc/eGossip/OpenSCAD/lib3x-bsearch.html) - [util/choose](https://openhome.cc/eGossip/OpenSCAD/lib3x-choose.html) - [util/dedup](https://openhome.cc/eGossip/OpenSCAD/lib3x-dedup.html) +- util/degrees - [util/every](https://openhome.cc/eGossip/OpenSCAD/lib3x-every.html) - [util/fibseq](https://openhome.cc/eGossip/OpenSCAD/lib3x-fibseq.html) - [util/flat](https://openhome.cc/eGossip/OpenSCAD/lib3x-flat.html) - [util/has](https://openhome.cc/eGossip/OpenSCAD/lib3x-has.html) - [util/lerp](https://openhome.cc/eGossip/OpenSCAD/lib3x-lerp.html) - [util/parse_number](https://openhome.cc/eGossip/OpenSCAD/lib3x-parse_number.html) +- util/polar_coordinate +- util/radians - [util/rand](https://openhome.cc/eGossip/OpenSCAD/lib3x-rand.html) - [util/reverse](https://openhome.cc/eGossip/OpenSCAD/lib3x-reverse.html) - [util/slice](https://openhome.cc/eGossip/OpenSCAD/lib3x-slice.html) - [util/some](https://openhome.cc/eGossip/OpenSCAD/lib3x-some.html) - [util/sort](https://openhome.cc/eGossip/OpenSCAD/lib3x-sort.html) +- util/spherical_coordinate - [util/sub_str](https://openhome.cc/eGossip/OpenSCAD/lib3x-sub_str.html) - [util/split_str](https://openhome.cc/eGossip/OpenSCAD/lib3x-split_str.html) - [util/sum](https://openhome.cc/eGossip/OpenSCAD/lib3x-sum.html) diff --git a/src/experimental/note.md b/src/experimental/note.md index 21d85406..0b2cbde7 100644 --- a/src/experimental/note.md +++ b/src/experimental/note.md @@ -12,11 +12,11 @@ dotSCAD 3.0 Dev New modules/functions -- `degrees` -- `radians` -- `angle_between` -- `polar_coordinate` -- `spherical_coordinate` +- `util/degrees` +- `util/radians` +- `util/angle_between` +- `util/polar_coordinate` +- `util/spherical_coordinate` - `util/every` - `util/some` From 363833b74482a13c002a5313842139666200dd81 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Thu, 11 Feb 2021 15:56:38 +0800 Subject: [PATCH 69/99] update README --- README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/README.md b/README.md index 8386dc9b..8677043f 100644 --- a/README.md +++ b/README.md @@ -131,11 +131,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [path_extrude](https://openhome.cc/eGossip/OpenSCAD/lib2x-path_extrude.html) - [ring_extrude](https://openhome.cc/eGossip/OpenSCAD/lib2x-ring_extrude.html) - [sphere_spiral_extrude](https://openhome.cc/eGossip/OpenSCAD/lib2x-sphere_spiral_extrude.html) -- `util/degrees` -- `util/radians` -- `util/angle_between` -- `util/polar_coordinate` -- `util/spherical_coordinate` + ### Util - util/angle_between - [util/bsearch](https://openhome.cc/eGossip/OpenSCAD/lib3x-bsearch.html) From 0671ef9d9e718a7f417f4106348d5c06a47ef9cf Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Fri, 12 Feb 2021 11:28:39 +0800 Subject: [PATCH 70/99] add doc --- README.md | 2 +- docs/lib3x-angle_between.md | 18 ++++++++++++++++++ src/util/angle_between.scad | 10 ++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 docs/lib3x-angle_between.md diff --git a/README.md b/README.md index 8677043f..f46ffe8f 100644 --- a/README.md +++ b/README.md @@ -133,7 +133,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [sphere_spiral_extrude](https://openhome.cc/eGossip/OpenSCAD/lib2x-sphere_spiral_extrude.html) ### Util -- util/angle_between +- [util/angle_between](https://openhome.cc/eGossip/OpenSCAD/lib3x-angle_between.html) - [util/bsearch](https://openhome.cc/eGossip/OpenSCAD/lib3x-bsearch.html) - [util/choose](https://openhome.cc/eGossip/OpenSCAD/lib3x-choose.html) - [util/dedup](https://openhome.cc/eGossip/OpenSCAD/lib3x-dedup.html) diff --git a/docs/lib3x-angle_between.md b/docs/lib3x-angle_between.md new file mode 100644 index 00000000..599d833b --- /dev/null +++ b/docs/lib3x-angle_between.md @@ -0,0 +1,18 @@ +# angle_between + +Returns the angle between two vectors. + +**Since:** 3.0 + +## Parameters + +- `vt1` : vector 1. +- `vt2` : vector 2. + +## Examples + + use ; + + assert(angle_between([0, 1], [1, 0]) == 90); + assert(angle_between([0, 1, 0], [1, 0, 0]) == 90); + assert(round(angle_between([1, 1, 0], [1, 1, sqrt(2)])) == 45); \ No newline at end of file diff --git a/src/util/angle_between.scad b/src/util/angle_between.scad index c08d6cf7..011d996c 100644 --- a/src/util/angle_between.scad +++ b/src/util/angle_between.scad @@ -1 +1,11 @@ +/** +* angle_between.scad +* +* @copyright Justin Lin, 2020 +* @license https://opensource.org/licenses/lgpl-3.0.html +* +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-angle_between.html +* +**/ + function angle_between(vt1, vt2) = acos((vt1 * vt2) / (norm(vt1) * norm(vt2))); \ No newline at end of file From b0a5c86b98946b70d3b19768a28c362480a8925d Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Fri, 12 Feb 2021 18:53:38 +0800 Subject: [PATCH 71/99] add degrees --- README.md | 2 +- docs/lib3x-degrees.md | 15 +++++++++++++++ src/util/degrees.scad | 10 ++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 docs/lib3x-degrees.md diff --git a/README.md b/README.md index f46ffe8f..2d0d537c 100644 --- a/README.md +++ b/README.md @@ -137,7 +137,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [util/bsearch](https://openhome.cc/eGossip/OpenSCAD/lib3x-bsearch.html) - [util/choose](https://openhome.cc/eGossip/OpenSCAD/lib3x-choose.html) - [util/dedup](https://openhome.cc/eGossip/OpenSCAD/lib3x-dedup.html) -- util/degrees +- [util/degrees](https://openhome.cc/eGossip/OpenSCAD/lib3x-degrees.html) - [util/every](https://openhome.cc/eGossip/OpenSCAD/lib3x-every.html) - [util/fibseq](https://openhome.cc/eGossip/OpenSCAD/lib3x-fibseq.html) - [util/flat](https://openhome.cc/eGossip/OpenSCAD/lib3x-flat.html) diff --git a/docs/lib3x-degrees.md b/docs/lib3x-degrees.md new file mode 100644 index 00000000..89037eb6 --- /dev/null +++ b/docs/lib3x-degrees.md @@ -0,0 +1,15 @@ +# degrees + +Converts a radian measurement to the corresponding value in degrees. + +**Since:**: 3.0 + +## Parameters + +- `radians` : The radians value. + +## Examples + + use ; + + assert(degrees(PI) == 180); diff --git a/src/util/degrees.scad b/src/util/degrees.scad index fe02a304..036e60ce 100644 --- a/src/util/degrees.scad +++ b/src/util/degrees.scad @@ -1 +1,11 @@ +/** +* degrees.scad +* +* @copyright Justin Lin, 2020 +* @license https://opensource.org/licenses/lgpl-3.0.html +* +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-degrees.html +* +**/ + function degrees(radians) = 180 / PI * radians; \ No newline at end of file From 8ad78ce353ca6219d25f3f44350b368eb3963856 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Fri, 12 Feb 2021 18:56:03 +0800 Subject: [PATCH 72/99] add radians --- README.md | 2 +- docs/lib3x-radians.md | 15 +++++++++++++++ src/util/radians.scad | 10 ++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 docs/lib3x-radians.md diff --git a/README.md b/README.md index 2d0d537c..15189c42 100644 --- a/README.md +++ b/README.md @@ -145,7 +145,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [util/lerp](https://openhome.cc/eGossip/OpenSCAD/lib3x-lerp.html) - [util/parse_number](https://openhome.cc/eGossip/OpenSCAD/lib3x-parse_number.html) - util/polar_coordinate -- util/radians +- [util/radians](https://openhome.cc/eGossip/OpenSCAD/lib3x-radians.html) - [util/rand](https://openhome.cc/eGossip/OpenSCAD/lib3x-rand.html) - [util/reverse](https://openhome.cc/eGossip/OpenSCAD/lib3x-reverse.html) - [util/slice](https://openhome.cc/eGossip/OpenSCAD/lib3x-slice.html) diff --git a/docs/lib3x-radians.md b/docs/lib3x-radians.md new file mode 100644 index 00000000..5c693e20 --- /dev/null +++ b/docs/lib3x-radians.md @@ -0,0 +1,15 @@ +# radian + +Converts a degree measurement to the corresponding value in radians. + +**Since:**: 3.0 + +## Parameters + +- `degrees` : The degrees value. + +## Examples + + use ; + + assert(radians(180) == PI); diff --git a/src/util/radians.scad b/src/util/radians.scad index cdefb799..bef07398 100644 --- a/src/util/radians.scad +++ b/src/util/radians.scad @@ -1 +1,11 @@ +/** +* radians.scad +* +* @copyright Justin Lin, 2020 +* @license https://opensource.org/licenses/lgpl-3.0.html +* +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-radians.html +* +**/ + function radians(degrees) = PI / 180 * degrees; \ No newline at end of file From 2a5df40b2b7cd6af80d1adacef4aef040bc69653 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sat, 13 Feb 2021 10:56:11 +0800 Subject: [PATCH 73/99] add polar_coordinate --- README.md | 2 +- docs/lib3x-polar_coordinate.md | 18 ++++++++++++++++++ src/util/polar_coordinate.scad | 10 ++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 docs/lib3x-polar_coordinate.md diff --git a/README.md b/README.md index 15189c42..a2dec932 100644 --- a/README.md +++ b/README.md @@ -144,7 +144,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [util/has](https://openhome.cc/eGossip/OpenSCAD/lib3x-has.html) - [util/lerp](https://openhome.cc/eGossip/OpenSCAD/lib3x-lerp.html) - [util/parse_number](https://openhome.cc/eGossip/OpenSCAD/lib3x-parse_number.html) -- util/polar_coordinate +- [util/polar_coordinate](https://openhome.cc/eGossip/OpenSCAD/lib3x-polar_coordinate.html) - [util/radians](https://openhome.cc/eGossip/OpenSCAD/lib3x-radians.html) - [util/rand](https://openhome.cc/eGossip/OpenSCAD/lib3x-rand.html) - [util/reverse](https://openhome.cc/eGossip/OpenSCAD/lib3x-reverse.html) diff --git a/docs/lib3x-polar_coordinate.md b/docs/lib3x-polar_coordinate.md new file mode 100644 index 00000000..5cffcd87 --- /dev/null +++ b/docs/lib3x-polar_coordinate.md @@ -0,0 +1,18 @@ +# polar_coordinate + +Converts from Cartesian to Polar coordinates. + +**Since:** 3.0 + +## Parameters + +- `point` : The Cartesian coordinates (also called rectangular coordinates) of a point. + +## Examples + + use ; + + coord = polar_coordinate([100, 100]); + r = round(coord[0]); + theta = round(coord[1]); + assert([r, theta] == [141, 45]); \ No newline at end of file diff --git a/src/util/polar_coordinate.scad b/src/util/polar_coordinate.scad index 56ea5335..0c6ca55d 100644 --- a/src/util/polar_coordinate.scad +++ b/src/util/polar_coordinate.scad @@ -1,3 +1,13 @@ +/** +* polar_coordinate.scad +* +* @copyright Justin Lin, 2020 +* @license https://opensource.org/licenses/lgpl-3.0.html +* +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-polar_coordinate.html +* +**/ + use <../__comm__/__angy_angz.scad>; function polar_coordinate(point) = [norm(point), atan2(point[1], point[0])]; // r, theta \ No newline at end of file From 11c216ae79c265fd475d4cbe061372ba1fb4fc6c Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sat, 13 Feb 2021 10:57:16 +0800 Subject: [PATCH 74/99] update --- docs/lib3x-polar_coordinate.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/lib3x-polar_coordinate.md b/docs/lib3x-polar_coordinate.md index 5cffcd87..b0e7b631 100644 --- a/docs/lib3x-polar_coordinate.md +++ b/docs/lib3x-polar_coordinate.md @@ -1,6 +1,6 @@ # polar_coordinate -Converts from Cartesian to Polar coordinates. +Converts from Cartesian to Polar coordinates. It returns `[radius, theta]`. **Since:** 3.0 From 29d6a274674a3cd6f3202230eeb06036b95f1b91 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sat, 13 Feb 2021 10:57:58 +0800 Subject: [PATCH 75/99] update --- docs/lib3x-polar_coordinate.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/lib3x-polar_coordinate.md b/docs/lib3x-polar_coordinate.md index b0e7b631..db8a13c1 100644 --- a/docs/lib3x-polar_coordinate.md +++ b/docs/lib3x-polar_coordinate.md @@ -6,7 +6,7 @@ Converts from Cartesian to Polar coordinates. It returns `[radius, theta]`. ## Parameters -- `point` : The Cartesian coordinates (also called rectangular coordinates) of a point. +- `point` : The Cartesian coordinates of a point. ## Examples From f621af9a0235781f0acb9e274103fb506b4a41d0 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sat, 13 Feb 2021 11:00:09 +0800 Subject: [PATCH 76/99] add spherical_coordinate --- README.md | 2 +- docs/lib3x-spherical_coordinate.md | 19 +++++++++++++++++++ src/util/spherical_coordinate.scad | 10 ++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 docs/lib3x-spherical_coordinate.md diff --git a/README.md b/README.md index a2dec932..0dfe2013 100644 --- a/README.md +++ b/README.md @@ -151,7 +151,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [util/slice](https://openhome.cc/eGossip/OpenSCAD/lib3x-slice.html) - [util/some](https://openhome.cc/eGossip/OpenSCAD/lib3x-some.html) - [util/sort](https://openhome.cc/eGossip/OpenSCAD/lib3x-sort.html) -- util/spherical_coordinate +- [util/spherical_coordinate](https://openhome.cc/eGossip/OpenSCAD/lib3x-spherical_coordinate.html) - [util/sub_str](https://openhome.cc/eGossip/OpenSCAD/lib3x-sub_str.html) - [util/split_str](https://openhome.cc/eGossip/OpenSCAD/lib3x-split_str.html) - [util/sum](https://openhome.cc/eGossip/OpenSCAD/lib3x-sum.html) diff --git a/docs/lib3x-spherical_coordinate.md b/docs/lib3x-spherical_coordinate.md new file mode 100644 index 00000000..c4dd4c36 --- /dev/null +++ b/docs/lib3x-spherical_coordinate.md @@ -0,0 +1,19 @@ +# spherical_coordinate + +Converts from Cartesian to Polar coordinates. It returns `[radius, theta, phi]`. + +**Since:** 3.0 + +## Parameters + +- `point` : The Cartesian coordinates of a point. + +## Examples + + use ; + + coord = spherical_coordinate([100, 100, 100]); + r = round(coord[0]); + theta = round(coord[1]); + phi = round(coord[2]); + assert([r, theta, phi] == [173, 45, 35]); \ No newline at end of file diff --git a/src/util/spherical_coordinate.scad b/src/util/spherical_coordinate.scad index 47608097..a65e9e99 100644 --- a/src/util/spherical_coordinate.scad +++ b/src/util/spherical_coordinate.scad @@ -1,3 +1,13 @@ +/** +* spherical_coordinate.scad +* +* @copyright Justin Lin, 2020 +* @license https://opensource.org/licenses/lgpl-3.0.html +* +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-spherical_coordinate.html +* +**/ + function spherical_coordinate(point) = // mathematics [r, theta, phi] [ From 699c58fd47d9857baa2f161fcdc19b10a91ca2a8 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sat, 13 Feb 2021 11:03:02 +0800 Subject: [PATCH 77/99] update --- docs/lib3x-spherical_coordinate.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/lib3x-spherical_coordinate.md b/docs/lib3x-spherical_coordinate.md index c4dd4c36..5a714f8e 100644 --- a/docs/lib3x-spherical_coordinate.md +++ b/docs/lib3x-spherical_coordinate.md @@ -1,6 +1,6 @@ # spherical_coordinate -Converts from Cartesian to Polar coordinates. It returns `[radius, theta, phi]`. +Converts from Cartesian to Spherical coordinates (used in mathematics). It returns `[radius, theta, phi]`. **Since:** 3.0 From 9717138b2ba919498d0f14fe8d22f448c7c312e9 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sat, 13 Feb 2021 11:11:23 +0800 Subject: [PATCH 78/99] update to 3.0 --- README.md | 4 ++-- docs/images/{lib2x-arc-1.JPG => lib3x-arc-1.JPG} | Bin docs/images/{lib2x-arc-2.JPG => lib3x-arc-2.JPG} | Bin docs/images/{lib2x-arc-3.JPG => lib3x-arc-3.JPG} | Bin .../{lib2x-hexagons-1.JPG => lib3x-hexagons-1.JPG} | Bin .../{lib2x-hexagons-2.JPG => lib3x-hexagons-2.JPG} | Bin docs/{lib2x-arc.md => lib3x-arc.md} | 6 +++--- docs/{lib2x-hexagons.md => lib3x-hexagons.md} | 6 +++--- src/arc.scad | 2 +- src/hexagons.scad | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) rename docs/images/{lib2x-arc-1.JPG => lib3x-arc-1.JPG} (100%) rename docs/images/{lib2x-arc-2.JPG => lib3x-arc-2.JPG} (100%) rename docs/images/{lib2x-arc-3.JPG => lib3x-arc-3.JPG} (100%) rename docs/images/{lib2x-hexagons-1.JPG => lib3x-hexagons-1.JPG} (100%) rename docs/images/{lib2x-hexagons-2.JPG => lib3x-hexagons-2.JPG} (100%) rename docs/{lib2x-arc.md => lib3x-arc.md} (93%) rename docs/{lib2x-hexagons.md => lib3x-hexagons.md} (69%) diff --git a/README.md b/README.md index 0dfe2013..b3ccf180 100644 --- a/README.md +++ b/README.md @@ -44,8 +44,8 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp ## Documentation ### 2D Module -- [arc](https://openhome.cc/eGossip/OpenSCAD/lib2x-arc.html) -- [hexagons](https://openhome.cc/eGossip/OpenSCAD/lib2x-hexagons.html) +- [arc](https://openhome.cc/eGossip/OpenSCAD/lib3x-arc.html) +- [hexagons](https://openhome.cc/eGossip/OpenSCAD/lib3x-hexagons.html) - [hull_polyline2d](https://openhome.cc/eGossip/OpenSCAD/lib2x-hull_polyline2d.html) - [line2d](https://openhome.cc/eGossip/OpenSCAD/lib2x-line2d.html) - [multi_line_text](https://openhome.cc/eGossip/OpenSCAD/lib2x-multi_line_text.html) diff --git a/docs/images/lib2x-arc-1.JPG b/docs/images/lib3x-arc-1.JPG similarity index 100% rename from docs/images/lib2x-arc-1.JPG rename to docs/images/lib3x-arc-1.JPG diff --git a/docs/images/lib2x-arc-2.JPG b/docs/images/lib3x-arc-2.JPG similarity index 100% rename from docs/images/lib2x-arc-2.JPG rename to docs/images/lib3x-arc-2.JPG diff --git a/docs/images/lib2x-arc-3.JPG b/docs/images/lib3x-arc-3.JPG similarity index 100% rename from docs/images/lib2x-arc-3.JPG rename to docs/images/lib3x-arc-3.JPG diff --git a/docs/images/lib2x-hexagons-1.JPG b/docs/images/lib3x-hexagons-1.JPG similarity index 100% rename from docs/images/lib2x-hexagons-1.JPG rename to docs/images/lib3x-hexagons-1.JPG diff --git a/docs/images/lib2x-hexagons-2.JPG b/docs/images/lib3x-hexagons-2.JPG similarity index 100% rename from docs/images/lib2x-hexagons-2.JPG rename to docs/images/lib3x-hexagons-2.JPG diff --git a/docs/lib2x-arc.md b/docs/lib3x-arc.md similarity index 93% rename from docs/lib2x-arc.md rename to docs/lib3x-arc.md index 59915fa3..441272f5 100644 --- a/docs/lib2x-arc.md +++ b/docs/lib3x-arc.md @@ -19,7 +19,7 @@ Creates an arc. You can pass a 2 element vector to define the central angle. Its arc(radius = 20, angle = [45, 290], width = 2); %circle(r = 20); -![arc](images/lib2x-arc-1.JPG) +![arc](images/lib3x-arc-1.JPG) use ; @@ -27,7 +27,7 @@ Creates an arc. You can pass a 2 element vector to define the central angle. Its arc(radius = 20, angle = [45, 290], width = 2, width_mode = "LINE_OUTWARD"); %circle(r = 20); -![arc](images/lib2x-arc-2.JPG) +![arc](images/lib3x-arc-2.JPG) use ; @@ -35,7 +35,7 @@ Creates an arc. You can pass a 2 element vector to define the central angle. Its arc(radius = 20, angle = [45, 290], width = 2, width_mode = "LINE_INWARD"); %circle(r = 20); -![arc](images/lib2x-arc-3.JPG) +![arc](images/lib3x-arc-3.JPG) diff --git a/docs/lib2x-hexagons.md b/docs/lib3x-hexagons.md similarity index 69% rename from docs/lib2x-hexagons.md rename to docs/lib3x-hexagons.md index 9043e732..6d52ac3d 100644 --- a/docs/lib2x-hexagons.md +++ b/docs/lib3x-hexagons.md @@ -1,6 +1,6 @@ # hexagons -A hexagonal structure is useful in many situations. This module creates hexagons in a hexagon. +This module creates hexagons in a hexagon. ## Parameters @@ -18,7 +18,7 @@ A hexagonal structure is useful in many situations. This module creates hexagons hexagons(radius, spacing, levels); -![hexagons](images/lib2x-hexagons-1.JPG) +![hexagons](images/lib3x-hexagons-1.JPG) use ; @@ -29,4 +29,4 @@ A hexagonal structure is useful in many situations. This module creates hexagons hexagons(radius, spacing, levels); -![hexagons](images/lib2x-hexagons-2.JPG) \ No newline at end of file +![hexagons](images/lib3x-hexagons-2.JPG) \ No newline at end of file diff --git a/src/arc.scad b/src/arc.scad index 81f82c03..98db7035 100644 --- a/src/arc.scad +++ b/src/arc.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2017 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-arc.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-arc.html * **/ diff --git a/src/hexagons.scad b/src/hexagons.scad index 97b9e421..9920f157 100644 --- a/src/hexagons.scad +++ b/src/hexagons.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2017 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-hexagons.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-hexagons.html * **/ From df8e4ebe08f28b5fc2ad5f767b4da6135eeeb334 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sat, 13 Feb 2021 18:12:27 +0800 Subject: [PATCH 79/99] width default to 1 --- src/arc.scad | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/arc.scad b/src/arc.scad index 98db7035..62f85222 100644 --- a/src/arc.scad +++ b/src/arc.scad @@ -10,6 +10,6 @@ use ; -module arc(radius, angle, width, width_mode = "LINE_CROSS") { +module arc(radius, angle, width = 1, width_mode = "LINE_CROSS") { polygon(shape_arc(radius, angle, width, width_mode)); } \ No newline at end of file From 7dbcbb21f6e3486342b127e6d9b2bdf9cf602c00 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sat, 13 Feb 2021 18:15:28 +0800 Subject: [PATCH 80/99] update doc --- docs/lib3x-arc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/lib3x-arc.md b/docs/lib3x-arc.md index 441272f5..fd7560cc 100644 --- a/docs/lib3x-arc.md +++ b/docs/lib3x-arc.md @@ -6,7 +6,7 @@ Creates an arc. You can pass a 2 element vector to define the central angle. Its - `radius` : The radius of the circle. - `angle` : A single value or a 2 element vector which defines the central angle. The first element of the vector is the beginning angle in degrees, and the second element is the ending angle. -- `width` : The width of the arc. +- `width` : The width of the arc. Default to 1. - `width_mode` : The default value is `"LINE_CROSS"`. The arc line will move outward by `width / 2` and inward by `width / 2`. If it's `"LINE_OUTWARD"`, The arc line moves outward by `width`. The `"LINE_INWARD"` moves the arc line inward by `width`. - `$fa`, `$fs`, `$fn` : Check [the circle module](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Using_the_2D_Subsystem#circle) for more details. From 4001ddba252c0263d5f41786f27961854f613412 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sat, 13 Feb 2021 18:15:32 +0800 Subject: [PATCH 81/99] default to 1 --- docs/lib3x-function_grapher.md | 2 +- src/function_grapher.scad | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/lib3x-function_grapher.md b/docs/lib3x-function_grapher.md index ef55dc88..7fb597cc 100644 --- a/docs/lib3x-function_grapher.md +++ b/docs/lib3x-function_grapher.md @@ -5,7 +5,7 @@ Given a list of points `[x, y, f(x, y)]` where `f(x, y)` is a mathematics functi ## Parameters - `points` : A list of points `[x, y, f(x, y)]`. See examples below. -- `thickness` : The face or line thickness. +- `thickness` : The face or line thickness. Default to 1. - `style` : The style of the graph. It accepts `"FACES"`, `"LINES"`, `"HULL_FACES"` and `"HULL_LINES"`. The default value is `"FACES"` which simply takes `f(x, y) - thickness` for each point to build a bottom. It may cause thickness problems when slopes is high. The `"HULL_FACES"` value can solve the problem but is slow. When assigning `"LINES"`, it uses lines to connect points. The `"HULL_LINES"` is very very slow; however, the model might look smoother if you have a small `$fn`. - `$fa`, `$fs`, `$fn` : Used by the `circle` or `sphere` module internally. It affects the speed of rending. For example, a large `$fn` may be very slow when rending. Check [the circle module](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Using_the_2D_Subsystem#circle) or [the sphere module](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Primitive_Solids#sphere) for more details. diff --git a/src/function_grapher.scad b/src/function_grapher.scad index 7a82b2bd..f0b4cd8d 100644 --- a/src/function_grapher.scad +++ b/src/function_grapher.scad @@ -13,7 +13,7 @@ use ; use ; use ; -module function_grapher(points, thickness, style = "FACES") { +module function_grapher(points, thickness = 1, style = "FACES") { rows = len(points); columns = len(points[0]); From 09e3efdc05d313bae8eb04d73bffa1cc34caa7f7 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 14 Feb 2021 10:21:03 +0800 Subject: [PATCH 82/99] update to 3.0 --- README.md | 6 +++--- ...polyline2d-1.JPG => lib3x-hull_polyline2d-1.JPG} | Bin .../{lib2x-line2d-1.JPG => lib3x-line2d-1.JPG} | Bin ..._line_text-1.JPG => lib3x-multi_line_text-1.JPG} | Bin ...-hull_polyline2d.md => lib3x-hull_polyline2d.md} | 2 +- docs/{lib2x-line2d.md => lib3x-line2d.md} | 2 +- ...-multi_line_text.md => lib3x-multi_line_text.md} | 2 +- src/hull_polyline2d.scad | 2 +- src/line2d.scad | 2 +- src/multi_line_text.scad | 2 +- 10 files changed, 9 insertions(+), 9 deletions(-) rename docs/images/{lib2x-hull_polyline2d-1.JPG => lib3x-hull_polyline2d-1.JPG} (100%) rename docs/images/{lib2x-line2d-1.JPG => lib3x-line2d-1.JPG} (100%) rename docs/images/{lib2x-multi_line_text-1.JPG => lib3x-multi_line_text-1.JPG} (100%) rename docs/{lib2x-hull_polyline2d.md => lib3x-hull_polyline2d.md} (93%) rename docs/{lib2x-line2d.md => lib3x-line2d.md} (96%) rename docs/{lib2x-multi_line_text.md => lib3x-multi_line_text.md} (88%) diff --git a/README.md b/README.md index b3ccf180..331e1af3 100644 --- a/README.md +++ b/README.md @@ -46,9 +46,9 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp ### 2D Module - [arc](https://openhome.cc/eGossip/OpenSCAD/lib3x-arc.html) - [hexagons](https://openhome.cc/eGossip/OpenSCAD/lib3x-hexagons.html) -- [hull_polyline2d](https://openhome.cc/eGossip/OpenSCAD/lib2x-hull_polyline2d.html) -- [line2d](https://openhome.cc/eGossip/OpenSCAD/lib2x-line2d.html) -- [multi_line_text](https://openhome.cc/eGossip/OpenSCAD/lib2x-multi_line_text.html) +- [hull_polyline2d](https://openhome.cc/eGossip/OpenSCAD/lib3x-hull_polyline2d.html) +- [line2d](https://openhome.cc/eGossip/OpenSCAD/lib3x-line2d.html) +- [multi_line_text](https://openhome.cc/eGossip/OpenSCAD/lib3x-multi_line_text.html) - [pie](https://openhome.cc/eGossip/OpenSCAD/lib2x-pie.html) - [polyline2d](https://openhome.cc/eGossip/OpenSCAD/lib2x-polyline2d.html) - [polygon_hull](https://openhome.cc/eGossip/OpenSCAD/lib2x-polygon_hull.html) diff --git a/docs/images/lib2x-hull_polyline2d-1.JPG b/docs/images/lib3x-hull_polyline2d-1.JPG similarity index 100% rename from docs/images/lib2x-hull_polyline2d-1.JPG rename to docs/images/lib3x-hull_polyline2d-1.JPG diff --git a/docs/images/lib2x-line2d-1.JPG b/docs/images/lib3x-line2d-1.JPG similarity index 100% rename from docs/images/lib2x-line2d-1.JPG rename to docs/images/lib3x-line2d-1.JPG diff --git a/docs/images/lib2x-multi_line_text-1.JPG b/docs/images/lib3x-multi_line_text-1.JPG similarity index 100% rename from docs/images/lib2x-multi_line_text-1.JPG rename to docs/images/lib3x-multi_line_text-1.JPG diff --git a/docs/lib2x-hull_polyline2d.md b/docs/lib3x-hull_polyline2d.md similarity index 93% rename from docs/lib2x-hull_polyline2d.md rename to docs/lib3x-hull_polyline2d.md index 12901dbb..7b50f7b1 100644 --- a/docs/lib2x-hull_polyline2d.md +++ b/docs/lib3x-hull_polyline2d.md @@ -19,4 +19,4 @@ Creates a 2D polyline from a list of `[x, y]` coordinates. As the name says, it width = 1 ); -![hull_polyline3d](images/lib2x-hull_polyline2d-1.JPG) \ No newline at end of file +![hull_polyline3d](images/lib3x-hull_polyline2d-1.JPG) \ No newline at end of file diff --git a/docs/lib2x-line2d.md b/docs/lib3x-line2d.md similarity index 96% rename from docs/lib2x-line2d.md rename to docs/lib3x-line2d.md index ba333ad5..64cc7524 100644 --- a/docs/lib2x-line2d.md +++ b/docs/lib3x-line2d.md @@ -27,4 +27,4 @@ Creates a line from two points. When the end points are `CAP_ROUND`, you can use line2d(p1 = [0, 0], p2 = [5, 0], width = 1, p1Style = "CAP_BUTT", p2Style = "CAP_BUTT"); -![line2d](images/lib2x-line2d-1.JPG) +![line2d](images/lib3x-line2d-1.JPG) diff --git a/docs/lib2x-multi_line_text.md b/docs/lib3x-multi_line_text.md similarity index 88% rename from docs/lib2x-multi_line_text.md rename to docs/lib3x-multi_line_text.md index 30ee47fd..5f7f172c 100644 --- a/docs/lib2x-multi_line_text.md +++ b/docs/lib3x-multi_line_text.md @@ -18,5 +18,5 @@ Creates multi-line text from a list of strings. Parameters are the same as the b halign = "center" ); -![multi_line_text](images/lib2x-multi_line_text-1.JPG) +![multi_line_text](images/lib3x-multi_line_text-1.JPG) diff --git a/src/hull_polyline2d.scad b/src/hull_polyline2d.scad index fd28dd8d..50136d42 100644 --- a/src/hull_polyline2d.scad +++ b/src/hull_polyline2d.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2017 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-hull_polyline2d.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-hull_polyline2d.html * **/ diff --git a/src/line2d.scad b/src/line2d.scad index b18d9cdf..55cf6ca0 100644 --- a/src/line2d.scad +++ b/src/line2d.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2017 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-line2d.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-line2d.html * **/ diff --git a/src/multi_line_text.scad b/src/multi_line_text.scad index 42bd43c8..47a8b60d 100644 --- a/src/multi_line_text.scad +++ b/src/multi_line_text.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2017 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-multi_line_text.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-multi_line_text.html * **/ module multi_line_text(lines, line_spacing = 15, size = 10, font = "Arial", halign = "left", valign = "baseline", direction = "ltr", language = "en", script = "latin"){ From ed22e229e4090ebd8c1cfca25d0588a169c07685 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 14 Feb 2021 10:45:47 +0800 Subject: [PATCH 83/99] Default to 1. --- docs/lib3x-hull_polyline2d.md | 2 +- docs/lib3x-line2d.md | 2 +- src/hull_polyline2d.scad | 2 +- src/line2d.scad | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/lib3x-hull_polyline2d.md b/docs/lib3x-hull_polyline2d.md index 7b50f7b1..db6437c4 100644 --- a/docs/lib3x-hull_polyline2d.md +++ b/docs/lib3x-hull_polyline2d.md @@ -5,7 +5,7 @@ Creates a 2D polyline from a list of `[x, y]` coordinates. As the name says, it ## Parameters - `points` : The list of `[x, y]` points of the polyline. The points are indexed from 0 to n-1. -- `width` : The line width. +- `width` : The line width. Default to 1. - `$fa`, `$fs`, `$fn` : Check [the circle module](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Using_the_2D_Subsystem#circle) for more details. ## Examples diff --git a/docs/lib3x-line2d.md b/docs/lib3x-line2d.md index 64cc7524..ec1bbfd2 100644 --- a/docs/lib3x-line2d.md +++ b/docs/lib3x-line2d.md @@ -6,7 +6,7 @@ Creates a line from two points. When the end points are `CAP_ROUND`, you can use - `p1` : 2 element vector `[x, y]`. - `p2` : 2 element vector `[x, y]`. -- `width` : The line width. +- `width` : The line width. Default to 1. - `p1Style` : The end-cap style of the point `p1`. The value must be `"CAP_BUTT"`, `"CAP_SQUARE"` or `"CAP_ROUND"`. The default value is `"CAP_SQUARE"`. - `p2Style` : The end-cap style of the point `p2`. The value must be `"CAP_BUTT"`, `"CAP_SQUARE"` or `"CAP_ROUND"`. The default value is `"CAP_SQUARE"`. - `$fa`, `$fs`, `$fn` : Check [the circle module](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Using_the_2D_Subsystem#circle) for more details. The final fragments of a circle will be a multiple of 4 to fit edges. diff --git a/src/hull_polyline2d.scad b/src/hull_polyline2d.scad index 50136d42..bf8c5838 100644 --- a/src/hull_polyline2d.scad +++ b/src/hull_polyline2d.scad @@ -8,7 +8,7 @@ * **/ -module hull_polyline2d(points, width) { +module hull_polyline2d(points, width = 1) { half_width = width / 2; leng = len(points); diff --git a/src/line2d.scad b/src/line2d.scad index 55cf6ca0..0f6b7b83 100644 --- a/src/line2d.scad +++ b/src/line2d.scad @@ -11,7 +11,7 @@ use <__comm__/__frags.scad>; use <__comm__/__nearest_multiple_of_4.scad>; -module line2d(p1, p2, width, p1Style = "CAP_SQUARE", p2Style = "CAP_SQUARE") { +module line2d(p1, p2, width = 1, p1Style = "CAP_SQUARE", p2Style = "CAP_SQUARE") { half_width = 0.5 * width; atan_angle = atan2(p2[1] - p1[1], p2[0] - p1[0]); From 1990fe7cffeb2b9fa6dd70fa10e13032424f1a7d Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 14 Feb 2021 19:53:02 +0800 Subject: [PATCH 84/99] fix wrong phi --- docs/lib3x-spherical_coordinate.md | 2 +- src/util/spherical_coordinate.scad | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/lib3x-spherical_coordinate.md b/docs/lib3x-spherical_coordinate.md index 5a714f8e..d8860df2 100644 --- a/docs/lib3x-spherical_coordinate.md +++ b/docs/lib3x-spherical_coordinate.md @@ -16,4 +16,4 @@ Converts from Cartesian to Spherical coordinates (used in mathematics). It retur r = round(coord[0]); theta = round(coord[1]); phi = round(coord[2]); - assert([r, theta, phi] == [173, 45, 35]); \ No newline at end of file + assert([r, theta, phi] == [173, 45, 55]); \ No newline at end of file diff --git a/src/util/spherical_coordinate.scad b/src/util/spherical_coordinate.scad index a65e9e99..d69ab747 100644 --- a/src/util/spherical_coordinate.scad +++ b/src/util/spherical_coordinate.scad @@ -13,5 +13,5 @@ function spherical_coordinate(point) = [ norm(point), atan2(point[1], point[0]), - atan2(point[2], sqrt(point[0]^2 + point[1]^2)) + atan2(sqrt(point[0]^2 + point[1]^2), point[2]) ]; From df03994d210143f7c4e0a973a2419c7fb9a5331f Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Wed, 17 Feb 2021 11:38:31 +0800 Subject: [PATCH 85/99] update to 3.0 --- README.md | 6 +++--- docs/images/{lib2x-pie-1.JPG => lib3x-pie-1.JPG} | Bin ...-polygon_hull-1.JPG => lib3x-polygon_hull-1.JPG} | Bin ...ib2x-polyline2d-1.JPG => lib3x-polyline2d-1.JPG} | Bin ...ib2x-polyline2d-2.JPG => lib3x-polyline2d-2.JPG} | Bin ...ib2x-polyline2d-3.JPG => lib3x-polyline2d-3.JPG} | Bin ...ib2x-polyline2d-4.JPG => lib3x-polyline2d-4.JPG} | Bin docs/{lib2x-pie.md => lib3x-pie.md} | 4 ++-- ...{lib2x-polygon_hull.md => lib3x-polygon_hull.md} | 2 +- docs/{lib2x-polyline2d.md => lib3x-polyline2d.md} | 10 +++++----- src/pie.scad | 2 +- src/polygon_hull.scad | 2 +- src/polyline2d.scad | 4 ++-- 13 files changed, 15 insertions(+), 15 deletions(-) rename docs/images/{lib2x-pie-1.JPG => lib3x-pie-1.JPG} (100%) rename docs/images/{lib2x-polygon_hull-1.JPG => lib3x-polygon_hull-1.JPG} (100%) rename docs/images/{lib2x-polyline2d-1.JPG => lib3x-polyline2d-1.JPG} (100%) rename docs/images/{lib2x-polyline2d-2.JPG => lib3x-polyline2d-2.JPG} (100%) rename docs/images/{lib2x-polyline2d-3.JPG => lib3x-polyline2d-3.JPG} (100%) rename docs/images/{lib2x-polyline2d-4.JPG => lib3x-polyline2d-4.JPG} (100%) rename docs/{lib2x-pie.md => lib3x-pie.md} (75%) rename docs/{lib2x-polygon_hull.md => lib3x-polygon_hull.md} (86%) rename docs/{lib2x-polyline2d.md => lib3x-polyline2d.md} (87%) diff --git a/README.md b/README.md index 331e1af3..a6b5359b 100644 --- a/README.md +++ b/README.md @@ -49,9 +49,9 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [hull_polyline2d](https://openhome.cc/eGossip/OpenSCAD/lib3x-hull_polyline2d.html) - [line2d](https://openhome.cc/eGossip/OpenSCAD/lib3x-line2d.html) - [multi_line_text](https://openhome.cc/eGossip/OpenSCAD/lib3x-multi_line_text.html) -- [pie](https://openhome.cc/eGossip/OpenSCAD/lib2x-pie.html) -- [polyline2d](https://openhome.cc/eGossip/OpenSCAD/lib2x-polyline2d.html) -- [polygon_hull](https://openhome.cc/eGossip/OpenSCAD/lib2x-polygon_hull.html) +- [pie](https://openhome.cc/eGossip/OpenSCAD/lib3x-pie.html) +- [polyline2d](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyline2d.html) +- [polygon_hull](https://openhome.cc/eGossip/OpenSCAD/lib3x-polygon_hull.html) - [rounded_square](https://openhome.cc/eGossip/OpenSCAD/lib2x-rounded_square.html) ### 3D Module diff --git a/docs/images/lib2x-pie-1.JPG b/docs/images/lib3x-pie-1.JPG similarity index 100% rename from docs/images/lib2x-pie-1.JPG rename to docs/images/lib3x-pie-1.JPG diff --git a/docs/images/lib2x-polygon_hull-1.JPG b/docs/images/lib3x-polygon_hull-1.JPG similarity index 100% rename from docs/images/lib2x-polygon_hull-1.JPG rename to docs/images/lib3x-polygon_hull-1.JPG diff --git a/docs/images/lib2x-polyline2d-1.JPG b/docs/images/lib3x-polyline2d-1.JPG similarity index 100% rename from docs/images/lib2x-polyline2d-1.JPG rename to docs/images/lib3x-polyline2d-1.JPG diff --git a/docs/images/lib2x-polyline2d-2.JPG b/docs/images/lib3x-polyline2d-2.JPG similarity index 100% rename from docs/images/lib2x-polyline2d-2.JPG rename to docs/images/lib3x-polyline2d-2.JPG diff --git a/docs/images/lib2x-polyline2d-3.JPG b/docs/images/lib3x-polyline2d-3.JPG similarity index 100% rename from docs/images/lib2x-polyline2d-3.JPG rename to docs/images/lib3x-polyline2d-3.JPG diff --git a/docs/images/lib2x-polyline2d-4.JPG b/docs/images/lib3x-polyline2d-4.JPG similarity index 100% rename from docs/images/lib2x-polyline2d-4.JPG rename to docs/images/lib3x-polyline2d-4.JPG diff --git a/docs/lib2x-pie.md b/docs/lib3x-pie.md similarity index 75% rename from docs/lib2x-pie.md rename to docs/lib3x-pie.md index 865ff487..9f61f3a6 100644 --- a/docs/lib2x-pie.md +++ b/docs/lib3x-pie.md @@ -1,6 +1,6 @@ # pie -Creates a pie (circular sector). You can pass a 2 element vector to define the central angle. Its `$fa`, `$fs` and `$fn` parameters are consistent with the `circle` module. +Creates a pie (circular sector). Its `$fa`, `$fs` and `$fn` are consistent with the `circle` module. ## Parameters @@ -16,5 +16,5 @@ Creates a pie (circular sector). You can pass a 2 element vector to define the c translate([-15, 0, 0]) pie(radius = 20, angle = [45, 135]); translate([15, 0, 0]) pie(radius = 20, angle = [45, 135], $fn = 12); -![pie](images/lib2x-pie-1.JPG) +![pie](images/lib3x-pie-1.JPG) diff --git a/docs/lib2x-polygon_hull.md b/docs/lib3x-polygon_hull.md similarity index 86% rename from docs/lib2x-polygon_hull.md rename to docs/lib3x-polygon_hull.md index e41da526..6be1fb61 100644 --- a/docs/lib2x-polygon_hull.md +++ b/docs/lib3x-polygon_hull.md @@ -20,4 +20,4 @@ Create a convex polygon by hulling a list of points. It avoids using `hull` and [-1, -1] ]); -![polygon_hull](images/lib2x-polygon_hull-1.JPG) \ No newline at end of file +![polygon_hull](images/lib3x-polygon_hull-1.JPG) \ No newline at end of file diff --git a/docs/lib2x-polyline2d.md b/docs/lib3x-polyline2d.md similarity index 87% rename from docs/lib2x-polyline2d.md rename to docs/lib3x-polyline2d.md index f75dec80..b4c73205 100644 --- a/docs/lib2x-polyline2d.md +++ b/docs/lib3x-polyline2d.md @@ -5,7 +5,7 @@ Creates a polyline from a list of `x`, `y` coordinates. When the end points are ## Parameters - `points` : The list of `[x, y]` points of the polyline. The points are indexed from 0 to n-1. -- `width` : The line width. +- `width` : The line width. Default to 1. - `startingStyle` : The end-cap style of the starting point. The value must be `"CAP_BUTT"`, `"CAP_SQUARE"` or `"CAP_ROUND"`. The default value is `"CAP_SQUARE"`. - `endingStyle` : The end-cap style of the ending point. The value must be `"CAP_BUTT"`, `"CAP_SQUARE"` or `"CAP_ROUND"`. The default value is `"CAP_SQUARE"`. - `joinStyle`: Applies to the vertex where two lines join. The value must be `"JOIN_ROUND"`, `"JOIN_MITER"` or `"JOIN_BEVEL"`. The default value is `"JOIN_ROUND"`. Since 2.4. @@ -18,7 +18,7 @@ Creates a polyline from a list of `x`, `y` coordinates. When the end points are $fn = 24; polyline2d(points = [[1, 2], [-5, -4], [-5, 3], [5, 5]], width = 1); -![polyline2d](images/lib2x-polyline2d-1.JPG) +![polyline2d](images/lib3x-polyline2d-1.JPG) use ; @@ -26,7 +26,7 @@ Creates a polyline from a list of `x`, `y` coordinates. When the end points are polyline2d(points = [[1, 2], [-5, -4], [-5, 3], [5, 5]], width = 1, endingStyle = "CAP_ROUND"); -![polyline2d](images/lib2x-polyline2d-2.JPG) +![polyline2d](images/lib3x-polyline2d-2.JPG) use ; @@ -34,8 +34,8 @@ Creates a polyline from a list of `x`, `y` coordinates. When the end points are polyline2d(points = [[1, 2], [-5, -4], [-5, 3], [5, 5]], width = 1, startingStyle = "CAP_ROUND", endingStyle = "CAP_ROUND"); -![polyline2d](images/lib2x-polyline2d-3.JPG) +![polyline2d](images/lib3x-polyline2d-3.JPG) About `joinStyle`: -![polyline2d](images/lib2x-polyline2d-4.JPG) \ No newline at end of file +![polyline2d](images/lib3x-polyline2d-4.JPG) \ No newline at end of file diff --git a/src/pie.scad b/src/pie.scad index f3c052f9..771c7591 100644 --- a/src/pie.scad +++ b/src/pie.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2017 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-pie.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-pie.html * **/ diff --git a/src/polygon_hull.scad b/src/polygon_hull.scad index 0db4efa9..ceed93dd 100644 --- a/src/polygon_hull.scad +++ b/src/polygon_hull.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2020 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-polygon_hull.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-polygon_hull.html * **/ diff --git a/src/polyline2d.scad b/src/polyline2d.scad index 0c346fa3..0c1c375d 100644 --- a/src/polyline2d.scad +++ b/src/polyline2d.scad @@ -4,14 +4,14 @@ * @copyright Justin Lin, 2017 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-polyline2d.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-polyline2d.html * **/ use ; use ; -module polyline2d(points, width, startingStyle = "CAP_SQUARE", endingStyle = "CAP_SQUARE", joinStyle = "JOIN_ROUND") { +module polyline2d(points, width = 1, startingStyle = "CAP_SQUARE", endingStyle = "CAP_SQUARE", joinStyle = "JOIN_ROUND") { leng_pts = len(points); s_styles = [startingStyle, "CAP_BUTT"]; From 4de9b6639363b78d93df32b6b5516667bf1b190b Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Wed, 17 Feb 2021 11:41:21 +0800 Subject: [PATCH 86/99] update to 3.0 --- README.md | 2 +- ...nded_square-1.JPG => lib3x-rounded_square-1.JPG} | Bin ...nded_square-2.JPG => lib3x-rounded_square-2.JPG} | Bin ...nded_square-3.JPG => lib3x-rounded_square-3.JPG} | Bin ...2x-rounded_square.md => lib3x-rounded_square.md} | 8 ++++---- src/rounded_square.scad | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) rename docs/images/{lib2x-rounded_square-1.JPG => lib3x-rounded_square-1.JPG} (100%) rename docs/images/{lib2x-rounded_square-2.JPG => lib3x-rounded_square-2.JPG} (100%) rename docs/images/{lib2x-rounded_square-3.JPG => lib3x-rounded_square-3.JPG} (100%) rename docs/{lib2x-rounded_square.md => lib3x-rounded_square.md} (76%) diff --git a/README.md b/README.md index a6b5359b..4429ff3e 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [pie](https://openhome.cc/eGossip/OpenSCAD/lib3x-pie.html) - [polyline2d](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyline2d.html) - [polygon_hull](https://openhome.cc/eGossip/OpenSCAD/lib3x-polygon_hull.html) -- [rounded_square](https://openhome.cc/eGossip/OpenSCAD/lib2x-rounded_square.html) +- [rounded_square](https://openhome.cc/eGossip/OpenSCAD/lib3x-rounded_square.html) ### 3D Module - [crystal_ball](https://openhome.cc/eGossip/OpenSCAD/lib2x-crystal_ball.html) diff --git a/docs/images/lib2x-rounded_square-1.JPG b/docs/images/lib3x-rounded_square-1.JPG similarity index 100% rename from docs/images/lib2x-rounded_square-1.JPG rename to docs/images/lib3x-rounded_square-1.JPG diff --git a/docs/images/lib2x-rounded_square-2.JPG b/docs/images/lib3x-rounded_square-2.JPG similarity index 100% rename from docs/images/lib2x-rounded_square-2.JPG rename to docs/images/lib3x-rounded_square-2.JPG diff --git a/docs/images/lib2x-rounded_square-3.JPG b/docs/images/lib3x-rounded_square-3.JPG similarity index 100% rename from docs/images/lib2x-rounded_square-3.JPG rename to docs/images/lib3x-rounded_square-3.JPG diff --git a/docs/lib2x-rounded_square.md b/docs/lib3x-rounded_square.md similarity index 76% rename from docs/lib2x-rounded_square.md rename to docs/lib3x-rounded_square.md index 7ea9597a..e9704a8e 100644 --- a/docs/lib2x-rounded_square.md +++ b/docs/lib3x-rounded_square.md @@ -1,6 +1,6 @@ # rounded_square -Creates a rounded square or rectangle in the first quadrant. When `center` is `true` the square is centered on the origin. +Creates a rounded square or rectangle in the first quadrant. ## Parameters @@ -15,7 +15,7 @@ Creates a rounded square or rectangle in the first quadrant. When `center` is `t rounded_square(size = 50, corner_r = 5); -![rounded_square](images/lib2x-rounded_square-1.JPG) +![rounded_square](images/lib3x-rounded_square-1.JPG) use ; @@ -25,7 +25,7 @@ Creates a rounded square or rectangle in the first quadrant. When `center` is `t center = true ); -![rounded_square](images/lib2x-rounded_square-2.JPG) +![rounded_square](images/lib3x-rounded_square-2.JPG) use ; @@ -36,7 +36,7 @@ Creates a rounded square or rectangle in the first quadrant. When `center` is `t center = true ); -![rounded_square](images/lib2x-rounded_square-3.JPG) +![rounded_square](images/lib3x-rounded_square-3.JPG) diff --git a/src/rounded_square.scad b/src/rounded_square.scad index 3b7828f8..a5f97f93 100644 --- a/src/rounded_square.scad +++ b/src/rounded_square.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2017 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-rounded_square.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-rounded_square.html * **/ From 3204041d9c2f4abc7a8532106c35b8047502a322 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Wed, 17 Feb 2021 18:08:06 +0800 Subject: [PATCH 87/99] update to 3.0 --- README.md | 2 +- ...-crystal_ball-1.JPG => lib3x-crystal_ball-1.JPG} | Bin ...{lib2x-crystal_ball.md => lib3x-crystal_ball.md} | 4 ++-- src/crystal_ball.scad | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename docs/images/{lib2x-crystal_ball-1.JPG => lib3x-crystal_ball-1.JPG} (100%) rename docs/{lib2x-crystal_ball.md => lib3x-crystal_ball.md} (92%) diff --git a/README.md b/README.md index 4429ff3e..f3d992dd 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [rounded_square](https://openhome.cc/eGossip/OpenSCAD/lib3x-rounded_square.html) ### 3D Module -- [crystal_ball](https://openhome.cc/eGossip/OpenSCAD/lib2x-crystal_ball.html) +- [crystal_ball](https://openhome.cc/eGossip/OpenSCAD/lib3x-crystal_ball.html) - [function_grapher](https://openhome.cc/eGossip/OpenSCAD/lib3x-function_grapher.html) - [hull_polyline3d](https://openhome.cc/eGossip/OpenSCAD/lib2x-hull_polyline3d.html) - [line3d](https://openhome.cc/eGossip/OpenSCAD/lib2x-line3d.html) diff --git a/docs/images/lib2x-crystal_ball-1.JPG b/docs/images/lib3x-crystal_ball-1.JPG similarity index 100% rename from docs/images/lib2x-crystal_ball-1.JPG rename to docs/images/lib3x-crystal_ball-1.JPG diff --git a/docs/lib2x-crystal_ball.md b/docs/lib3x-crystal_ball.md similarity index 92% rename from docs/lib2x-crystal_ball.md rename to docs/lib3x-crystal_ball.md index 85314872..c5dfe3c9 100644 --- a/docs/lib2x-crystal_ball.md +++ b/docs/lib3x-crystal_ball.md @@ -9,7 +9,7 @@ Uses spherical coordinate system to create a crystal ball. - `radius` : The radial distance r. - `theta` : The azimuthal angle. It defaults to 360. It also accepts a 2 element vector. The first element of the vector is the beginning angle in degrees, and the second element is the ending angle. - `phi` : The polar angle. It defaults to 180. It also accepts a 2 element vector. The first element of the vector is the beginning angle in degrees, and the second element is the ending angle. -- `thickness` : The thickness of the ball. **Since:** 2.1. +- `thickness` : The thickness of the ball. **Since:** 2.1 - `$fa`, `$fs`, `$fn` : Check [the circle module](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Using_the_2D_Subsystem#circle) or [the sphere module](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Primitive_Solids#sphere) for more details. The final fragments will be a multiple of 4 to fit edges. ## Examples @@ -42,4 +42,4 @@ Uses spherical coordinate system to create a crystal ball. thickness = 2 ); -![crystal_ball](images/lib2x-crystal_ball-1.JPG) +![crystal_ball](images/lib3x-crystal_ball-1.JPG) diff --git a/src/crystal_ball.scad b/src/crystal_ball.scad index 881a6e90..e9a05336 100644 --- a/src/crystal_ball.scad +++ b/src/crystal_ball.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2017 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-crystal_ball.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-crystal_ball.html * **/ From 36322d61d11c16bee3c4ab4386441f6e3fcdc84a Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Thu, 18 Feb 2021 10:35:27 +0800 Subject: [PATCH 88/99] update to 3.0 --- README.md | 2 +- ...polyline3d-1.JPG => lib3x-hull_polyline3d-1.JPG} | Bin ...polyline3d-2.JPG => lib3x-hull_polyline3d-2.JPG} | Bin ...-hull_polyline3d.md => lib3x-hull_polyline3d.md} | 8 ++++---- src/hull_polyline3d.scad | 12 ++++++------ 5 files changed, 11 insertions(+), 11 deletions(-) rename docs/images/{lib2x-hull_polyline3d-1.JPG => lib3x-hull_polyline3d-1.JPG} (100%) rename docs/images/{lib2x-hull_polyline3d-2.JPG => lib3x-hull_polyline3d-2.JPG} (100%) rename docs/{lib2x-hull_polyline3d.md => lib3x-hull_polyline3d.md} (86%) diff --git a/README.md b/README.md index f3d992dd..f28f8cbe 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp ### 3D Module - [crystal_ball](https://openhome.cc/eGossip/OpenSCAD/lib3x-crystal_ball.html) - [function_grapher](https://openhome.cc/eGossip/OpenSCAD/lib3x-function_grapher.html) -- [hull_polyline3d](https://openhome.cc/eGossip/OpenSCAD/lib2x-hull_polyline3d.html) +- [hull_polyline3d](https://openhome.cc/eGossip/OpenSCAD/lib3x-hull_polyline3d.html) - [line3d](https://openhome.cc/eGossip/OpenSCAD/lib2x-line3d.html) - [loft](https://openhome.cc/eGossip/OpenSCAD/lib2x-loft.html) - [polyhedron_hull](https://openhome.cc/eGossip/OpenSCAD/lib2x-polyhedron_hull.html) diff --git a/docs/images/lib2x-hull_polyline3d-1.JPG b/docs/images/lib3x-hull_polyline3d-1.JPG similarity index 100% rename from docs/images/lib2x-hull_polyline3d-1.JPG rename to docs/images/lib3x-hull_polyline3d-1.JPG diff --git a/docs/images/lib2x-hull_polyline3d-2.JPG b/docs/images/lib3x-hull_polyline3d-2.JPG similarity index 100% rename from docs/images/lib2x-hull_polyline3d-2.JPG rename to docs/images/lib3x-hull_polyline3d-2.JPG diff --git a/docs/lib2x-hull_polyline3d.md b/docs/lib3x-hull_polyline3d.md similarity index 86% rename from docs/lib2x-hull_polyline3d.md rename to docs/lib3x-hull_polyline3d.md index d25d9e33..aff6ce3c 100644 --- a/docs/lib2x-hull_polyline3d.md +++ b/docs/lib3x-hull_polyline3d.md @@ -5,7 +5,7 @@ Creates a 3D polyline from a list of `[x, y, z]` coordinates. As the name says, ## Parameters - `points` : The list of `[x, y, z]` points of the polyline. The points are indexed from 0 to n-1. -- `thickness` : The line thickness. +- `diameter` : The line diameter. Default to 1. - `$fa`, `$fs`, `$fn` : Check [the sphere module](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Primitive_Solids#sphere) for more details. ## Examples @@ -19,11 +19,11 @@ Creates a 3D polyline from a list of `[x, y, z]` coordinates. As the name says, [-1, -3, -5], [0, 0, 0] ], - thickness = 1, + diameter = 1, $fn = 3 ); -![polyline3d](images/lib2x-hull_polyline3d-1.JPG) +![polyline3d](images/lib3x-hull_polyline3d-1.JPG) use ; @@ -42,4 +42,4 @@ Creates a 3D polyline from a list of `[x, y, z]` coordinates. As the name says, hull_polyline3d(points, 2, $fn = 3); } -![polyline3d](images/lib2x-hull_polyline3d-2.JPG) +![polyline3d](images/lib3x-hull_polyline3d-2.JPG) diff --git a/src/hull_polyline3d.scad b/src/hull_polyline3d.scad index 883e68ce..4f17bc0b 100644 --- a/src/hull_polyline3d.scad +++ b/src/hull_polyline3d.scad @@ -4,12 +4,12 @@ * @copyright Justin Lin, 2017 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-hull_polyline3d.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-hull_polyline3d.html * **/ -module hull_polyline3d(points, thickness) { - half_thickness = thickness / 2; +module hull_polyline3d(points, diameter = 1) { + radius = diameter / 2; leng = len(points); module hull_line3d(index) { @@ -18,13 +18,13 @@ module hull_polyline3d(points, thickness) { hull() { translate(point1) - sphere(half_thickness); + sphere(radius); translate(point2) - sphere(half_thickness); + sphere(radius); } // hook for testing - test_hull_polyline3d_line_segment(index, point1, point2, half_thickness); + test_hull_polyline3d_line_segment(index, point1, point2, radius); } module polyline3d_inner(index) { From 672ae4e25c5224e484a8d4652ad7504d34a94ea0 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Thu, 18 Feb 2021 10:45:44 +0800 Subject: [PATCH 89/99] change param name --- examples/hollow_out/hollow_out_cylinder.scad | 4 +-- examples/hollow_out/hollow_out_holder.scad | 10 +++--- examples/hollow_out/hollow_out_starburst.scad | 10 +++--- examples/hollow_out/hollow_out_torus.scad | 4 +-- examples/hollow_out/hollow_out_vase.scad | 18 +++++----- examples/maze/mobius_maze.scad | 4 +-- examples/maze/torus_maze.scad | 4 +-- examples/maze/twisted_maze.scad | 4 +-- examples/sierpinski_pyramid.scad | 22 ++++++------ examples/square_pursuit_3d.scad | 16 ++++----- examples/string_tetrahedron.scad | 26 +++++++------- examples/string_tetrahedrons.scad | 36 +++++++++---------- examples/tiled_line_mobius.scad | 10 +++--- examples/tiled_line_torus.scad | 10 +++--- examples/turtle/hilbert_curve_drawing.scad | 4 +-- examples/turtle/hilbert_dragon.scad | 1 - examples/turtle/lsystem3_collection.scad | 2 +- examples/voronoi/voronoi_torus.scad | 2 +- test/test_hull_polyline3d.scad | 8 ++--- 19 files changed, 97 insertions(+), 98 deletions(-) diff --git a/examples/hollow_out/hollow_out_cylinder.scad b/examples/hollow_out/hollow_out_cylinder.scad index 87c5d727..6a9afa9d 100644 --- a/examples/hollow_out/hollow_out_cylinder.scad +++ b/examples/hollow_out/hollow_out_cylinder.scad @@ -5,7 +5,7 @@ use ; size = [100, 40]; pt_nums = 20; -thickness = 1; +line_diameter = 1; radius = 15; fn = 12; @@ -35,7 +35,7 @@ for(line = bisectors) { pts = [for(p = line) ptf_bend(size, p, radius, 360)]; hull_polyline3d( concat(pts, [pts[0]]), - thickness = thickness, + line_diameter = line_diameter, $fn = 4 ); } \ No newline at end of file diff --git a/examples/hollow_out/hollow_out_holder.scad b/examples/hollow_out/hollow_out_holder.scad index 57e2201c..4db8301c 100644 --- a/examples/hollow_out/hollow_out_holder.scad +++ b/examples/hollow_out/hollow_out_holder.scad @@ -7,7 +7,7 @@ columns = 30; rows = 15; radius = 30; angle = 360; -thickness = 2; +diameter = 2; lines = concat( hollow_out_square([columns, rows], width), @@ -18,10 +18,10 @@ lines = concat( for(line = lines) { transformed = [for(pt = line) ptf_bend([columns * width, rows * width], pt, radius, angle)]; - hull_polyline3d(transformed, thickness, $fn = 4); + hull_polyline3d(transformed, diameter, $fn = 4); } -translate([0, 0, -thickness / 2]) -linear_extrude(thickness) +translate([0, 0, -diameter / 2]) +linear_extrude(diameter) rotate(180 / columns) - circle(radius + thickness / 2, $fn = columns); \ No newline at end of file + circle(radius + diameter / 2, $fn = columns); \ No newline at end of file diff --git a/examples/hollow_out/hollow_out_starburst.scad b/examples/hollow_out/hollow_out_starburst.scad index f423532f..14593ccb 100644 --- a/examples/hollow_out/hollow_out_starburst.scad +++ b/examples/hollow_out/hollow_out_starburst.scad @@ -6,10 +6,10 @@ r1 = 30; r2 = 12; h = 10; n = 5; -thickness = 1.75; +line_diameter = 1.75; half = true; -module hollow_out_starburst(r1, r2, h, n, thickness, half = false) { +module hollow_out_starburst(r1, r2, h, n, line_diameter, half = false) { star = [for(p = shape_starburst(r1, r2, n)) [p[0], p[1], 0]]; leng = len(star); tris = concat( @@ -19,9 +19,9 @@ module hollow_out_starburst(r1, r2, h, n, thickness, half = false) { module half_star() { for(tri = tris) { - hull_polyline3d(concat(tri, [tri[0]]), thickness = thickness); + hull_polyline3d(concat(tri, [tri[0]]), line_diameter = line_diameter); for(line = tri_bisectors(tri)) { - hull_polyline3d(concat(line, [line[0]]), thickness = thickness); + hull_polyline3d(concat(line, [line[0]]), line_diameter = line_diameter); } } } @@ -32,4 +32,4 @@ module hollow_out_starburst(r1, r2, h, n, thickness, half = false) { } } -hollow_out_starburst(r1, r2, h, n, thickness, half); \ No newline at end of file +hollow_out_starburst(r1, r2, h, n, line_diameter, half); \ No newline at end of file diff --git a/examples/hollow_out/hollow_out_torus.scad b/examples/hollow_out/hollow_out_torus.scad index 0400a759..21354ef4 100644 --- a/examples/hollow_out/hollow_out_torus.scad +++ b/examples/hollow_out/hollow_out_torus.scad @@ -6,14 +6,14 @@ width = 5; columns = 10; rows = 30; radius = 30; -thickness = 2; +line_diameter = 2; twist = 0; lines = hollow_out_square([columns, rows], width); for(line = lines) { transformed = [for(pt = line) ptf_torus([columns * width, rows * width], pt, [radius, radius / 2], twist = twist)]; - hull_polyline3d(transformed, thickness, $fn = 4); + hull_polyline3d(transformed, line_diameter, $fn = 4); } color("black") diff --git a/examples/hollow_out/hollow_out_vase.scad b/examples/hollow_out/hollow_out_vase.scad index 008816ee..1e8578bf 100644 --- a/examples/hollow_out/hollow_out_vase.scad +++ b/examples/hollow_out/hollow_out_vase.scad @@ -6,7 +6,7 @@ use ; use ; t_step = 0.1; -width = 3; +line_diameter = 3; fn = 18; line_style = "HULL_LINES"; // [LINES, HULL_LINES] @@ -16,9 +16,9 @@ p2 = [0, 0, 60]; p3 = [25, 0, 120]; p4 = [35, 0, 130]; -hollow_out_vase([p0, p1, p2, p3, p4], t_step, width, fn, line_style); +hollow_out_vase([p0, p1, p2, p3, p4], t_step, line_diameter, fn, line_style); -module hollow_out_vase(ctrl_pts, t_step, width, fn, line_style) { +module hollow_out_vase(ctrl_pts, t_step, line_diameter, fn, line_style) { bezier = bezier_curve(t_step, ctrl_pts ); @@ -32,7 +32,7 @@ module hollow_out_vase(ctrl_pts, t_step, width, fn, line_style) { ]); // body - hollow_out_sweep(sects, thickness = width, style = line_style, $fn = 4); + hollow_out_sweep(sects, diameter = line_diameter, style = line_style, $fn = 4); leng_sect = len(sects[0]); @@ -45,9 +45,9 @@ module hollow_out_vase(ctrl_pts, t_step, width, fn, line_style) { for(tri = fst_tris) { lines = tri_bisectors(tri); for(line = lines) { - hull_polyline3d(line, thickness = width, $fn = 4); + hull_polyline3d(line, diameter = line_diameter, $fn = 4); } - hull_polyline3d([lines[2][1], [0, 0, 0]], thickness = width, $fn = 4); + hull_polyline3d([lines[2][1], [0, 0, 0]], diameter = line_diameter, $fn = 4); } // mouth @@ -57,9 +57,9 @@ module hollow_out_vase(ctrl_pts, t_step, width, fn, line_style) { [[[0, 0, fpt[2]], lst_sect[leng_sect - 1], lst_sect[0]]] ); dangling_pts = [for(tri = lst_tris) tri_bisectors(tri)[1][1]]; - offset_z = [0, 0, width]; + offset_z = [0, 0, line_diameter]; for(i = [0: leng_sect - 1]) { - hull_polyline3d([lst_sect[i] + offset_z, dangling_pts[i]], thickness = width, $fn = 4); - hull_polyline3d([lst_sect[(i + 1) % leng_sect] + offset_z, dangling_pts[i]], thickness = width, $fn = 4); + hull_polyline3d([lst_sect[i] + offset_z, dangling_pts[i]], diameter = line_diameter, $fn = 4); + hull_polyline3d([lst_sect[(i + 1) % leng_sect] + offset_z, dangling_pts[i]], diameter = line_diameter, $fn = 4); } } \ No newline at end of file diff --git a/examples/maze/mobius_maze.scad b/examples/maze/mobius_maze.scad index 9c456979..965ad102 100644 --- a/examples/maze/mobius_maze.scad +++ b/examples/maze/mobius_maze.scad @@ -6,7 +6,7 @@ use ; rows = 48; columns = 8; cell_width = 2; -wall_thickness = 1; +line_diameter = 1; angle = 180; // $fn = 24; @@ -24,5 +24,5 @@ walls = mz_square_walls(cells, rows, columns, cell_width, bottom_border = false) size = [columns * cell_width, rows * cell_width]; for(wall_pts = walls) { transformed = [for(pt = wall_pts) ptf_ring(size, pt, radius, 360, angle)]; - hull_polyline3d(transformed, wall_thickness); + hull_polyline3d(transformed, line_diameter); } \ No newline at end of file diff --git a/examples/maze/torus_maze.scad b/examples/maze/torus_maze.scad index 55130c0d..ea8176d5 100644 --- a/examples/maze/torus_maze.scad +++ b/examples/maze/torus_maze.scad @@ -6,7 +6,7 @@ use ; rows = 36; columns = 12; cell_width = 2; -wall_thickness = 1; +line_diameter = 1; angle = 180; twist = 360; @@ -24,7 +24,7 @@ walls = mz_square_walls(cells, rows, columns, cell_width, left_border = false, b size = [columns * cell_width, rows * cell_width]; for(wall_pts = walls) { transformed = [for(pt = wall_pts) ptf_torus(size, pt, [radius, radius / 2], twist = twist)]; - hull_polyline3d(transformed, wall_thickness, $fn = 4); + hull_polyline3d(transformed, line_diameter, $fn = 4); } color("black") diff --git a/examples/maze/twisted_maze.scad b/examples/maze/twisted_maze.scad index e95ebf40..8098510d 100644 --- a/examples/maze/twisted_maze.scad +++ b/examples/maze/twisted_maze.scad @@ -7,7 +7,7 @@ use ; rows = 10; columns = 10; cell_width = 4; -wall_thickness = 1; +line_diameter = 1; angle = 90; axis = "X_AXIS"; // [X_AXIS, Y_AXIS] // $fn = 24; @@ -21,5 +21,5 @@ walls = mz_square_walls(cells, rows, columns, cell_width); size = [columns * cell_width, rows * cell_width]; for(wall_pts = walls) { transformed = [for(pt = wall_pts) axis == "X_AXIS" ? ptf_x_twist(size, pt, angle) : ptf_y_twist(size, pt, angle)]; - hull_polyline3d(transformed, wall_thickness); + hull_polyline3d(transformed, line_diameter); } \ No newline at end of file diff --git a/examples/sierpinski_pyramid.scad b/examples/sierpinski_pyramid.scad index 009372b4..4d9dd3c8 100644 --- a/examples/sierpinski_pyramid.scad +++ b/examples/sierpinski_pyramid.scad @@ -2,12 +2,12 @@ use ; side_leng = 100; min_leng = 5; -thickness = 2.5; +diameter = 2.5; -sierpinski_pyramid(side_leng, min_leng, thickness, $fn = 4); +sierpinski_pyramid(side_leng, min_leng, diameter, $fn = 4); -module sierpinski_pyramid(side_leng, min_leng, thickness) { - pyramid_frame(side_leng, thickness); +module sierpinski_pyramid(side_leng, min_leng, diameter) { + pyramid_frame(side_leng, diameter); if(side_leng > min_leng){ half_leng = side_leng / 2; h = half_leng * 0.707107; @@ -15,25 +15,25 @@ module sierpinski_pyramid(side_leng, min_leng, thickness) { for(i=[0:3]) { rotate([0, 0, i * 90]) translate(pt) - sierpinski_pyramid(half_leng, min_leng, thickness); + sierpinski_pyramid(half_leng, min_leng, diameter); } translate([0, 0, h]) - sierpinski_pyramid(half_leng, min_leng, thickness); + sierpinski_pyramid(half_leng, min_leng, diameter); } } -module pyramid_frame(side_leng, thickness) { +module pyramid_frame(side_leng, diameter) { half_leng = side_leng / 2; h = half_leng * 1.414214; tri_pts = [[0, 0, h], [half_leng, half_leng, 0], [half_leng, -half_leng, 0], [0, 0, h]]; line_pts = [[half_leng, half_leng, 0], [-half_leng, half_leng, 0]]; - hull_polyline3d(tri_pts, thickness); + hull_polyline3d(tri_pts, diameter); mirror([1, 0, 0]) - hull_polyline3d(tri_pts, thickness); + hull_polyline3d(tri_pts, diameter); - hull_polyline3d(line_pts, thickness); + hull_polyline3d(line_pts, diameter); mirror([0, 1, 0]) - hull_polyline3d(line_pts, thickness); + hull_polyline3d(line_pts, diameter); } \ No newline at end of file diff --git a/examples/square_pursuit_3d.scad b/examples/square_pursuit_3d.scad index d5e3aa7f..546788bc 100644 --- a/examples/square_pursuit_3d.scad +++ b/examples/square_pursuit_3d.scad @@ -2,11 +2,11 @@ use ; length = 100; diff_scale = 0.125; -thickness = 2; +diameter = 2; n = 30; $fn = 6; -module square_pursuit_3d(length, diff_scale, thickness, n) { +module square_pursuit_3d(length, diff_scale, diameter, n) { function inter_p(p1, p2, leng, d) = let( vp = p2 - p1, @@ -14,7 +14,7 @@ module square_pursuit_3d(length, diff_scale, thickness, n) { ) p1 + u * d; - module _square_pursuit_3d(pts, diff_scale, thickness, n) { + module _square_pursuit_3d(pts, diff_scale, diameter, n) { if(n != 0) { vp = pts[1] - pts[0]; leng = norm(vp); @@ -22,9 +22,9 @@ module square_pursuit_3d(length, diff_scale, thickness, n) { npts = [for(i = [0:3]) inter_p(pts[i], pts[(i + 1) % 4], leng, d)]; - hull_polyline3d(concat(npts, [npts[3], npts[0]]), thickness); + hull_polyline3d(concat(npts, [npts[3], npts[0]]), diameter); - _square_pursuit_3d(npts, diff_scale, thickness, n - 1); + _square_pursuit_3d(npts, diff_scale, diameter, n - 1); } } @@ -36,9 +36,9 @@ module square_pursuit_3d(length, diff_scale, thickness, n) { [0, length, 0] ]; - hull_polyline3d(concat(pts, [pts[3], pts[0]]), thickness); + hull_polyline3d(concat(pts, [pts[3], pts[0]]), diameter); - _square_pursuit_3d(pts, diff_scale, thickness, n - 1); + _square_pursuit_3d(pts, diff_scale, diameter, n - 1); } -square_pursuit_3d(length, diff_scale, thickness, n); \ No newline at end of file +square_pursuit_3d(length, diff_scale, diameter, n); \ No newline at end of file diff --git a/examples/string_tetrahedron.scad b/examples/string_tetrahedron.scad index 8f1c1ba0..d7108b8c 100644 --- a/examples/string_tetrahedron.scad +++ b/examples/string_tetrahedron.scad @@ -1,14 +1,14 @@ use ; leng = 50; -thickness = 5; +diameter = 5; segs_per_side = 20; line_fn = 5; model = "Tetrahedron"; // [Tetrahedron, Base, Both] -module string_tetrahedron(leng, thickness, segs_per_side, line_fn) { - module lines_between(side1, side2, thickness, segs) { +module string_tetrahedron(leng, diameter, segs_per_side, line_fn) { + module lines_between(side1, side2, diameter, segs) { function pts(p1, p2, segs) = let( p = p2 - p1, @@ -21,7 +21,7 @@ module string_tetrahedron(leng, thickness, segs_per_side, line_fn) { pts2 = pts(side2[0], side2[1], segs); for(i = [0:len(pts1) - 1]) { - hull_polyline3d(points = [pts1[i], pts2[i]], thickness = thickness); + hull_polyline3d(points = [pts1[i], pts2[i]], diameter = diameter); } } @@ -49,15 +49,15 @@ module string_tetrahedron(leng, thickness, segs_per_side, line_fn) { vt3 = vts[2]; vt4 = vts[3]; - lines_between([vt1, vt2], [vt3, vt4], thickness, segs_per_side); - lines_between([vt2, vt3], [vt1, vt4], thickness, segs_per_side); - lines_between([vt3, vt1], [vt2, vt4], thickness, segs_per_side); + lines_between([vt1, vt2], [vt3, vt4], diameter, segs_per_side); + lines_between([vt2, vt3], [vt1, vt4], diameter, segs_per_side); + lines_between([vt3, vt1], [vt2, vt4], diameter, segs_per_side); } -module base(leng, thickness, line_fn) { +module base(leng, diameter, line_fn) { vts = vts(leng); r = leng / 4; - half_th = thickness / 2; + half_th = diameter / 2; difference() { sphere(r, $fn = 48); @@ -83,15 +83,15 @@ module base(leng, thickness, line_fn) { } if(model == "Tetrahedron") { - string_tetrahedron(leng, thickness, segs_per_side, line_fn); + string_tetrahedron(leng, diameter, segs_per_side, line_fn); } else if(model == "Base") { - base(leng, thickness, line_fn); + base(leng, diameter, line_fn); } else { translate([0, 0, height(leng) + half_th]) rotate([0, 180, 0]) translate([0, -leng / 2 * tan(30), 0]) - string_tetrahedron(leng, thickness, segs_per_side, line_fn); + string_tetrahedron(leng, diameter, segs_per_side, line_fn); - base(leng, thickness, line_fn); + base(leng, diameter, line_fn); } diff --git a/examples/string_tetrahedrons.scad b/examples/string_tetrahedrons.scad index ed41f06c..d1f34263 100644 --- a/examples/string_tetrahedrons.scad +++ b/examples/string_tetrahedrons.scad @@ -2,12 +2,12 @@ use ; level = 1; leng = 50; -thickness = 5; +diameter = 5; segs_per_side = 10; center = false; -module string_tetrahedron(leng, thickness, segs_per_side, line_fn) { - module lines_between(side1, side2, thickness, segs) { +module string_tetrahedron(leng, diameter, segs_per_side, line_fn) { + module lines_between(side1, side2, diameter, segs) { function pts(p1, p2, segs) = let( p = p2 - p1, @@ -20,12 +20,12 @@ module string_tetrahedron(leng, thickness, segs_per_side, line_fn) { pts2 = pts(side2[0], side2[1], segs); leng = len(pts1); - hull_polyline3d(points = [pts1[0], pts2[0]], thickness = thickness); + hull_polyline3d(points = [pts1[0], pts2[0]], diameter = diameter); for(i = [1:leng - 2]) { - hull_polyline3d(points = [pts1[i], pts2[i]], thickness = thickness); + hull_polyline3d(points = [pts1[i], pts2[i]], diameter = diameter); } end = leng - 1; - hull_polyline3d(points = [pts1[end], pts2[end]], thickness = thickness); + hull_polyline3d(points = [pts1[end], pts2[end]], diameter = diameter); } function height(leng) = @@ -52,18 +52,18 @@ module string_tetrahedron(leng, thickness, segs_per_side, line_fn) { vt3 = vts[2]; vt4 = vts[3]; - lines_between([vt1, vt2], [vt3, vt4], thickness, segs_per_side); - lines_between([vt2, vt3], [vt1, vt4], thickness, segs_per_side); - lines_between([vt3, vt1], [vt2, vt4], thickness, segs_per_side); + lines_between([vt1, vt2], [vt3, vt4], diameter, segs_per_side); + lines_between([vt2, vt3], [vt1, vt4], diameter, segs_per_side); + lines_between([vt3, vt1], [vt2, vt4], diameter, segs_per_side); } -module string_tetrahedrons(level, leng, thickness, segs_per_side, center) { +module string_tetrahedrons(level, leng, diameter, segs_per_side, center) { function height(leng) = leng * sqrt(1 - 4 / 9 * pow(sin(60), 2)); if(level == 0) { - string_tetrahedron(leng * 2, thickness, segs_per_side, 6); + string_tetrahedron(leng * 2, diameter, segs_per_side, 6); } else { @@ -71,21 +71,21 @@ module string_tetrahedrons(level, leng, thickness, segs_per_side, center) { center_y = half_leng * tan(30); translate([0, center_y * 2]) - string_tetrahedrons(level - 1, half_leng, thickness, segs_per_side, center); + string_tetrahedrons(level - 1, half_leng, diameter, segs_per_side, center); translate([half_leng, -center_y]) - string_tetrahedrons(level - 1, half_leng, thickness, segs_per_side, center); + string_tetrahedrons(level - 1, half_leng, diameter, segs_per_side, center); translate([-half_leng, -center_y]) - string_tetrahedrons(level - 1, half_leng, thickness, segs_per_side, center); + string_tetrahedrons(level - 1, half_leng, diameter, segs_per_side, center); translate([0, 0, height(leng)]) - string_tetrahedrons(level - 1, half_leng, thickness, segs_per_side, center); + string_tetrahedrons(level - 1, half_leng, diameter, segs_per_side, center); if(center) { rotate(60) - string_tetrahedrons(level - 1, half_leng, thickness, segs_per_side, center); + string_tetrahedrons(level - 1, half_leng, diameter, segs_per_side, center); a = atan(height(leng * 2) / (2 * center_y)); @@ -97,12 +97,12 @@ module string_tetrahedrons(level, leng, thickness, segs_per_side, center) { translate([0, center_y * 2]) rotate([180, 0, 0]) scale(0.9427) - string_tetrahedrons(level - 1, half_leng, thickness, segs_per_side, center); + string_tetrahedrons(level - 1, half_leng, diameter, segs_per_side, center); } } } } -string_tetrahedrons(level, leng, thickness, segs_per_side, center); +string_tetrahedrons(level, leng, diameter, segs_per_side, center); diff --git a/examples/tiled_line_mobius.scad b/examples/tiled_line_mobius.scad index 07a59996..ae4a4cd7 100644 --- a/examples/tiled_line_mobius.scad +++ b/examples/tiled_line_mobius.scad @@ -3,14 +3,14 @@ use ; use ; size = [20, 100]; -line_width = 1; +line_diameter = 1; step = 1; twist = 180; $fn = 8; -module tiled_line_mobius(size, twist, step, line_width = 1) { +module tiled_line_mobius(size, twist, step, line_diameter = 1) { sizexy = is_num(size) ? [size, size] : size; - s = is_undef(step) ? line_width * 2 : step; + s = is_undef(step) ? line_diameter * 2 : step; function rand_diagonal_line_pts(x, y, size) = rand(0, 1) >= 0.5 ? [[x, y], [x + size, y + size]] : [[x + size, y], [x, y + size]]; @@ -33,8 +33,8 @@ module tiled_line_mobius(size, twist, step, line_width = 1) { for(line = lines) { pts = [for(p = line) ptf_ring(size, p, size[0], twist = twist)]; - hull_polyline3d(pts, thickness = line_width); + hull_polyline3d(pts, diameter = line_diameter); } } -tiled_line_mobius(size, twist, step, line_width); +tiled_line_mobius(size, twist, step, line_diameter); diff --git a/examples/tiled_line_torus.scad b/examples/tiled_line_torus.scad index 96cf6f71..e2d717d1 100644 --- a/examples/tiled_line_torus.scad +++ b/examples/tiled_line_torus.scad @@ -3,14 +3,14 @@ use ; use ; size = [20, 50]; -line_width = 1; +line_diameter = 1; step = 1; twist = 180; $fn = 4; -module tiled_line_torus(size, twist, step, line_width = 1) { +module tiled_line_torus(size, twist, step, line_diameter = 1) { sizexy = is_num(size) ? [size, size] : size; - s = is_undef(step) ? line_width * 2 : step; + s = is_undef(step) ? line_diameter * 2 : step; function rand_diagonal_line_pts(x, y, size) = rand(0, 1) >= 0.5 ? [[x, y], [x + size, y + size]] : [[x + size, y], [x, y + size]]; @@ -25,11 +25,11 @@ module tiled_line_torus(size, twist, step, line_width = 1) { for(line = lines) { pts = [for(p = line) ptf_torus(size, p, [size[0], size[0] / 2], twist = twist)]; - hull_polyline3d(pts, thickness = line_width); + hull_polyline3d(pts, diameter = line_diameter); } } -tiled_line_torus(size, twist, step, line_width); +tiled_line_torus(size, twist, step, line_diameter); color("black") rotate_extrude($fn = 36) translate([size[0] * 1.5, 0, 0]) diff --git a/examples/turtle/hilbert_curve_drawing.scad b/examples/turtle/hilbert_curve_drawing.scad index 7a0b5e4e..85063a58 100644 --- a/examples/turtle/hilbert_curve_drawing.scad +++ b/examples/turtle/hilbert_curve_drawing.scad @@ -3,7 +3,7 @@ use ; use ; use ; -thickness = 0.3; +diameter = 0.3; corner_r = 0.5; lines = hilbert_curve(); @@ -14,7 +14,7 @@ hilbert_path = dedup( ); smoothed_hilbert_path = bezier_smooth(hilbert_path, corner_r); -hull_polyline3d(smoothed_hilbert_path, thickness = thickness); +hull_polyline3d(smoothed_hilbert_path, diameter = diameter); function hilbert_curve() = let( diff --git a/examples/turtle/hilbert_dragon.scad b/examples/turtle/hilbert_dragon.scad index bfe09a07..31cfd84a 100644 --- a/examples/turtle/hilbert_dragon.scad +++ b/examples/turtle/hilbert_dragon.scad @@ -1,6 +1,5 @@ use ; use ; -use ; use ; use ; use ; diff --git a/examples/turtle/lsystem3_collection.scad b/examples/turtle/lsystem3_collection.scad index d82842a1..11093f45 100644 --- a/examples/turtle/lsystem3_collection.scad +++ b/examples/turtle/lsystem3_collection.scad @@ -4,7 +4,7 @@ use ; for(line = hilbert_curve()) { hull_polyline3d( [line[0], line[1]], - thickness = 0.5, + diameter = 0.5, $fn = 4 ); } diff --git a/examples/voronoi/voronoi_torus.scad b/examples/voronoi/voronoi_torus.scad index fe1ee269..c0ee25b1 100644 --- a/examples/voronoi/voronoi_torus.scad +++ b/examples/voronoi/voronoi_torus.scad @@ -11,5 +11,5 @@ $fn = 4; for(cell = cells) { cell_poly = [for(p = cell[1]) ptf_torus(size, p, [10, 5], [360, 360])]; - hull_polyline3d(cell_poly, thickness = 1); + hull_polyline3d(cell_poly, diameter = 1); } \ No newline at end of file diff --git a/test/test_hull_polyline3d.scad b/test/test_hull_polyline3d.scad index 3ffeaf99..311df1d5 100644 --- a/test/test_hull_polyline3d.scad +++ b/test/test_hull_polyline3d.scad @@ -9,11 +9,11 @@ module test_hull_polyline3d_line_segment(index, point1, point2, radius) { [0, 0, 0] ]; - thickness = 1; + diameter = 1; assertEqualPoint(points[index - 1], point1); assertEqualPoint(points[index], point2); - assertEqualNum(thickness, radius * 2); + assertEqualNum(diameter, radius * 2); } module test_hull_polyline3d() { @@ -26,11 +26,11 @@ module test_hull_polyline3d() { [0, 0, 0] ]; - thickness = 1; + diameter = 1; hull_polyline3d( points = points, - thickness = thickness, + diameter = diameter, $fn = 3 ); } From 45b9a18ef2b09607d47e0a1d20f2344a5a2d32b7 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Thu, 18 Feb 2021 10:49:33 +0800 Subject: [PATCH 90/99] update --- src/experimental/note.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/experimental/note.md b/src/experimental/note.md index 0b2cbde7..2512a7f2 100644 --- a/src/experimental/note.md +++ b/src/experimental/note.md @@ -5,6 +5,7 @@ to_do: dotSCAD 3.0 Dev - `function_grapher`: delete `slicing` parameter. Improve `"LINES"`、`"HULL_LINES"` performance. +- `hull_polyline3d`: Rename the parameter `thickness` to `diameter`. - `util/sort`: `by` accepts a function literal. - `util/bsearch`: only supports `sorted` and `target` parameters. I view it as a new function. - `util/dedup`: add the `eq` parameter. From 3cb78ea9d48cc660bfcc7f250eac8eea333abb41 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Thu, 18 Feb 2021 10:53:35 +0800 Subject: [PATCH 91/99] update to 3.0 --- README.md | 2 +- .../{lib2x-line3d-1.JPG => lib3x-line3d-1.JPG} | Bin .../{lib2x-line3d-2.JPG => lib3x-line3d-2.JPG} | Bin .../{lib2x-line3d-3.JPG => lib3x-line3d-3.JPG} | Bin docs/{lib2x-line3d.md => lib3x-line3d.md} | 14 +++++++------- examples/turtle/tree.scad | 12 ++++++------ src/line3d.scad | 6 +++--- 7 files changed, 17 insertions(+), 17 deletions(-) rename docs/images/{lib2x-line3d-1.JPG => lib3x-line3d-1.JPG} (100%) rename docs/images/{lib2x-line3d-2.JPG => lib3x-line3d-2.JPG} (100%) rename docs/images/{lib2x-line3d-3.JPG => lib3x-line3d-3.JPG} (100%) rename docs/{lib2x-line3d.md => lib3x-line3d.md} (85%) diff --git a/README.md b/README.md index f28f8cbe..6bb5a059 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [crystal_ball](https://openhome.cc/eGossip/OpenSCAD/lib3x-crystal_ball.html) - [function_grapher](https://openhome.cc/eGossip/OpenSCAD/lib3x-function_grapher.html) - [hull_polyline3d](https://openhome.cc/eGossip/OpenSCAD/lib3x-hull_polyline3d.html) -- [line3d](https://openhome.cc/eGossip/OpenSCAD/lib2x-line3d.html) +- [line3d](https://openhome.cc/eGossip/OpenSCAD/lib3x-line3d.html) - [loft](https://openhome.cc/eGossip/OpenSCAD/lib2x-loft.html) - [polyhedron_hull](https://openhome.cc/eGossip/OpenSCAD/lib2x-polyhedron_hull.html) - [polyline3d](https://openhome.cc/eGossip/OpenSCAD/lib2x-polyline3d.html) diff --git a/docs/images/lib2x-line3d-1.JPG b/docs/images/lib3x-line3d-1.JPG similarity index 100% rename from docs/images/lib2x-line3d-1.JPG rename to docs/images/lib3x-line3d-1.JPG diff --git a/docs/images/lib2x-line3d-2.JPG b/docs/images/lib3x-line3d-2.JPG similarity index 100% rename from docs/images/lib2x-line3d-2.JPG rename to docs/images/lib3x-line3d-2.JPG diff --git a/docs/images/lib2x-line3d-3.JPG b/docs/images/lib3x-line3d-3.JPG similarity index 100% rename from docs/images/lib2x-line3d-3.JPG rename to docs/images/lib3x-line3d-3.JPG diff --git a/docs/lib2x-line3d.md b/docs/lib3x-line3d.md similarity index 85% rename from docs/lib2x-line3d.md rename to docs/lib3x-line3d.md index cff01605..f4a6fd14 100644 --- a/docs/lib2x-line3d.md +++ b/docs/lib3x-line3d.md @@ -6,7 +6,7 @@ Creates a 3D line from two points. - `p1` : 3 element vector `[x, y, z]`. - `p2` : 3 element vector `[x, y, z]`. -- `thickness` : The line thickness. +- `diameter` : The line diameter. Default to 1. - `p1Style` : The end-cap style of the point `p1`. The value must be `"CAP_BUTT"`, `"CAP_CIRCLE"` or `"CAP_SPHERE"`. The default value is `"CAP_CIRCLE"`. - `p2Style` : The end-cap style of the point `p2`. The value must be `"CAP_BUTT"`, `"CAP_CIRCLE"` or `"CAP_SPHERE"`. The default value is `"CAP_CIRCLE"`. - `$fa`, `$fs`, `$fn` : Used by the `circle` or `sphere` module internally. Check [the circle module](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Using_the_2D_Subsystem#circle) or [the sphere module](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Primitive_Solids#sphere) for more details. The final fragments of a circle will be a multiple of 4 to fit edges. @@ -18,34 +18,34 @@ Creates a 3D line from two points. line3d( p1 = [0, 0, 0], p2 = [10, 2, 10], - thickness = 1, + diameter = 1, $fn = 24 ); -![line3d](images/lib2x-line3d-1.JPG) +![line3d](images/lib3x-line3d-1.JPG) use ; line3d( p1 = [0, 0, 0], p2 = [10, 2, 10], - thickness = 1, + diameter = 1, p1Style = "CAP_BUTT", p2Style = "CAP_BUTT", $fn = 24 ); -![line3d](images/lib2x-line3d-2.JPG) +![line3d](images/lib3x-line3d-2.JPG) use ; line3d( p1 = [0, 0, 0], p2 = [10, 2, 10], - thickness = 1, + diameter = 1, p1Style = "CAP_SPHERE", p2Style = "CAP_SPHERE", $fn = 24 ); -![line3d](images/lib2x-line3d-3.JPG) +![line3d](images/lib3x-line3d-3.JPG) diff --git a/examples/turtle/tree.scad b/examples/turtle/tree.scad index 145f1a08..50cf0930 100644 --- a/examples/turtle/tree.scad +++ b/examples/turtle/tree.scad @@ -2,25 +2,25 @@ use ; use ; module tree(t, leng, leng_scale1, leng_scale2, leng_limit, - angleZ, angleX, width) { + angleZ, angleX, diameter) { if(leng > leng_limit) { t2 = t3d(t, "xforward", leng = leng); line3d( t3d(t, "point"), t3d(t2, "point"), - width); + diameter); tree( t3d(t2, "zturn", angle = angleZ), leng * leng_scale1, leng_scale1, leng_scale2, leng_limit, angleZ, angleX, - width); + diameter); tree( t3d(t2, "xturn", angle = angleX), leng * leng_scale2, leng_scale1, leng_scale2, leng_limit, angleZ, angleX, - width); + diameter); } } @@ -30,9 +30,9 @@ leng_scale1 = 0.4; leng_scale2 = 0.9; angleZ = 60; angleX = 135; -width = 2; +diameter = 2; t = t3d(point = [0, 0, 0]); tree(t, leng, leng_scale1, leng_scale2, leng_limit, - angleZ, angleX, width); \ No newline at end of file + angleZ, angleX, diameter); \ No newline at end of file diff --git a/src/line3d.scad b/src/line3d.scad index b643965f..2f25b062 100644 --- a/src/line3d.scad +++ b/src/line3d.scad @@ -4,15 +4,15 @@ * @copyright Justin Lin, 2017 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-line3d.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-line3d.html * **/ use <__comm__/__frags.scad>; use <__comm__/__nearest_multiple_of_4.scad>; -module line3d(p1, p2, thickness, p1Style = "CAP_CIRCLE", p2Style = "CAP_CIRCLE") { - r = thickness / 2; +module line3d(p1, p2, diameter = 1, p1Style = "CAP_CIRCLE", p2Style = "CAP_CIRCLE") { + r = diameter / 2; frags = __nearest_multiple_of_4(__frags(r)); half_fa = 180 / frags; From 2147ff2abf002808e17102ed074a3ee5fa2cc8a1 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Thu, 18 Feb 2021 10:54:00 +0800 Subject: [PATCH 92/99] update --- src/experimental/note.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/experimental/note.md b/src/experimental/note.md index 2512a7f2..6892a4cc 100644 --- a/src/experimental/note.md +++ b/src/experimental/note.md @@ -6,6 +6,7 @@ dotSCAD 3.0 Dev - `function_grapher`: delete `slicing` parameter. Improve `"LINES"`、`"HULL_LINES"` performance. - `hull_polyline3d`: Rename the parameter `thickness` to `diameter`. +- `line3d`: Rename the parameter `thickness` to `diameter`. - `util/sort`: `by` accepts a function literal. - `util/bsearch`: only supports `sorted` and `target` parameters. I view it as a new function. - `util/dedup`: add the `eq` parameter. From b110c3964d9bd2aba8d20c318f61363b61a30cd1 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Fri, 19 Feb 2021 11:17:15 +0800 Subject: [PATCH 93/99] change param name --- test/test_line3d.scad | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/test_line3d.scad b/test/test_line3d.scad index efb6093f..4f0cd236 100644 --- a/test/test_line3d.scad +++ b/test/test_line3d.scad @@ -4,10 +4,10 @@ include ; module test_line3d_butt(p, r, frags, length, angles) { p1 = [0, 0, 0]; p2 = [10, 2, 10]; - thickness = 1; + diameter = 1; fn = 24; assertEqualPoint(p1, p); - assertEqualNum(thickness / 2, r); + assertEqualNum(diameter / 2, r); assertEqualNum(fn, frags); assertEqualNum(14.2829, length); assertEqualPoint([0, 45.5618, 11.3099], angles); @@ -16,10 +16,10 @@ module test_line3d_butt(p, r, frags, length, angles) { module test_line3d_cap(p, r, frags, cap_leng, angles) { p1 = [0, 0, 0]; p2 = [10, 2, 10]; - thickness = 1; + diameter = 1; fn = 24; assert(p == p1 || p == p2); - assertEqualNum(thickness / 2, r); + assertEqualNum(diameter / 2, r); assertEqualNum(fn, frags); assertEqualNum(0.3536, cap_leng); assertEqualPoint([0, 45.5618, 11.3099], angles); @@ -28,7 +28,7 @@ module test_line3d_cap(p, r, frags, cap_leng, angles) { module test_line3d() { p1 = [0, 0, 0]; p2 = [10, 2, 10]; - thickness = 1; + diameter = 1; fn = 24; echo("==== test_line3d_default_caps ===="); @@ -36,7 +36,7 @@ module test_line3d() { line3d( p1 = p1, p2 = p2, - thickness = thickness, + diameter = diameter, $fn = fn ); } From 89c682a80902cc5354df1f64016710e0c26ce246 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Fri, 19 Feb 2021 11:24:34 +0800 Subject: [PATCH 94/99] update to 3.0 --- README.md | 6 +++--- .../{lib2x-loft-1.JPG => lib3x-loft-1.JPG} | Bin ...hull-1.JPG => lib3x-polyhedron_hull-1.JPG} | Bin ...olyline3d-1.JPG => lib3x-polyline3d-1.JPG} | Bin ...olyline3d-2.JPG => lib3x-polyline3d-2.JPG} | Bin ...olyline3d-3.JPG => lib3x-polyline3d-3.JPG} | Bin ...olyline3d-4.JPG => lib3x-polyline3d-4.JPG} | Bin docs/{lib2x-loft.md => lib3x-loft.md} | 2 +- ...edron_hull.md => lib3x-polyhedron_hull.md} | 2 +- ...ib2x-polyline3d.md => lib3x-polyline3d.md} | 18 +++++++++--------- examples/stick_tower.scad | 12 ++++++------ src/loft.scad | 2 +- src/polyhedron_hull.scad | 2 +- src/polyline3d.scad | 12 ++++++------ 14 files changed, 28 insertions(+), 28 deletions(-) rename docs/images/{lib2x-loft-1.JPG => lib3x-loft-1.JPG} (100%) rename docs/images/{lib2x-polyhedron_hull-1.JPG => lib3x-polyhedron_hull-1.JPG} (100%) rename docs/images/{lib2x-polyline3d-1.JPG => lib3x-polyline3d-1.JPG} (100%) rename docs/images/{lib2x-polyline3d-2.JPG => lib3x-polyline3d-2.JPG} (100%) rename docs/images/{lib2x-polyline3d-3.JPG => lib3x-polyline3d-3.JPG} (100%) rename docs/images/{lib2x-polyline3d-4.JPG => lib3x-polyline3d-4.JPG} (100%) rename docs/{lib2x-loft.md => lib3x-loft.md} (97%) rename docs/{lib2x-polyhedron_hull.md => lib3x-polyhedron_hull.md} (87%) rename docs/{lib2x-polyline3d.md => lib3x-polyline3d.md} (84%) diff --git a/README.md b/README.md index 6bb5a059..efdf2bdc 100644 --- a/README.md +++ b/README.md @@ -59,9 +59,9 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [function_grapher](https://openhome.cc/eGossip/OpenSCAD/lib3x-function_grapher.html) - [hull_polyline3d](https://openhome.cc/eGossip/OpenSCAD/lib3x-hull_polyline3d.html) - [line3d](https://openhome.cc/eGossip/OpenSCAD/lib3x-line3d.html) -- [loft](https://openhome.cc/eGossip/OpenSCAD/lib2x-loft.html) -- [polyhedron_hull](https://openhome.cc/eGossip/OpenSCAD/lib2x-polyhedron_hull.html) -- [polyline3d](https://openhome.cc/eGossip/OpenSCAD/lib2x-polyline3d.html) +- [loft](https://openhome.cc/eGossip/OpenSCAD/lib3x-loft.html) +- [polyhedron_hull](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyhedron_hull.html) +- [polyline3d](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyline3d.html) - [rounded_cube](https://openhome.cc/eGossip/OpenSCAD/lib2x-rounded_cube.html) - [rounded_cylinder](https://openhome.cc/eGossip/OpenSCAD/lib2x-rounded_cylinder.html) - [starburst](https://openhome.cc/eGossip/OpenSCAD/lib2x-starburst.html) diff --git a/docs/images/lib2x-loft-1.JPG b/docs/images/lib3x-loft-1.JPG similarity index 100% rename from docs/images/lib2x-loft-1.JPG rename to docs/images/lib3x-loft-1.JPG diff --git a/docs/images/lib2x-polyhedron_hull-1.JPG b/docs/images/lib3x-polyhedron_hull-1.JPG similarity index 100% rename from docs/images/lib2x-polyhedron_hull-1.JPG rename to docs/images/lib3x-polyhedron_hull-1.JPG diff --git a/docs/images/lib2x-polyline3d-1.JPG b/docs/images/lib3x-polyline3d-1.JPG similarity index 100% rename from docs/images/lib2x-polyline3d-1.JPG rename to docs/images/lib3x-polyline3d-1.JPG diff --git a/docs/images/lib2x-polyline3d-2.JPG b/docs/images/lib3x-polyline3d-2.JPG similarity index 100% rename from docs/images/lib2x-polyline3d-2.JPG rename to docs/images/lib3x-polyline3d-2.JPG diff --git a/docs/images/lib2x-polyline3d-3.JPG b/docs/images/lib3x-polyline3d-3.JPG similarity index 100% rename from docs/images/lib2x-polyline3d-3.JPG rename to docs/images/lib3x-polyline3d-3.JPG diff --git a/docs/images/lib2x-polyline3d-4.JPG b/docs/images/lib3x-polyline3d-4.JPG similarity index 100% rename from docs/images/lib2x-polyline3d-4.JPG rename to docs/images/lib3x-polyline3d-4.JPG diff --git a/docs/lib2x-loft.md b/docs/lib3x-loft.md similarity index 97% rename from docs/lib2x-loft.md rename to docs/lib3x-loft.md index fcba104d..e00e6d0f 100644 --- a/docs/lib2x-loft.md +++ b/docs/lib3x-loft.md @@ -43,7 +43,7 @@ When having uniform cross sections, you can use [sweep](https://openhome.cc/eGos ); } -![loft](images/lib2x-loft-1.JPG) +![loft](images/lib3x-loft-1.JPG) diff --git a/docs/lib2x-polyhedron_hull.md b/docs/lib3x-polyhedron_hull.md similarity index 87% rename from docs/lib2x-polyhedron_hull.md rename to docs/lib3x-polyhedron_hull.md index b08dfd95..cb5770f9 100644 --- a/docs/lib2x-polyhedron_hull.md +++ b/docs/lib3x-polyhedron_hull.md @@ -22,4 +22,4 @@ Create a convex polyhedron by hulling a list of points. It avoids using `hull` a [0, 0, -1] ]); -![polyhedron_hull](images/lib2x-polyhedron_hull-1.JPG) \ No newline at end of file +![polyhedron_hull](images/lib3x-polyhedron_hull-1.JPG) \ No newline at end of file diff --git a/docs/lib2x-polyline3d.md b/docs/lib3x-polyline3d.md similarity index 84% rename from docs/lib2x-polyline3d.md rename to docs/lib3x-polyline3d.md index 0d3db4fa..07d21eef 100644 --- a/docs/lib2x-polyline3d.md +++ b/docs/lib3x-polyline3d.md @@ -5,7 +5,7 @@ Creates a polyline from a list of `[x, y, z]` coordinates. ## Parameters - `points` : The list of `[x, y, z]` points of the polyline. The points are indexed from 0 to n-1. -- `thickness` : The line thickness. +- `diameter` : The line diameter. - `startingStyle` : The end-cap style of the starting point. The value must be `"CAP_BUTT"`, `"CAP_CIRCLE"` or `"CAP_SPHERE"`. The default value is `"CAP_CIRCLE"`. - `endingStyle` : The end-cap style of the ending point. The value must be `"CAP_BUTT"`, `"CAP_CIRCLE"` or `"CAP_SPHERE"`. The default value is `"CAP_CIRCLE"`. - `$fa`, `$fs`, `$fn` : Used by the `circle` or `sphere` module internally. Check [the circle module](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Using_the_2D_Subsystem#circle) or [the sphere module](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Primitive_Solids#sphere) for more details. The final fragments of a circle will be a multiple of 4 to fit edges if possible. @@ -21,11 +21,11 @@ Creates a polyline from a list of `[x, y, z]` coordinates. [-5, 3, 3], [5, 5, 4] ], - thickness = 1, + diameter = 1, $fn = 24 ); -![polyline3d](images/lib2x-polyline3d-1.JPG) +![polyline3d](images/lib3x-polyline3d-1.JPG) use ; @@ -36,12 +36,12 @@ Creates a polyline from a list of `[x, y, z]` coordinates. [-5, 3, 3], [5, 5, 4] ], - thickness = 1, + diameter = 1, endingStyle = "CAP_SPHERE", $fn = 24 ); -![polyline3d](images/lib2x-polyline3d-2.JPG) +![polyline3d](images/lib3x-polyline3d-2.JPG) use ; @@ -52,13 +52,13 @@ Creates a polyline from a list of `[x, y, z]` coordinates. [-5, 3, 3], [5, 5, 4] ], - thickness = 1, + diameter = 1, startingStyle = "CAP_SPHERE", endingStyle = "CAP_SPHERE", $fn = 24 ); -![polyline3d](images/lib2x-polyline3d-3.JPG) +![polyline3d](images/lib3x-polyline3d-3.JPG) use ; @@ -71,6 +71,6 @@ Creates a polyline from a list of `[x, y, z]` coordinates. for(a = [0:fa:360 * circles]) [r * cos(a), r * sin(a), h / (360 / fa) * (a / fa)] ]; - polyline3d(points, thickness = 1, $fn = 24); + polyline3d(points, diameter = 1, $fn = 24); -![polyline3d](images/lib2x-polyline3d-4.JPG) \ No newline at end of file +![polyline3d](images/lib3x-polyline3d-4.JPG) \ No newline at end of file diff --git a/examples/stick_tower.scad b/examples/stick_tower.scad index 6776f79e..3d22853a 100644 --- a/examples/stick_tower.scad +++ b/examples/stick_tower.scad @@ -3,7 +3,7 @@ use ; /* [Basic] */ stick_leng = 80; -stick_thickness = 5; +stick_diameter = 5; inner_square_leng = 60; leng_diff = 1.75; min_leng = 13; @@ -15,7 +15,7 @@ cap_style = "CAP_CIRCLE"; // [CAP_BUTT, CAP_CIRCLE, CAP_SPHERE] angle_offset = 5; layer_offset = 1.2; -module stick_square(inner_square_leng, stick_leng, stick_thickness, cap_style) { +module stick_square(inner_square_leng, stick_leng, stick_diameter, cap_style) { diff_leng = stick_leng - inner_square_leng; half_inner_square_leng = inner_square_leng / 2; half_stick_leng = stick_leng / 2; @@ -24,7 +24,7 @@ module stick_square(inner_square_leng, stick_leng, stick_thickness, cap_style) { line3d( [0, -half_stick_leng, 0], [0, half_stick_leng, 0], - stick_thickness, + stick_diameter, cap_style, cap_style ); @@ -38,7 +38,7 @@ module stick_square(inner_square_leng, stick_leng, stick_thickness, cap_style) { } sticks(); - translate([0, 0, stick_thickness]) + translate([0, 0, stick_diameter]) rotate(90) sticks(); } @@ -71,10 +71,10 @@ module spiral_stack(orig_leng, orig_height, current_leng, leng_diff, min_leng, a } } -height = stick_thickness * layer_offset; +height = stick_diameter * layer_offset; $fn = stick_fn; -spiral_stack(inner_square_leng, stick_thickness * 2, inner_square_leng, leng_diff, min_leng, angle_offset) +spiral_stack(inner_square_leng, stick_diameter * 2, inner_square_leng, leng_diff, min_leng, angle_offset) stick_square( inner_square_leng, stick_leng, diff --git a/src/loft.scad b/src/loft.scad index 2d82441d..d18b89b1 100644 --- a/src/loft.scad +++ b/src/loft.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2020 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-loft.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-loft.html * **/ diff --git a/src/polyhedron_hull.scad b/src/polyhedron_hull.scad index 5d51a6ba..4b0a6197 100644 --- a/src/polyhedron_hull.scad +++ b/src/polyhedron_hull.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2020 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-polyhedron_hull.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-polyhedron_hull.html * **/ diff --git a/src/polyline3d.scad b/src/polyline3d.scad index 6e3c9513..a4974d5b 100644 --- a/src/polyline3d.scad +++ b/src/polyline3d.scad @@ -4,13 +4,13 @@ * @copyright Justin Lin, 2017 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-polyline3d.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-polyline3d.html * **/ use ; -module polyline3d(points, thickness, startingStyle = "CAP_CIRCLE", endingStyle = "CAP_CIRCLE") { +module polyline3d(points, diameter, startingStyle = "CAP_CIRCLE", endingStyle = "CAP_CIRCLE") { leng_pts = len(points); s_styles = [startingStyle, "CAP_BUTT"]; @@ -27,11 +27,11 @@ module polyline3d(points, thickness, startingStyle = "CAP_CIRCLE", endingStyle = p1Style = styles[0]; p2Style = styles[1]; - line3d(p1, p2, thickness, + line3d(p1, p2, diameter, p1Style = p1Style, p2Style = p2Style); // hook for testing - test_polyline3d_line3d_segment(index, p1, p2, thickness, p1Style, p2Style); + test_polyline3d_line3d_segment(index, p1, p2, diameter, p1Style, p2Style); } module polyline3d_inner(index) { @@ -42,7 +42,7 @@ module polyline3d(points, thickness, startingStyle = "CAP_CIRCLE", endingStyle = } if(leng_pts == 2) { - line3d(points[0], points[1], thickness, startingStyle, endingStyle); + line3d(points[0], points[1], diameter, startingStyle, endingStyle); } else { polyline3d_inner(1); @@ -50,6 +50,6 @@ module polyline3d(points, thickness, startingStyle = "CAP_CIRCLE", endingStyle = } // override it to test -module test_polyline3d_line3d_segment(index, point1, point2, thickness, p1Style, p2Style) { +module test_polyline3d_line3d_segment(index, point1, point2, diameter, p1Style, p2Style) { } \ No newline at end of file From eaeceb04c619ba072919adc07d734b533301a18f Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Fri, 19 Feb 2021 21:29:45 +0800 Subject: [PATCH 95/99] update --- src/experimental/note.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/experimental/note.md b/src/experimental/note.md index 6892a4cc..6ceeb6b1 100644 --- a/src/experimental/note.md +++ b/src/experimental/note.md @@ -7,6 +7,7 @@ dotSCAD 3.0 Dev - `function_grapher`: delete `slicing` parameter. Improve `"LINES"`、`"HULL_LINES"` performance. - `hull_polyline3d`: Rename the parameter `thickness` to `diameter`. - `line3d`: Rename the parameter `thickness` to `diameter`. +- `polyline3d`: Rename the parameter `thickness` to `diameter`. - `util/sort`: `by` accepts a function literal. - `util/bsearch`: only supports `sorted` and `target` parameters. I view it as a new function. - `util/dedup`: add the `eq` parameter. From 07f9c697d78d8f583f08641f88ddb99697d51d9d Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sat, 20 Feb 2021 20:25:58 +0800 Subject: [PATCH 96/99] update to 3.0 --- README.md | 8 ++++---- ...nded_cube-1.JPG => lib3x-rounded_cube-1.JPG} | Bin ...nded_cube-2.JPG => lib3x-rounded_cube-2.JPG} | Bin ...nded_cube-3.JPG => lib3x-rounded_cube-3.JPG} | Bin ...inder-1.JPG => lib3x-rounded_cylinder-1.JPG} | Bin ...2x-starburst-1.JPG => lib3x-starburst-1.JPG} | Bin .../{lib2x-sweep-1.JPG => lib3x-sweep-1.JPG} | Bin .../{lib2x-sweep-10.JPG => lib3x-sweep-10.JPG} | Bin .../{lib2x-sweep-2.JPG => lib3x-sweep-2.JPG} | Bin .../{lib2x-sweep-3.JPG => lib3x-sweep-3.JPG} | Bin .../{lib2x-sweep-4.JPG => lib3x-sweep-4.JPG} | Bin .../{lib2x-sweep-5.JPG => lib3x-sweep-5.JPG} | Bin .../{lib2x-sweep-6.JPG => lib3x-sweep-6.JPG} | Bin .../{lib2x-sweep-7.JPG => lib3x-sweep-7.JPG} | Bin .../{lib2x-sweep-8.JPG => lib3x-sweep-8.JPG} | Bin .../{lib2x-sweep-9.JPG => lib3x-sweep-9.JPG} | Bin ...2x-rounded_cube.md => lib3x-rounded_cube.md} | 8 ++++---- ...ed_cylinder.md => lib3x-rounded_cylinder.md} | 2 +- docs/{lib2x-starburst.md => lib3x-starburst.md} | 4 ++-- docs/{lib2x-sweep.md => lib3x-sweep.md} | 16 ++++++++-------- src/rounded_cube.scad | 2 +- src/rounded_cylinder.scad | 2 +- src/starburst.scad | 2 +- src/sweep.scad | 2 +- 24 files changed, 23 insertions(+), 23 deletions(-) rename docs/images/{lib2x-rounded_cube-1.JPG => lib3x-rounded_cube-1.JPG} (100%) rename docs/images/{lib2x-rounded_cube-2.JPG => lib3x-rounded_cube-2.JPG} (100%) rename docs/images/{lib2x-rounded_cube-3.JPG => lib3x-rounded_cube-3.JPG} (100%) rename docs/images/{lib2x-rounded_cylinder-1.JPG => lib3x-rounded_cylinder-1.JPG} (100%) rename docs/images/{lib2x-starburst-1.JPG => lib3x-starburst-1.JPG} (100%) rename docs/images/{lib2x-sweep-1.JPG => lib3x-sweep-1.JPG} (100%) rename docs/images/{lib2x-sweep-10.JPG => lib3x-sweep-10.JPG} (100%) rename docs/images/{lib2x-sweep-2.JPG => lib3x-sweep-2.JPG} (100%) rename docs/images/{lib2x-sweep-3.JPG => lib3x-sweep-3.JPG} (100%) rename docs/images/{lib2x-sweep-4.JPG => lib3x-sweep-4.JPG} (100%) rename docs/images/{lib2x-sweep-5.JPG => lib3x-sweep-5.JPG} (100%) rename docs/images/{lib2x-sweep-6.JPG => lib3x-sweep-6.JPG} (100%) rename docs/images/{lib2x-sweep-7.JPG => lib3x-sweep-7.JPG} (100%) rename docs/images/{lib2x-sweep-8.JPG => lib3x-sweep-8.JPG} (100%) rename docs/images/{lib2x-sweep-9.JPG => lib3x-sweep-9.JPG} (100%) rename docs/{lib2x-rounded_cube.md => lib3x-rounded_cube.md} (79%) rename docs/{lib2x-rounded_cylinder.md => lib3x-rounded_cylinder.md} (93%) rename docs/{lib2x-starburst.md => lib3x-starburst.md} (88%) rename docs/{lib2x-sweep.md => lib3x-sweep.md} (89%) diff --git a/README.md b/README.md index efdf2bdc..e348a2f6 100644 --- a/README.md +++ b/README.md @@ -62,10 +62,10 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [loft](https://openhome.cc/eGossip/OpenSCAD/lib3x-loft.html) - [polyhedron_hull](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyhedron_hull.html) - [polyline3d](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyline3d.html) -- [rounded_cube](https://openhome.cc/eGossip/OpenSCAD/lib2x-rounded_cube.html) -- [rounded_cylinder](https://openhome.cc/eGossip/OpenSCAD/lib2x-rounded_cylinder.html) -- [starburst](https://openhome.cc/eGossip/OpenSCAD/lib2x-starburst.html) -- [sweep](https://openhome.cc/eGossip/OpenSCAD/lib2x-sweep.html) +- [rounded_cube](https://openhome.cc/eGossip/OpenSCAD/lib3x-rounded_cube.html) +- [rounded_cylinder](https://openhome.cc/eGossip/OpenSCAD/lib3x-rounded_cylinder.html) +- [starburst](https://openhome.cc/eGossip/OpenSCAD/lib3x-starburst.html) +- [sweep](https://openhome.cc/eGossip/OpenSCAD/lib3x-sweep.html) ### Transformation - [along_with](https://openhome.cc/eGossip/OpenSCAD/lib2x-along_with.html) diff --git a/docs/images/lib2x-rounded_cube-1.JPG b/docs/images/lib3x-rounded_cube-1.JPG similarity index 100% rename from docs/images/lib2x-rounded_cube-1.JPG rename to docs/images/lib3x-rounded_cube-1.JPG diff --git a/docs/images/lib2x-rounded_cube-2.JPG b/docs/images/lib3x-rounded_cube-2.JPG similarity index 100% rename from docs/images/lib2x-rounded_cube-2.JPG rename to docs/images/lib3x-rounded_cube-2.JPG diff --git a/docs/images/lib2x-rounded_cube-3.JPG b/docs/images/lib3x-rounded_cube-3.JPG similarity index 100% rename from docs/images/lib2x-rounded_cube-3.JPG rename to docs/images/lib3x-rounded_cube-3.JPG diff --git a/docs/images/lib2x-rounded_cylinder-1.JPG b/docs/images/lib3x-rounded_cylinder-1.JPG similarity index 100% rename from docs/images/lib2x-rounded_cylinder-1.JPG rename to docs/images/lib3x-rounded_cylinder-1.JPG diff --git a/docs/images/lib2x-starburst-1.JPG b/docs/images/lib3x-starburst-1.JPG similarity index 100% rename from docs/images/lib2x-starburst-1.JPG rename to docs/images/lib3x-starburst-1.JPG diff --git a/docs/images/lib2x-sweep-1.JPG b/docs/images/lib3x-sweep-1.JPG similarity index 100% rename from docs/images/lib2x-sweep-1.JPG rename to docs/images/lib3x-sweep-1.JPG diff --git a/docs/images/lib2x-sweep-10.JPG b/docs/images/lib3x-sweep-10.JPG similarity index 100% rename from docs/images/lib2x-sweep-10.JPG rename to docs/images/lib3x-sweep-10.JPG diff --git a/docs/images/lib2x-sweep-2.JPG b/docs/images/lib3x-sweep-2.JPG similarity index 100% rename from docs/images/lib2x-sweep-2.JPG rename to docs/images/lib3x-sweep-2.JPG diff --git a/docs/images/lib2x-sweep-3.JPG b/docs/images/lib3x-sweep-3.JPG similarity index 100% rename from docs/images/lib2x-sweep-3.JPG rename to docs/images/lib3x-sweep-3.JPG diff --git a/docs/images/lib2x-sweep-4.JPG b/docs/images/lib3x-sweep-4.JPG similarity index 100% rename from docs/images/lib2x-sweep-4.JPG rename to docs/images/lib3x-sweep-4.JPG diff --git a/docs/images/lib2x-sweep-5.JPG b/docs/images/lib3x-sweep-5.JPG similarity index 100% rename from docs/images/lib2x-sweep-5.JPG rename to docs/images/lib3x-sweep-5.JPG diff --git a/docs/images/lib2x-sweep-6.JPG b/docs/images/lib3x-sweep-6.JPG similarity index 100% rename from docs/images/lib2x-sweep-6.JPG rename to docs/images/lib3x-sweep-6.JPG diff --git a/docs/images/lib2x-sweep-7.JPG b/docs/images/lib3x-sweep-7.JPG similarity index 100% rename from docs/images/lib2x-sweep-7.JPG rename to docs/images/lib3x-sweep-7.JPG diff --git a/docs/images/lib2x-sweep-8.JPG b/docs/images/lib3x-sweep-8.JPG similarity index 100% rename from docs/images/lib2x-sweep-8.JPG rename to docs/images/lib3x-sweep-8.JPG diff --git a/docs/images/lib2x-sweep-9.JPG b/docs/images/lib3x-sweep-9.JPG similarity index 100% rename from docs/images/lib2x-sweep-9.JPG rename to docs/images/lib3x-sweep-9.JPG diff --git a/docs/lib2x-rounded_cube.md b/docs/lib3x-rounded_cube.md similarity index 79% rename from docs/lib2x-rounded_cube.md rename to docs/lib3x-rounded_cube.md index 2dbacc9a..f760c4db 100644 --- a/docs/lib2x-rounded_cube.md +++ b/docs/lib3x-rounded_cube.md @@ -1,6 +1,6 @@ # rounded_cube -Creates a cube in the first octant. When `center` is `true`, the cube is centered on the origin. +Creates a cube in the first octant. ## Parameters @@ -15,7 +15,7 @@ Creates a cube in the first octant. When `center` is `true`, the cube is centere rounded_cube(20, 5); -![rounded_cube](images/lib2x-rounded_cube-1.JPG) +![rounded_cube](images/lib3x-rounded_cube-1.JPG) use ; @@ -25,7 +25,7 @@ Creates a cube in the first octant. When `center` is `true`, the cube is centere center = true ); -![rounded_cube](images/lib2x-rounded_cube-2.JPG) +![rounded_cube](images/lib3x-rounded_cube-2.JPG) use ; @@ -37,7 +37,7 @@ Creates a cube in the first octant. When `center` is `true`, the cube is centere center = true ); -![rounded_cube](images/lib2x-rounded_cube-3.JPG) +![rounded_cube](images/lib3x-rounded_cube-3.JPG) diff --git a/docs/lib2x-rounded_cylinder.md b/docs/lib3x-rounded_cylinder.md similarity index 93% rename from docs/lib2x-rounded_cylinder.md rename to docs/lib3x-rounded_cylinder.md index 5d6eed03..6ae781f6 100644 --- a/docs/lib2x-rounded_cylinder.md +++ b/docs/lib3x-rounded_cylinder.md @@ -21,4 +21,4 @@ Creates a rounded cylinder. round_r = 3 ); -![rounded_cylinder](images/lib2x-rounded_cylinder-1.JPG) \ No newline at end of file +![rounded_cylinder](images/lib3x-rounded_cylinder-1.JPG) \ No newline at end of file diff --git a/docs/lib2x-starburst.md b/docs/lib3x-starburst.md similarity index 88% rename from docs/lib2x-starburst.md rename to docs/lib3x-starburst.md index 704533f5..e75aebdf 100644 --- a/docs/lib2x-starburst.md +++ b/docs/lib3x-starburst.md @@ -2,7 +2,7 @@ A 3D version of `shape_starburst`. -**Since:** 1.2. +**Since:** 1.2 ## Parameters @@ -20,5 +20,5 @@ A 3D version of `shape_starburst`. translate([40, 0, 0]) starburst(10, 5, 12, 10); translate([60, 0, 0]) starburst(10, 5, 4, 3); -![starburst](images/lib2x-starburst-1.JPG) +![starburst](images/lib3x-starburst-1.JPG) diff --git a/docs/lib2x-sweep.md b/docs/lib3x-sweep.md similarity index 89% rename from docs/lib2x-sweep.md rename to docs/lib3x-sweep.md index fac03ecd..33ce428f 100644 --- a/docs/lib2x-sweep.md +++ b/docs/lib3x-sweep.md @@ -2,23 +2,23 @@ This module sweeps multiple cross-sections to create a 3D object. For example, imagine that you have the following cross-sections: -![sweep](images/lib2x-sweep-1.JPG) +![sweep](images/lib3x-sweep-1.JPG) This module sweeps them to create a 3D object: -![sweep](images/lib2x-sweep-2.JPG) +![sweep](images/lib3x-sweep-2.JPG) When using this module, you should use points to represent a cross section. The points must be counter-clockwise indexes. For example: -![sweep](images/lib2x-sweep-10.JPG) +![sweep](images/lib3x-sweep-10.JPG) If your cross section is hollow, set the `triangles` parameter to `"HOLLOW"` and index the points as the following: -![sweep](images/lib2x-sweep-5.JPG) +![sweep](images/lib3x-sweep-5.JPG) You can cut triangles by yourself. For example, the above shape can be cut into triangles such as: -![sweep](images/lib2x-sweep-6.JPG) +![sweep](images/lib3x-sweep-6.JPG) The indexes of the above triangles is: @@ -62,7 +62,7 @@ The indexes of the above triangles is: sweep(sections); -![sweep](images/lib2x-sweep-7.JPG) +![sweep](images/lib3x-sweep-7.JPG) use ; use ; @@ -92,7 +92,7 @@ The indexes of the above triangles is: sweep(sections, "HOLLOW"); -![sweep](images/lib2x-sweep-8.JPG) +![sweep](images/lib3x-sweep-8.JPG) use ; use ; @@ -130,7 +130,7 @@ The indexes of the above triangles is: ] ); -![sweep](images/lib2x-sweep-9.JPG) +![sweep](images/lib3x-sweep-9.JPG) diff --git a/src/rounded_cube.scad b/src/rounded_cube.scad index 457638ec..85d4a972 100644 --- a/src/rounded_cube.scad +++ b/src/rounded_cube.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2017 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-rounded_cube.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-rounded_cube.html * **/ diff --git a/src/rounded_cylinder.scad b/src/rounded_cylinder.scad index 1301440d..b6bb5eea 100644 --- a/src/rounded_cylinder.scad +++ b/src/rounded_cylinder.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2017 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-rounded_cylinder.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-rounded_cylinder.html * **/ diff --git a/src/starburst.scad b/src/starburst.scad index 90d9fc63..e5e999f6 100644 --- a/src/starburst.scad +++ b/src/starburst.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2019 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-starburst.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-starburst.html * **/ diff --git a/src/sweep.scad b/src/sweep.scad index 6e65d81e..627afac7 100644 --- a/src/sweep.scad +++ b/src/sweep.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2020 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-sweep.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-sweep.html * **/ From da12c224437cbab540324f8ed6c9a4b719a0374c Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 21 Feb 2021 22:47:09 +0800 Subject: [PATCH 97/99] update to 3.0 --- README.md | 8 ++++---- ...ib2x-along_with-1.JPG => lib3x-along_with-1.JPG} | Bin ...ib2x-along_with-2.JPG => lib3x-along_with-2.JPG} | Bin ...ib2x-along_with-3.JPG => lib3x-along_with-3.JPG} | Bin ...ib2x-along_with-4.JPG => lib3x-along_with-4.JPG} | Bin docs/images/{lib2x-bend-1.JPG => lib3x-bend-1.JPG} | Bin docs/images/{lib2x-bend-2.JPG => lib3x-bend-2.JPG} | Bin docs/images/{lib2x-bend-3.JPG => lib3x-bend-3.JPG} | Bin ...ib2x-hollow_out-1.JPG => lib3x-hollow_out-1.JPG} | Bin .../images/{lib2x-shear-1.JPG => lib3x-shear-1.JPG} | Bin docs/{lib2x-along_with.md => lib3x-along_with.md} | 10 +++++----- docs/{lib2x-bend.md => lib3x-bend.md} | 6 +++--- docs/{lib2x-hollow_out.md => lib3x-hollow_out.md} | 2 +- docs/{lib2x-shear.md => lib3x-shear.md} | 2 +- src/along_with.scad | 2 +- src/bend.scad | 2 +- src/hollow_out.scad | 2 +- src/shear.scad | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) rename docs/images/{lib2x-along_with-1.JPG => lib3x-along_with-1.JPG} (100%) rename docs/images/{lib2x-along_with-2.JPG => lib3x-along_with-2.JPG} (100%) rename docs/images/{lib2x-along_with-3.JPG => lib3x-along_with-3.JPG} (100%) rename docs/images/{lib2x-along_with-4.JPG => lib3x-along_with-4.JPG} (100%) rename docs/images/{lib2x-bend-1.JPG => lib3x-bend-1.JPG} (100%) rename docs/images/{lib2x-bend-2.JPG => lib3x-bend-2.JPG} (100%) rename docs/images/{lib2x-bend-3.JPG => lib3x-bend-3.JPG} (100%) rename docs/images/{lib2x-hollow_out-1.JPG => lib3x-hollow_out-1.JPG} (100%) rename docs/images/{lib2x-shear-1.JPG => lib3x-shear-1.JPG} (100%) rename docs/{lib2x-along_with.md => lib3x-along_with.md} (91%) rename docs/{lib2x-bend.md => lib3x-bend.md} (92%) rename docs/{lib2x-hollow_out.md => lib3x-hollow_out.md} (86%) rename docs/{lib2x-shear.md => lib3x-shear.md} (96%) diff --git a/README.md b/README.md index e348a2f6..85cb81b6 100644 --- a/README.md +++ b/README.md @@ -68,10 +68,10 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [sweep](https://openhome.cc/eGossip/OpenSCAD/lib3x-sweep.html) ### Transformation -- [along_with](https://openhome.cc/eGossip/OpenSCAD/lib2x-along_with.html) -- [bend](https://openhome.cc/eGossip/OpenSCAD/lib2x-bend.html) -- [hollow_out](https://openhome.cc/eGossip/OpenSCAD/lib2x-hollow_out.html) -- [shear](https://openhome.cc/eGossip/OpenSCAD/lib2x-shear.html) +- [along_with](https://openhome.cc/eGossip/OpenSCAD/lib3x-along_with.html) +- [bend](https://openhome.cc/eGossip/OpenSCAD/lib3x-bend.html) +- [hollow_out](https://openhome.cc/eGossip/OpenSCAD/lib3x-hollow_out.html) +- [shear](https://openhome.cc/eGossip/OpenSCAD/lib3x-shear.html) ### 2D Function - [bijection_offset](https://openhome.cc/eGossip/OpenSCAD/lib2x-bijection_offset.html) diff --git a/docs/images/lib2x-along_with-1.JPG b/docs/images/lib3x-along_with-1.JPG similarity index 100% rename from docs/images/lib2x-along_with-1.JPG rename to docs/images/lib3x-along_with-1.JPG diff --git a/docs/images/lib2x-along_with-2.JPG b/docs/images/lib3x-along_with-2.JPG similarity index 100% rename from docs/images/lib2x-along_with-2.JPG rename to docs/images/lib3x-along_with-2.JPG diff --git a/docs/images/lib2x-along_with-3.JPG b/docs/images/lib3x-along_with-3.JPG similarity index 100% rename from docs/images/lib2x-along_with-3.JPG rename to docs/images/lib3x-along_with-3.JPG diff --git a/docs/images/lib2x-along_with-4.JPG b/docs/images/lib3x-along_with-4.JPG similarity index 100% rename from docs/images/lib2x-along_with-4.JPG rename to docs/images/lib3x-along_with-4.JPG diff --git a/docs/images/lib2x-bend-1.JPG b/docs/images/lib3x-bend-1.JPG similarity index 100% rename from docs/images/lib2x-bend-1.JPG rename to docs/images/lib3x-bend-1.JPG diff --git a/docs/images/lib2x-bend-2.JPG b/docs/images/lib3x-bend-2.JPG similarity index 100% rename from docs/images/lib2x-bend-2.JPG rename to docs/images/lib3x-bend-2.JPG diff --git a/docs/images/lib2x-bend-3.JPG b/docs/images/lib3x-bend-3.JPG similarity index 100% rename from docs/images/lib2x-bend-3.JPG rename to docs/images/lib3x-bend-3.JPG diff --git a/docs/images/lib2x-hollow_out-1.JPG b/docs/images/lib3x-hollow_out-1.JPG similarity index 100% rename from docs/images/lib2x-hollow_out-1.JPG rename to docs/images/lib3x-hollow_out-1.JPG diff --git a/docs/images/lib2x-shear-1.JPG b/docs/images/lib3x-shear-1.JPG similarity index 100% rename from docs/images/lib2x-shear-1.JPG rename to docs/images/lib3x-shear-1.JPG diff --git a/docs/lib2x-along_with.md b/docs/lib3x-along_with.md similarity index 91% rename from docs/lib2x-along_with.md rename to docs/lib3x-along_with.md index cb431954..761a924b 100644 --- a/docs/lib2x-along_with.md +++ b/docs/lib3x-along_with.md @@ -8,7 +8,7 @@ Puts children along the given path. If there's only one child, it will put the c - `angles` : Rotate before translate each child. If not given, rotate children automatically according to `points` and `method`. - `twist` : If given, each child will be twisted before applying each element of `points` and `angles`. - `scale` : If given, each child will be scaled before applying each element of `points` and `angles`. It accepts a single value, `[sx, sy]` or `[sx, sy, sz]`. -- `method` : Which method does `along_with` take to **guess** how to rotate children if `angles` is not specified? It accepts two value, `"AXIS_ANGLE"` (default) and `"EULER_ANGLE"`. See `path_extrude` for more information. **Since:** 1.3. +- `method` : Which method does `along_with` take to **guess** how to rotate children if `angles` is not specified? It accepts two value, `"AXIS_ANGLE"` (default) and `"EULER_ANGLE"`. See `path_extrude` for more information. **Since:** 1.3 ## Examples @@ -22,7 +22,7 @@ Puts children along the given path. If there's only one child, it will put the c along_with(points) sphere(5); -![along_with](images/lib2x-along_with-1.JPG) +![along_with](images/lib3x-along_with-1.JPG) use ; use ; @@ -42,7 +42,7 @@ Puts children along the given path. If there's only one child, it will put the c cube(5); } -![along_with](images/lib2x-along_with-2.JPG) +![along_with](images/lib3x-along_with-2.JPG) use ; use ; @@ -61,7 +61,7 @@ Puts children along the given path. If there's only one child, it will put the c linear_extrude(1, center = true) text("A", valign = "center", halign = "center"); -![along_with](images/lib2x-along_with-3.JPG) +![along_with](images/lib3x-along_with-3.JPG) use ; use ; @@ -101,4 +101,4 @@ Puts children along the given path. If there's only one child, it will put the c along_with(path_pts, scale = 0.5) scales(); -![along_with](images/lib2x-along_with-4.JPG) \ No newline at end of file +![along_with](images/lib3x-along_with-4.JPG) \ No newline at end of file diff --git a/docs/lib2x-bend.md b/docs/lib3x-bend.md similarity index 92% rename from docs/lib2x-bend.md rename to docs/lib3x-bend.md index f34cc5f6..8beb5288 100644 --- a/docs/lib2x-bend.md +++ b/docs/lib3x-bend.md @@ -21,7 +21,7 @@ The containing cube of the target object should be laid down on the x-y plane. F %cube(size = [x, y, z]); linear_extrude(z) text("A"); -![bend](images/lib2x-bend-1.JPG) +![bend](images/lib3x-bend-1.JPG) Once you have the size of the containing cube, you can use it as the `size` argument of the `bend` module. @@ -36,7 +36,7 @@ Once you have the size of the containing cube, you can use it as the `size` argu bend(size = [x, y, z], angle = 270) linear_extrude(z) text("A"); -![bend](images/lib2x-bend-2.JPG) +![bend](images/lib3x-bend-2.JPG) The arc shape is smoother if the `frags` value is larger. @@ -50,6 +50,6 @@ The arc shape is smoother if the `frags` value is larger. linear_extrude(z) text("A"); -![bend](images/lib2x-bend-3.JPG) +![bend](images/lib3x-bend-3.JPG) This module is especially useful when you want to create things such as [PNG to pen holder](https://www.thingiverse.com/thing:1589493). diff --git a/docs/lib2x-hollow_out.md b/docs/lib3x-hollow_out.md similarity index 86% rename from docs/lib2x-hollow_out.md rename to docs/lib3x-hollow_out.md index d80d3bb4..f756b67a 100644 --- a/docs/lib2x-hollow_out.md +++ b/docs/lib3x-hollow_out.md @@ -13,4 +13,4 @@ Hollows out a 2D object. hollow_out(shell_thickness = 1) circle(r = 3, $fn = 48); hollow_out(shell_thickness = 1) square([10, 5]); -![hollow_out](images/lib2x-hollow_out-1.JPG) +![hollow_out](images/lib3x-hollow_out-1.JPG) diff --git a/docs/lib2x-shear.md b/docs/lib3x-shear.md similarity index 96% rename from docs/lib2x-shear.md rename to docs/lib3x-shear.md index 15ad6c76..cfa6b201 100644 --- a/docs/lib2x-shear.md +++ b/docs/lib3x-shear.md @@ -48,5 +48,5 @@ Shear all child elements along the X-axis, Y-axis, or Z-axis in 3D. cube(1); } -![shear](images/lib2x-shear-1.JPG) +![shear](images/lib3x-shear-1.JPG) diff --git a/src/along_with.scad b/src/along_with.scad index 40fdbee0..4299b4c3 100644 --- a/src/along_with.scad +++ b/src/along_with.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2017 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-along_with.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-along_with.html * **/ diff --git a/src/bend.scad b/src/bend.scad index 4c898ff5..e04c418f 100644 --- a/src/bend.scad +++ b/src/bend.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2017 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-bend.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-bend.html * **/ diff --git a/src/hollow_out.scad b/src/hollow_out.scad index 7a480cd1..bc6dd448 100644 --- a/src/hollow_out.scad +++ b/src/hollow_out.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2017 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-hollow_out.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-hollow_out.html * **/ diff --git a/src/shear.scad b/src/shear.scad index f50377a3..fcea6cc7 100644 --- a/src/shear.scad +++ b/src/shear.scad @@ -4,7 +4,7 @@ * @copyright Justin Lin, 2019 * @license https://opensource.org/licenses/lgpl-3.0.html * -* @see https://openhome.cc/eGossip/OpenSCAD/lib2x-shear.html +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-shear.html * **/ From 6d91fec86d31b6de7785a8bde824c7aa493e96df Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 21 Feb 2021 22:52:30 +0800 Subject: [PATCH 98/99] update markdown --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 85cb81b6..7f7cccd8 100644 --- a/README.md +++ b/README.md @@ -215,7 +215,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp - [surface/sf_solidify](https://openhome.cc/eGossip/OpenSCAD/lib2x-sf_solidify.html) - [surface/sf_sphere](https://openhome.cc/eGossip/OpenSCAD/lib2x-sf_sphere.html) - [surface/sf_square](https://openhome.cc/eGossip/OpenSCAD/lib2x-sf_square.html) -- [surface/sf_torus](https://openhome.cc/eGossip/OpenSCAD/lib2x-sf_torus.html +- [surface/sf_torus](https://openhome.cc/eGossip/OpenSCAD/lib2x-sf_torus.html) ### Noise - [noise/nz_cell](https://openhome.cc/eGossip/OpenSCAD/lib2x-nz_cell.html) From 04a802bfb911930423c0e24af5370bc91b96e8f5 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Mon, 22 Feb 2021 07:52:37 +0800 Subject: [PATCH 99/99] update link --- docs/lib3x-loft.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/lib3x-loft.md b/docs/lib3x-loft.md index e00e6d0f..e3fc69cb 100644 --- a/docs/lib3x-loft.md +++ b/docs/lib3x-loft.md @@ -1,6 +1,6 @@ # loft -When having uniform cross sections, you can use [sweep](https://openhome.cc/eGossip/OpenSCAD/lib2x-sweep.html) to create a model. The `loft` here is best when you have a body with multiple crosssections with different geometries. +When having uniform cross sections, you can use [sweep](https://openhome.cc/eGossip/OpenSCAD/lib3x-sweep.html) to create a model. The `loft` here is best when you have a body with multiple crosssections with different geometries. **Since:** 2.3