From 87d39af9f6f92099fbeb984d399c7aaa080142f7 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Sun, 23 Apr 2017 10:52:45 +0800 Subject: [PATCH] added rounded_cube --- README.md | 1 + docs/images/lib-rounded_cube-1.JPG | Bin 0 -> 16769 bytes docs/images/lib-rounded_cube-2.JPG | Bin 0 -> 16067 bytes docs/images/lib-rounded_cube-3.JPG | Bin 0 -> 15628 bytes docs/lib-rounded_cube.md | 44 ++++++++++++++++++++++ src/rounded_cube.scad | 57 +++++++++++++++++++++++++++++ 6 files changed, 102 insertions(+) create mode 100644 docs/images/lib-rounded_cube-1.JPG create mode 100644 docs/images/lib-rounded_cube-2.JPG create mode 100644 docs/images/lib-rounded_cube-3.JPG create mode 100644 docs/lib-rounded_cube.md create mode 100644 src/rounded_cube.scad diff --git a/README.md b/README.md index 8ea2b427..26b9da14 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ Some modules may depend on other modules. For example, the `polyline2d` module d - [hexagons](https://openhome.cc/eGossip/OpenSCAD/lib-hexagons.html) - 3D + - [rounded_cube](https://openhome.cc/eGossip/OpenSCAD/lib-rounded_cube.html) - [line3d](https://openhome.cc/eGossip/OpenSCAD/lib-line3d.html) - [polyline3d](https://openhome.cc/eGossip/OpenSCAD/lib-polyline3d.html) - [hull_polyline3d](https://openhome.cc/eGossip/OpenSCAD/lib-hull_polyline3d.html) diff --git a/docs/images/lib-rounded_cube-1.JPG b/docs/images/lib-rounded_cube-1.JPG new file mode 100644 index 0000000000000000000000000000000000000000..74601881fc05ffadab2fe6df26b5434d10356b98 GIT binary patch literal 16769 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 literal 0 HcmV?d00001 diff --git a/docs/images/lib-rounded_cube-2.JPG b/docs/images/lib-rounded_cube-2.JPG new file mode 100644 index 0000000000000000000000000000000000000000..465d701f3ee9e3fdc041657cfe279fd4d5b3dce3 GIT binary patch literal 16067 zcmb_@cUV(fx_&I!upGpQ(o{f7A|PG*QJT~kk`RFaqku^0fq+u22q-~H=;Z(sNJ4^i z2<-^cLK8?px|Gm+@BBD3XXc(WGxyHD&-45K*sJVk@4fa~-}kO>t?yk2-w*l#ZvZFR z*iNt=KY4=f#Ho`fPo3dlKXdx@8Q_JV&T?Do1$Xi zTVU?%k}{GYX%P?@bmZizQ)f<}xx~(X3B-Ga7xaIYgD(J%Q%5|GK0F2x036{sa+Kr9 z!B;>z;0WN@k>3RHcR9{>;@HuXr+%yY>z%*X0{};k9y`2w@+ZKNW5Eag+m~4%p)b+`0T;P5rkynKc!+npL3j7c3>Bo9z>1fPwu=b_`q1-IGElf1zQz$^td>*cVzB1#4h+1PrOvFG9!8W0r2(6lU z()+gtKHnmKZt3=y%?=<^)hp9v1D(s3GOYIu-S*ZvJ_!Mi|GUqhd7pE7ac-ShsL;el zWj&}9^6jPH8TT;@A%$vTK%>e(ekogAV@rs z3!bYd!4T?>r3m{ugtzQWokwmceKNGv;ud`rM56j6ZSjRUdi&i&Iuhcbc~5@Rb(1D{_7AsksH@{ssy3caa3D4 ze!$9k)3`vIwg&YK?s9l1zUKP1@nQM2xGqUJmo%hsI$e~O$1)J~to!3I007tj+_E!$ z6&=*R##vAB+o3oz@^M5`dA2ooX-7WQv(8(>t;q4k)vB_6-mt~D7Fq=LrTJBvZ!_MO#cc zKZH(z`F=K=N1T1E(~_Nzvn$LZWigNfRGG@tlj8LElrB$%JoAa8yT#4Nx=V2^V{H<# zHRjCw4{7NSLvZ0enkI!gJ~Hl$tNy05ykKl4%mk*2%P!INB9d^SS^;O}K} zEf(jzq+H7jBF)kH=Ce`M%tB)wgGT?{RTt(<43?xe|qjyi5r_mCGCFYxC>A=+}Z-GVCU=Y8Zsf|JLsNUh0P`7 zVKiKyROP}ZM!gz{y&QW0s4x50c9%0|*;w~`9hpXrLXm9U-k>1RPsbhn=z((@d`_gi zWLgAjd0H&PF}&(bR*5?T>PigrzIgwbIt-g#j?i}=9&fy4;9U!SK95OtM_!Z`CXpIJ zl3pNYD3wV>O%7Znq3uRMM5pz}Pp|seyFk;MmK0x{R?ROj8!MrnzQl3oI!PH=Y8ip> z3KtDR-?x61d|Aj%i<2WeG%HrSkkdv}vs&PyV&B|q5$Ve0@D!qXJ zsj>gNf=odB!Wo@SwI+yt+AE~USoTLSFJ+R3a3uwm(1nHUk0k7Tj87?jI+A?7 zSYt}7*E)N_--MRM@^*UDfzzIgG9Zykd0h;bDjy8*M5pYV!SH|~l zP2!D>+WDO)#p}uQqVfA5R`Yx*DO z(vzSVqh3=VA-5)Is);Bo{9(N^k6>aD3k_O>Yt<9Ik1(!Q(c-ruHN0Za2srg8G!c&VSFbqX?5nT5_K6@-#t)MQruM=(0Dt7ntR@N}h;juGvi)xjQOHRLk z9?raNVq6Q;m38lI{u&|n*jq6|4kkKIa?Hvq)w(CwHN$o|8qGbz(a2Bm)o-H-P=Pd( zR1hgRQQ*+9GP{3RnnAe*CkNx6S)u2I`Y9lAg~pV&@mb(rIiAq!O>C(-~!$ykEv_H*Bt~ZLpVrJ zikaeCex_=nm&>vy${<)9e*|VvjK^}E%jU)Z4OdQzOCJ#=+|@acxhO7 zgsR9CYUgt%zn^CUL`Bi1U^`&c>~Y0*7uWS)b}|nDEcM;0WyP9WW7`4J&_MkLr-P^a zG)7L$&V-GF>?PN}VQdEmky+V|dpLcM(Cv9os4-h4cg_u{Wg^e3EqGE>EEqR!~PHU#Cq z_wzs0&17JHA2QZy{H0Fc1tg)cVzama~3|)o=HOR;{dG-I|7ml#x@I?z@oq z^_(I_^~TQD^_3LJ&X%&P{bprhnJNMyk>S&g!u994<6ABCOa6MLrPPelnio``SVn38 z3J_AMl-H}Z33ce(k}yb1eks`O^iYu1sVlB5P3=5R4GSCiWWT z7>!G>c;nNX{f%i^HmwDRc=`oC2^a*Ka^XJ*{jy=`!VN9&mv2XRe8qaq0 z{9y-xY&#u(+8{jqOrEC2H`yte{kN_{GeY`He>AL(}IV%p5{34oDJGgmw~P^LN&J;44v9b zyj5XNT5280~P zZ*2Dy&chmC0W%f`LSc$pl2fF=WM_mBBA!lU#sv!*e_eGKLKC1Z@E#}>6Y>tm=|4>6 zkDuIj5Dy$|6(Bb+XCt)|?!nvKHdg(?cMPGPwG z0)tu~OS)Lnd4&~%_Hu6pv!_*Ss%R>X^W}-aH3u33(P{1s$Ko$RSWGR5vW=f|9x-F` zeKgf!_bK=i`wq0Nh5AMSkql$T4z}OCF?=uSRc{|LfG;T*dWsfd4E$d}Hvwlrv z&dN~-#cjXYHg|rPJHUGZ*4AXG7W4fcq93#{capB@xcc*v>wkYSbnE<-;ihshSUKe; zn}-zqUe{_3p1a5D%_LbOI}MBcv_&bF1S2CARACf2vAb9PG~%r+Q5 zv-sL+Hn&TMUf6}6gUi6yqGK|pLYbX4cluNfp*qOTF9rK#>fYRqXGSjW?>aXkDqTk7 zap=N^c(=EGS?_OaG!i28o~@xfkK@98tyP&C+h@r>#$MU8aY4ybA1&s8(rc?65^{t@ zgj1^LLc6(Rx)axgYQGkr>Yew!#5_;8|3-b^oj76QtE%-tId@0jG;Akwb8RcH=&a|$ zx#KFZYqjekim@A#e(j|>)(UH+G-}^gm8k^3Kw%4cfod7Gk{Q~rKvgQ`Q1QO{v)AbQ zI-&ATph<_ZkL0xTvL%SmaX6mf<<=(woeGb7N=y=OHJf4rf!w9q0_lSxA$9uJ==}B` zdkeN>LJJi(5xNB54*IMB+BXd0(|xKdtrU6A0V=Pl0lX>8sXUsB)3NS&d@(&cJ5Z;R zdpgMlqKAm&nRrqrngX4)-oH`5M>p^l30SP_Ra}l9yRx}Z{Ls3yS0Dkq&~|=*>>CBL z6KPs2y;7<4vYfJS@$K}ve2^+i_-)=KgoTJIdT0I_XA;=DUJ*>R z&e`yGXL^d;=Ma3E1M-VsCaoDintqh~J38qj%Y^~w7=Kr#e@!t&!mGS!Gjxe{a`KZ~ zm|8GLb2us1q?F56ORG8!pSM_%+3>BGXg^l;?bkKm2fZYr)DAKph2gEOCgTxGpoI_7 zKTb)1gX=yIEQ~=n5Jw*uGS1ql#3B7x@Ybd>wC6dR^MnESR$=c)S%{0(FzJJJ_s8XpC9;cvy8Nx zbFQ(*8fApW!L=~yUY?xbOmRjT+8HaN_cVp=7F1saFBuxtZ3t38#TtNt$!|2* z1OTrHXR@}U@^xgmH|nUNlVgl}FseT@L=gy70Rqo|;xct|iKx`+d%D&i8{Vz_ai}sr z)Fj;o<<-tjiuLqFab$e1YWUVi@k+=jj#%@0YSTiDYbZrHq!{-gU=nSV+d(10pD+J- zeG6%It42sJ%CSi9eJjCFFiB>haxNw|6#cvm%$2rK**`)m%cozU7IrSDwprT(?c~j( z49ykuq~+^aHLmgfafqgHPSE9_vtoj->O2V?_9(It-O4fXG%;49KJE5JJ1NNB&g!24 zC8UAUsHdd|DXx}}3JfvnxQPd~5!@oJgC3znO&TOJx$Z1UKt|FOl^bH$#4@G) zZ{88-GrX{Azs@_L!M{^BGie@odgSf1o3xjMuRHsqzO*nR6;uawXBwSFjTV1gFbbVD zTH$4^r;bIv_+6htBvF#kC_C0ma^dMyP-^&gWSei)G^5_4L*W3>k%~UzW9G!c$=dhY zYcKj0koNQMj~&|_PmiZygcBb@VZ^=TVI0~~bME$t)n2@ur&qRjZlbOEhc#n&iS8={ zTtj(JLpe*v3wzsD(L|#AOzZs@L;PelNw#rypvZ52&&Q>kweh7(9c{(f4-RQdYoxLo zwc~^(b490#2XJ?(!Ld@DiF^po!O3Aqkv zLsn?Y7bw>m3d$vF32i4DYn9sRW8(6ZYPPY8v4U{$bXj?@sh?Xi%nX^MWalIDET`T7 z(wA_Q3e)dPEX2H@McD#jm>(Oc7yrCJ_IpnqIl)A~>eQP|^@!95cbSF6;S~!nf&{>W zSwV5t0s;bpW()_j!_`dioxeTslWl6UPqQ4xq_M~TdpYf4UW>5=)JibiXEGG7oqvjf zaE~#bG+}ef>voACZG6v`>P^k|u2;1=J6j0su$>ZI{_4=qVKESHL2M$n)Ob|vk>>Co zv>^wEuOy^cORfLuUYq6 zU6MqrTX**w?{;}t&8sc&;0<5wNWnc7#CgVqdIiyaHOb_ODop=lP|uagwYo9)0D7sG zAZgwoCRHmVGcc=tr(ixsU{wWZl!ecu#+2DsyW~z4b}A?r4(Tk5H$l!f-M;HopIN)J zp)611vhz}y+}C<0exl>!d8cHNQG?KRm(p)<07n7Kxl&Do*6uT3CXak!JQz(Yo>HU@ z_HWpreDd_!N-~t`6%6TxGK%fAoc zUy~!}hh1$i`SW&*V5@5V-jYpodph#+lulr_0NA{l~SBKpBb%5 zo^}fb_Taq4!rG0yCPp85wi*Z!5S$+LQDZsZ3rxFFF$u7$hIzWd^KHM0Dalv-H?RvY zM+sRz%36g339W{x0?mj06iowRW#Y^?a$@p)^59%zoM0=@=Of?0{;>=GH811qwt4>A zdf)+oHhTZb=IA1?`rNq#0Ji>e)wcOA_wdgB$33QUoT$xf)9cgyk&v$rDV4t%ReCsd zPFjs48NRP8!wTN`3R!22W~=&*D@*hQq~d{XKIuapkN13R@IYJH=|T8XX)8pIH*T92 z`-|0N;WGXitNaAN*!XLeIIC;piZG#)1;oosT4WT8PbIIL@4%xPuYx(2N^@LTa+r`uj`mYv;eJ!x4&SOX)(OR3 z302FumvxDic$?q{T^{%K5>_*UW>co^6xKfWi?43$T>Rm|R;xl)%D6HSn zTb>QgxWkcP#U9h)QgNP=^$tQ;m_h-Eqp%(TAOOH`!NXrMF4r`#D9(GQ4!@C>^hLRu zhb~B&YxC5qFB1`Y&{#RQy&VlG=8LQa75`296PZBrpjI1E{{=DE*(NjCfE@|@I<_Uh z_fU~?)^s(pC!)UratZuWylca{Ou%m7bwU=QP1CExJcP6S&asZV13-fp!vy853*pW? zzgjt$Ft;8EzIuIyy~>Vi7m^zL z?UtsG}8m*L!<~v;KE}Zp1dq;kEkGBU2 zd*rKHZb)FgTR9CH1dt7fi*)`jUXHK@ceB0<)w$4+4QlizDGH0nkpjl*CyO_U;{>W+ zrdRjbRw(hu^GrfK$tEOO;cyMNoC!g1NA`Nd>n|-y#SP_e9hZhTfB(zlN}U{R=49JT z?`tBxGb3~*9U;l^LGBo<-N;Ebm|cFo!@DnQ7mRie0Iz)1hVo~v*a8GycfSXWO4X;t z5i=b6a_BJh9PWwLT>yXI$A7hmKi2$b>v#lGyE~-Qdr$c9rl7^2P5$+y@r%E{=CoV? z%wtaiqp_2Z#oW0RdF>~Y+=_Wr!kT+P^qJ4F7~N%~^Z;}7UMVQ>hmZr}V%n+6ckH=0qPx?8M{5!jx);(*`9`eZ-U z#gsV*C*dg6I5LxO709CBG5O1@zL2Q}?YMP`^OT&oO;ZYkZ=cBLC z@BnaO#A|A1gW~)#l{P4t?w*!uC+`@LUO#gHpfo#n>Z-Iwdx1Y;SatCe1`(avp+>s_ zg(|SkIOPni9CvZ->V%?l?q=E6HN%V?yfryuWqL(+sWTr=-SF=2hr$_^Bn!x7vV)&a z9Km;)JZ7=q_DG=5DSiS*e@7cK(lU%sY5VTYq`1`s6IWzZZ_sf#^mOzWqXDC(HtkG` zU*LG3Q(%uF{ayKjk%2R7-|~x7QH>*kr7`H0DXj3@)bi-|3YI&#u`eIp{g>@`U#uGX z)#a~kw#B48*aUC!yc@4M09;j)oVMTG4UhRE`OAw71lK<*?7!yOkQX03*RGd!%SYvo z+~3~BR*N9ubn9NT*D57j1@Yzu6w~;oG2pf93+Zz=I7&*Hl(B+!@0{0R5VTKl#D>BKt| zjm~1|$5r1Nlbn66k_W3ybfG9QVeREr~MrE+XYFxv1^4! z?)O%Z%d&A$B{_#H!FG;7!(*cmLhUYl^E4F< zu_&m#&zzeX2_hy{d=mF6*-1(sI^2XLxA`hnwWn^bJ#R`b^DuC*yjk31XUzFp z!i8PCdSB}1zL!G@ET2$m{$z+5l(^vsid|n-EBtj=w|brZ+FHwWbf*R49gUs()aG08 zfJvScXnbp6odEQtPbqsmbWsZFa}KX+dSdFt%X#6`iwmi)hYIvRis&Z!ZPq5WV_Glg zeNx=)ni6KxVy3P~t53Xjzg82zJMlG|C*^cMkG|h0tbz|UA7636P znRnO&Mw=lyzfH)j>c;fY=N)|04}m86D#3oTC~6DQdsDlGho=fl9PsRWglH;8t;yg6 zj&Ri>)Iaynt=ugN7VhTRc8N|$1y}kaH+iGKJew+-d%U={%6r%S<(0vX90%l1U3z|% zmSt5z(giNYjHRC}#95Wigz7gFfe84L$<_CZW8r1cyJ^pqivFH~M9@|?0&Ykfy=HpX z%7I$g`rX+BdkIrY+rn}vDS$D=M38V#>wZoAws$~bChvBE+Y(kpT#>ONcNpua30F(Z z{QgkGugGZ40o2pksrA^;;Wb+ZWc<=ZQ5f&~WRt6JSXA(jYp$Ehn_66Vam5 zb6J-U-;`JhB3Ef@LW~6j9E09HIMdt~`$zo)M(pMv02KA5^Q@u+Cd3G`dV~YO$_anG zTCGgoq0{|)ww|21s5mzOQEwI6W$hTAyx@N!UDz2&4k zd07$kpsbSCmdBu5AF;sONlDnTo@QB#W<IV3Fh{rgW@g-=a1#K#AY z&yo>vOGn+KKab~11y-QOB8^FM+#h^uJkJivgih{D<}dDzc1)~{7uz2?9Fkhv-gYJh zt!^1o`2QSXag=@0asarG61z6c&Qv8p79}R9Poq+z!dpLJib-hAY7)p!G-FTB02q}E z?=a+DU6B$Bd6vn)l726&4guz2bV&k~)@rB+DU|_ zE1Op_7??eDoZ5S<#S30I&n@XW4d~?*wbY!q4YSnmn*QIH+P>M6_SrY9L-1>y568bX z`+mr!?{)LY;gFJ6$8T4jP62vZO7a`O{pXp*QN_wI_4#T?ZqF)^H+F-1cFvDV>sEeL z+RlK|$7fg!&B=ZWo#2|4V5huuiUwyD#a!Bw3rjNgjbeyZlf)~Y@5bRw)J|TL7^~suE06B~jgiG>Q+4YA&}!VA9m7i5qT7dFBv$QyNy&iZ z8Z4#$BR4&@d)~(j*0vI?uIS%+w`S<|&^BV{r?!8tm~C5koEov8QbV_8&IxJ#1CdqC zh_=~|uD=eh@6XziQnZJiIUPH^ILvwc&C+WJmCO$S=1z%oDQ7wzY*-x%1vHwbi)wg@ zb>OvIJW;23hMbo=KVE=ZyK|E5>##S$FG)c+1 zTjagq0HD++(EqnEzF2DBce7!tiCAP8QH11vL*;6nYAY1_%NwRC5jwXv zC&S_*?Hyv$DsmqI5ymQBhBwT;%C^)a4fRhRax>Ah1@Wshb#kin)rZ_nLrC?gXb{dP zww_IB7wK2nZQO2AVqU=Lnwf1kl{icEa+BWBZM!ckC(Y0i{?zoD#B}HA@ShhII{=(D zU$`7+zC1wc1CP9}hfNFU{2E&S+@iS#)(W?H57tU=+?|dm?%2}F5Hz_x(^4kmgELao zi9YoNc@=?h@86&`oO%DB;QWU!t;fl$*QC=*yub_OsVd}%_$dEGt|267OhJ!@ZDtu3{8ltnF87VpTKJ>(wpMO9CT(H=p)Uw{O1D(*gsCrsGj z^y*XGcg0!$VRH~Rd&CgiO` zFuo~iA(a8op|bYwvoC(*-yOw`e({yV+6>U@?`;^(Ve}e|6?tb_K65pBWTtyn@Uv5~ z!Sm54h8Jb35s8&;=PatU4>9@e!UW&*c$#$$pRWPa?pKi}+EBnQRTI{609Y?<)A0#M zg|3hOx^qS5ud6;~jTNW1AL&7J8+!VVhM%Zpa-eAspX}fpqfjaWnGVa&?o%B44nsW? z2^NPW6hEAaYj7^TX#*B=a+W4jN}V~BsGdWr7dmB{_K2zP8WUSQ5E9F{l!W0$5%8V9 zII@X!+}Nrm(Z+5Sy-jKMSLl!>Zg122G(28@?w=&i2sjijPYXDPGT#~uL%r&}*5i7s zUh|))ko+{e?!<45j@d*A&&Kv-W8~D{NN>wkn2c+zT)yDiCa&Ba4j%DTJqeOfdp%zm za713AqoP1T|BcLC>IzuM#bTM^fbeV!2{@+w-vM{s*7n&gu2nNhWb2K}{vVGE@h&sT z+k)LQsA!HQtd*1^W3e=a)r9a*%=!MX-=FC$HJ0(4cz1CN! znXopg13>gb_H2Eiy+yH|gNx`w=rXe+T&m4KW4=%+f&b!XCcJN`b!Q-vxzbtDuA-iN z`qF1iD(+OLNyFgu^QM`43Vgf%q^m)H?9Gz8NwMCb4Veyn)7$Ne%4Qz}>G8${$A{_J zhdMTMNHp%sZ#%UZuO=HJoFJ^LycNrm^Z3a-V;70KzRA_*RM8?Ml%ot2W#tx zbyE&7Znwk0DSsG5CykKse8GM}!Z*%N`D2mxzc|71;(==If;>E|Z}I(I zWIP2iofWbH5(&&$BmP&c`nbbedSIuU_`sgCRlOhOF$VEsyTV{`%;8Aw$AGV{yZT=k0I&y+iY}thPE|eaTZf;@7+g_U8 z5!7F|AwXi$!)n@H~8*WoFH8s%~}v{!Q@yJq1@9)lyBB`tF{h3FJ?Y~ zp(mJM;Pthaqo+MH(}qi&ftWIZvD1bB6D8MJwg4M3_=vci__4jZc84x%8k|_FWy(K> ze56cbJoz9&(Hnznui%s{ucxMyveU9~@&@>yzQCEG158WvA%4F$2g^A06vDxBaPH%O z5zdaD%|-cE>E43X^;z3zI%%pUj3YI373C*Gb;G?Nit<*cYqbna4gh8Pj(Kf@&Q8V5 zqU39L7qg>gz%kBQV{bVU2SctWF8XxY9 zd7n7{gnI3m%1zUz*+pjGsvYu4mgT-%cO03ZBGvtM=x8Ev)jY)NTFLIwTB=>IOPHP4 z$RpxQzQKAO)k9BtGu;!yCWELt>I>07U!--{b-}*<_`o=Ut0E>H#?NY}Rq^~$2V*f?COL-3jo+WLt7@5Ua-@h)O$FG;>zI+_um(6W{U`nXQ{noc z16cGHQ%=6jCdRCxXGs=HZ-}<@(Ck{%E>uDIa&Vm@zcEYZu(cY(D)<;yN3i5^?MREB z{mr^;Y57{&c)=&z56MM^2xLW@_tcrnE2S;o!#r9Y#N0gZ=__a<$EP%`nk*(wfJBw9 zER+rL)2)g!(3vP5F92M9@yCW7=b?158-i`)@(gd~+$T<@*2|}9X~C^I5S(|k5D2)# z;VvVd;($Nub|MfQh9)PEs(1_e$9q48m0of})Zpns6RKNH6_+>6f@r9XjKaIn=YgXS zriA@ufCWqHyd}J)I`$bcnlndc;3MC{J{3>=S%epVC}bkH9S)g(RbauvrvMo*cIKdjU__&HMkX;n z?NaiYl=;c4`3ST*S)wVtiCczUApLuJL1;%}qy696W=Ejns@useXFU+BSnRh7Y@?|W zMK7!K&SNrfFb`8Uts&GMiUn!C)y^n6dbSWBZuy9?Y!eA>uH9J|GYvw;A#|^>bRPL+ zF`txEDfbzgNcWH({k=zhf?35y12J%Y^NY2Y-!O=RwpQ=m5flauMPk5p(k=2#IWkL( zI}aT`eaRs??=2}g(!`_S7)95lE`nJItJ=2NfYqWEPG>K?S>0T$d@FZ=xT^YX{c3uE zs(DmLJzCpNlrqo|RDn2Ov_J6OdO7Ei6w~y{N&b)&gMg#K#h#p}$>$hlQ_dclARcp3 zG-=ugVQav2VeGd*n2-tzp_w)8)*aGuX$<5eAbrBN=`hCs;_riTeZaA(Yz}On6Wyzf zSLTn92Q~1>aF1zeVg$oscMt|U@I=6CaY}^cqf%*7o|yIHy2-c)^9I>NcABM6Fj=(T zp#5oKiXwU?BxC}@x-jG4-qtjwY$5X->Xub;9inc34f4WD-WuIL@A!vZ4w?Dr&YSbk zcFXuG^X`mhFdO6foz$fb6s4I>f3X0uIw_4YqtIW#b}>6JjSG>A@slJA7N5F8%?~3J zw_+KSY+ISe$r8FL;GfQ){QY2`=pq`|bAy82E}Rkha8=^r`p$s`U1 ztK(jJ-b&s^c6M*G$4jq)_ry@44jipsNM(JqI24sTIlccUEkpLlgy3-Pp?mV_<~!%# z-F)oRN3%B#qc|V#SkTnlQdmC$xSk$17efqQ>1etHYc$xpLUC*t#MVbuE7HQvqo(7u zAZDU`cTYT|R+7xHJqg%c*S6>H3M&k zbGR}9jzc_uRuewW)H3aCYnhXcl7r9Y*odwdK|Zk1j1NAeIs#-wvsZ|nemGF-Gltd; z(a;;L)w<~fZ@d4?+foNP5NKRy*jQe`nF_azMITb;Y5M=cQ)nI18QZ=xRc5FKOGt8O zG*WeW4_Tz3*~8tg`9cngVSErnQ&;GphxF8c1REew%6xxLJg-S5w6ti*r1zQM$?7~< zHr0Zb9&yRAv(+M|y8oXKF#Ypa{!nH!=ohz+e-2WKgRsGINE#_FF?bEcas%I9MJ&NB zI&H;Ya`F@qP_Yx!X4XFlJIN8(zHBrV@&*jA#6hca;IrY4^IDqgc5V$LN-h!9;_lp( z0f^D2P`HvX(QHDFZ-f;72x+4oa~*fNO1G+_VE3^?N`2J~ErISu3rKc70H`Aq#(KN- z7nm*gb7$*voX<02dcA1`<8|{l!1Jwymb>7GwVL#_rp)Nd>~uWW7kK_LmkQoy&#)6i zr&GH9m|TZpi|^A3z=00qJQESSxMl`DSen=vW`vsZ2I+)C+T8duwjGHXzN@+Vw=Tle zv;~vSk_OyZ(iBg;2}?-=2xE{;2A-jZd`XVQo{jK^*ra4Gb$zihdXAFn9e3MBT^VBR zJQ%Bvz{^5jMT=%6>&4W4bs*q*s0PBo)H5CcfaZKJ9zWdxPONGC!cZzopeb5LyH_9ctby;XzE`7!!Z7yJ=4S5 zXMC#}Ykfik#XQ%6v@C9N;uD>kndGYm%ia>w(VABumu&e*Jj@I&s_QiB4f0cHrUpO8 zIJI*}3d|>C94k5huk3%ov8W}rr>pfUAHBZMxuqjqaatxD;jr_XCOJ5uYgP$7^wJ@X zutkU&=+(@t$OpxI#nvaR4V4n90a*|w%R$c%(kb}SE8^YZ4bZ%PnC(^(OG^E+N zG0L~)ZB`kHB>BpbM8Zbz=<6Q3zG6C14RL?&x~7YzxvCy%Izrh@9$qR&PI^|cDUckM zcfCoxzUg)ik{?sS{~a5@h0o9JGD@h?L`p%%12HF~lnHrVaz zm7M*Q)1!6JNKmm%o~AadPe9-i2ghy3ua|%R|3k6_3*!G5Ua^?iAxf+{1$>;o;ZcAv zn3OB_7Em5fTs08N Y>EU8e+7_1h^}ji${Lg)V;h^XL0m&yO#{d8T literal 0 HcmV?d00001 diff --git a/docs/images/lib-rounded_cube-3.JPG b/docs/images/lib-rounded_cube-3.JPG new file mode 100644 index 0000000000000000000000000000000000000000..5c2b411749e8eb0644e738c29db955f8b3fb9eee GIT binary patch literal 15628 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 bJCT*QJlIf*(JK8T$oMaM{7+S?hrRy?b4QM< literal 0 HcmV?d00001 diff --git a/docs/lib-rounded_cube.md b/docs/lib-rounded_cube.md new file mode 100644 index 00000000..aa645b6d --- /dev/null +++ b/docs/lib-rounded_cube.md @@ -0,0 +1,44 @@ +# rounded_cube + +Creates a cube in the first octant. When center is true, the cube is centered on the origin. + +## Parameters + +- `size` : Accepts a single value, cube with all sides this length. It also accepts 3 value array `[x, y, z]`, cube with dimensions `x`, `y` and `z`. +- `corner_r` : The corner is one-eight of a sphere. The `corner_r` parameter determines the sphere radius. +- `center` : `false` (default), 1st (positive) octant, one corner at (0,0,0). `true`, cube is centered at (0,0). +- `$fa`, `$fs`, `$fn` : Used to control the four quadrants. 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 sphere will be a multiple of 4 to fit edges. + +## Examples + + include ; + + rounded_cube(20, 5); + +![rounded_cube](images/lib-rounded_cube-1.JPG) + + include ; + + rounded_cube( + size = [50, 25, 15], + corner_r = 5, + center = true + ); + +![rounded_cube](images/lib-rounded_cube-2.JPG) + + include ; + + $fn = 8; + + rounded_cube( + size = [50, 25, 15], + corner_r = 5, + center = true + ); + +![rounded_cube](images/lib-rounded_cube-3.JPG) + + + + diff --git a/src/rounded_cube.scad b/src/rounded_cube.scad new file mode 100644 index 00000000..8b836457 --- /dev/null +++ b/src/rounded_cube.scad @@ -0,0 +1,57 @@ +/** +* rounded_cube.scad +* +* Creates a rounded cube in the first octant. +* When center is true, the cube is centered on the origin. +* +* @copyright Justin Lin, 2017 +* @license https://opensource.org/licenses/lgpl-3.0.html +* +* @see https://openhome.cc/eGossip/OpenSCAD/lib-rounded_cube.html +* +**/ + +module rounded_cube(size, corner_r, center = false) { + x = len(size) == undef ? size : size[0]; + y = len(size) == undef ? size : size[1]; + z = len(size) == undef ? size : size[2]; + + frags = $fn > 0 ? + ($fn >= 3 ? $fn : 3) : + max(min(360 / $fa, corner_r * 6.28318 / $fs), 5); + + remain = frags % 4; + corner_frags = (remain / 4) > 0.5 ? frags - remain + 4 : frags - remain; + edge_d = corner_r * cos(180 / corner_frags); + + half_x = x / 2; + half_y = y / 2; + half_z = z / 2; + + half_l = half_x - edge_d; + half_w = half_y - edge_d; + half_h = half_z - edge_d; + + half_cube_leng = size / 2; + half_leng = half_cube_leng - edge_d; + + translate(center ? [0, 0, 0] : [half_x, half_y, half_z]) hull() { + translate([-half_l, -half_w, half_h]) + sphere(corner_r, $fn = corner_frags); + translate([half_l, -half_w, half_h]) + sphere(corner_r, $fn = corner_frags); + translate([half_l, half_w, half_h]) + sphere(corner_r, $fn = corner_frags); + translate([-half_l, half_w, half_h]) + sphere(corner_r, $fn = corner_frags); + + translate([-half_l, -half_w, -half_h]) + sphere(corner_r, $fn = corner_frags); + translate([half_l, -half_w, -half_h]) + sphere(corner_r, $fn = corner_frags); + translate([half_l, half_w, -half_h]) + sphere(corner_r, $fn = corner_frags); + translate([-half_l, half_w, -half_h]) + sphere(corner_r, $fn = corner_frags); + } +} \ No newline at end of file