Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "" in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 561
Warning: Trying to access array offset on value of type null in /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php on line 578
Warning: Undefined array key "comment" in /home/etnikartwn/wiki11h22/lib/plugins/discussion/action.php on line 222
Warning: Cannot modify header information - headers already sent by (output started at /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php:578) in /home/etnikartwn/wiki11h22/inc/parser/code.php on line 33
Warning: Cannot modify header information - headers already sent by (output started at /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php:578) in /home/etnikartwn/wiki11h22/inc/parser/code.php on line 34
Warning: Cannot modify header information - headers already sent by (output started at /home/etnikartwn/wiki11h22/lib/plugins/odt/helper/config.php:578) in /home/etnikartwn/wiki11h22/inc/parser/code.php on line 35
/*═══════════════════════════════════════════════════════════════════════╕
│ Liège Openscad Library |
│ Module de déformation et modification pour OpenSCAD │
╞══════════════════╤════════════════════════════════════╤════════════════╡
│ marc@vanlindt.be │ LGPL 2.1 marc@vanlindt.be 2022 │ v0.98 ---- wip |
╞══════════════════╧═══════════════════════╤════════════╧════════════════╛
│ Variables générales /
╘═══════════════════════════════════════*/
LogoFB= [[4.46567, 4.99666], [3.06433, 4.99666], [3.06433, 0], [0.987666, 0], [0.987666, 4.99666], [0, 4.99666], [0, 6.76134], [0.987666, 6.76134], [0.987666, 7.90467], [1.00769, 8.22956], [1.07504, 8.57716], [1.20063, 8.92712], [1.39537, 9.25909], [1.6702, 9.55271], [2.03602, 9.78764], [2.50376, 9.94352], [3.08433, 10], [4.62167, 9.99402], [4.62167, 8.28068], [3.505, 8.28068], [3.35933, 8.26038], [3.21662, 8.18648], [3.10811, 8.0397], [3.065, 7.80073], [3.065, 6.76073], [4.64833, 6.76073]];
LetterL=[[0,0],[0,70],[22,73],[19,21],[50,25],[48,-1],[0,0]];
//LetterO=[[0,35],[6.25,61.25],[25,70],[25,70],[43.75,61.25],[50,35],[43.75,8.75],[25,0],[6.25,8.75],[0,35]];
LetterO=[[0,0],[0,70],[50,70],[50,0],[0,0]];
blue = [0,0,1,1];
red = [1,0,0,1];
green = [0,1,0,1];
violet = [0.5,0,0.5,1];
yellow = [1,1,0,1];
cyan = [0,1,1,1];
black = [0,0,0,1];
white = [1,1,1,1];
oak = RVB(200,50,90,255);
orange = [1,0.5,0,1];
olive = [0.5,0.5,0,1];
sarcelle = [0,0.5,0.5,1];
marine = [0,0,0.5,1];
fuschia = [1,0,1,1];
glass = [1,0,1,0.2];
bleu = [0,0,1,1];
rouge = [1,0,0,1];
vert = [0,1,0,1];
jaune = [1,1,0,1];
noir = [0,0,0,1];
blanc = [1,1,1,1];
gris = [0.5,0.5,0.5,1];
gray = [0.5,0.5,0.5,1];
pink = RVB(255,107,219,255);
phi = 1.61803399;
aphi = phi-1;
biphi = phi+1;
angledor = 360/biphi;
py = sqrt(0.5);
bipy = sqrt(2);
pi = 3.141592654;
tau = pi*2;
/*═══════════╕
│ Exemples \
╘════════════*/
/* MOEBIUS / ELLIPSE
moebius(n=32,d=40,t=0.5)
ellipse([5,20],$fn=128);
moebius(n=32,d=40,t=0.5)
ellipse([20,5],$fn=128);
*/
/* CHULL
chull(m=true){
sphere(d=1,$fn=64);
translate([10,10,00]) sphere(d=1,$fn=16);
translate([20,0,00]) sphere(d=1,$fn=16);
translate([30,0,00]) sphere(d=1,$fn=16);
translate([30,-10,00]) sphere(d=1,$fn=16);
translate([0,-10,00]) sphere(d=1,$fn=16);
}
*/
/* PYTHATREE / BONE*/
//pythatree(d="z",h=50,maxit=6,r1=30,r2=30)
//bone(h=50,d1=20,d2=14.14214,c=40,$fn=64);
/*pythatree(d="z",h=10*biphi,maxit=8,a=90,r1=90,r2=90)
hull(){sphere(d=10,$fn=16);
translate([0,0,10*biphi])sphere(d=10*aphi,$fn=16);}
*/
//pythatree(d="y",h=10,sp=5,maxit=8)
//polygon(square([10,10],center=true));
/*pythatree(d="y",h=50,maxit=9,a=90,s=sqrt(0.5))
hull(){
circle(d=10,$fn=64);
translate([0,50])
circle(d=sqrt(0.5)*10,$fn=64);}
*/
/**/
/* ROTATE2
rotate2()
cube(center=true);
translate([0,2,0])
cube(center=true);
*/
/* RING
ring(d=10,n=11){
cylinder(d=1,h=5);
translate([0,0,5.6]) scale([1,1,2]) sphere(d=0.6,$fn=64);
}
*/
/* SKEW
skew(YX=1)
cube([2,2,2]);
*/
/* ROUNDSQUARE
roundsquare(s=[40,20],d=[5,10,5,15],$fn=64,center=true);
*/
/* NGON
ngon(d=20,fn=3,inside=true);
translate([0,0,-1]) #cylinder(d=20,$fn=64);
translate([25,0,0]) ngon(d=20,fn=3,inside=false);
translate([25,0,-1]) #cylinder(d=20,$fn=64);
translate([50,0,0])ngon(d=20,f=4,inside=true);
translate([50,0,-1])#cylinder(d=20,$fn=64);
translate([75,0,0])ngon(d=20,fn=4,inside=false);
translate([75,0,-1])#cylinder(d=20,$fn=64);
translate([100,0,0])ngon(d=20,fn=5,inside=true);
translate([100,0,-1])#cylinder(d=20,$fn=64);
translate([125,0,0])ngon(d=20,fn=5,inside=false);
translate([125,0,-1])#cylinder(d=20,$fn=64);
*/
/* OUTLINE*/
/*outline(w=1,t="in"){
ellipse([10,20],fn=64);ellipse([20,10],fn=64);}
translate([0,0,1]){#ellipse([10,20],fn=64);#ellipse([20,10],fn=64);}
*/
/*
outline(w=1,t="out"){
ellipse([10,20],fn=64);ellipse([20,10],fn=64);}
translate([0,0,1]){#ellipse([10,20],fn=64);#ellipse([20,10],fn=64);}
*/
/*outline(w=1,t="on"){
ellipse([10,20],fn=64);ellipse([20,10],fn=64);}
translate([0,0,1]){#ellipse([10,20],fn=64);#ellipse([20,10],fn=64);}
*/
/**/
/* RANDOM
for(i=[1:10]){
echo(random(10,s=i));
}
*/
/* FIBONACCI
for(i=[1:15]){
echo(fibonacci(i));
}
*/
/* TEARDROP / RANDOM
for(i=[1:500]){
translate([random(500,i*10),random(500,i*50),random(500,i*60)])
color([0.6,0.6,0.9,0.5])teardrop(a=30+random(30,i));
}
*/
/* STAR
star(d1=10,d2=20,fn=9);
*/
/* TUBE - COUDE
tube(d1=10,d2=8,h=15,$fn=64);
translate([0,0,15])
coude(d1=10,d2=8,a=45,$fn=64);
translate([0,0,20])
rotate([0,045,0])
translate([0,0,5])
tube(d1=10,d2=8,h=5,$fn=64);
*/
/* ROUNDCUBE
roundcube(s=[50,100,150],b=[5,15,15,20],t=[25,35,40,5],$fn=64,center=true);
*/
/* PAIR
for(i=[0:20]){
echo(str(i,pair(i)==true?" est pair!":" est impair!"));
}
*/
/* GRID - CNC
grid(s=[100,100],x=5,y=10,w=2)
{
cnc(0.5,$fn=32){
ellipse([2,1],$fn=32);
ellipse([1,2],$fn=32);
}}
*/
/* PIEPART
piepart(d=10,p=20/100);
rotate([0,0,360*21/100])
piepart(d=10,p=78/100);
*/
/* PIE
pie(d=10,p=[1,2,1,2,1,2,3,2,1,3,2,1]);
*/
/* SUM
echo(sum([5,10,15,20]));
*/
/* MYANGLE/length*/
/* CORRECT / CHULL
rotate_extrude()
rotate_extrude_correct()
chull(){
circle(d=3);
translate([60,0])
circle(d=3);
translate([70,120])
circle(d=3);
}
*/
/* FRACTSHAPE
fractshape(d=40,fn=4,maxit=3);
translate([40,0,0]) fractshape(d=40,fn=5,it=3);
translate([80,0,0]) fractshape(d=40,fn=6,it=3);
*/
/* clean
test=[[0,0],[0,0],[10,10],[10,10],[20,20],[20,20],[30,30],[30,30],[40,40],[40,40],[50,50],[50,50]];
echo(clean(test));
*/
/* Kochflake
for(i=[0:3]){
translate([i*10,0,0])kochflake(d=10,maxit=i);}
*/
/* Chaincurve / TRACE
//points=[[0,0],[sin(30)*10,cos(30)*10],[10,0],[0,0]];
points=[[0,0],[0,10],[10,10],[20,0],[30,10],[40,20],[60,-20],[10,-10],[10,-5],[15,-5],[15,0],[0,0]];
color([0.4,1.0,0.4,1])
linear_extrude(1)
polygon(chaincurve(points,8));
color("red") linear_extrude(3)
trace(points,0.2);
color([0.5,0.5,1,1]) linear_extrude(3)
trace(chaincurve(points,8),0.1);
*/
/*
difference(){
rotate2() cube([10,10,10],center=true);
translate([0,0,10]) cube([20,20,20],center=true);}
/*
rotate2() cube([10,10,10],center=true);
*/
/*═══════════════════════════════╕
│ Modificateurs / déformations \
╘════════════════════════════════*/
module outline (w,t){
w=w==undef?1:w;
t=t==undef?"on":t;
difference()
{
offset(t=="out"?w:t=="in"?0:w/2)
children();
offset(t=="out"?0:t=="in"?-w:-w/2)
children();
}
}
module pythatree (a,h,sp,maxit,b,r1,r2,s,d){
a = a == undef ? 45 : a;
h = h == undef ? 1 : h;
sp = sp == undef ? 0 : sp;
maxit = maxit == undef ? 3 : maxit;
b = b == undef ? 1 : b;
r1 = r1 == undef ? 0 : r1;
r2 = r2 == undef ? 0 : r2;
s = s == undef ? py : s;
d = d == undef ? "y" : d;
children();
if(b<=maxit)
{
translate([d=="x"?h:d=="y"?sp:-sp, d=="x"?-sp:d=="y"?h:0, d=="x"?0:d=="y"?0:h])
rotate([d=="x"?0:d=="y"?r2:0, d=="x"?r2:d=="y"?0:-a, d=="x"?-a:d=="y"?-a:r2])
scale([s,s,s])
pythatree(a=a,h=h,sp=sp,maxit=maxit,b=b+1,r1=r1,r2=r2,s=s,d=d)
{
children();
};
translate([d=="x"?h:d=="y"?-sp:sp, d=="x"?sp:d=="y"?h:0, d=="x"?0:d=="y"?0:h])
rotate([d=="x"?0:d=="y"?r1:0, d=="x"?r1:d=="y"?0:a, d=="x"?a:d=="y"?a:r1])
scale([s,s,s])
pythatree(a=a,h=h,sp=sp,maxit=maxit,b=b+1,r1=r1,r2=r2,s=s,d=d)
{
children();
};
}
}
module chull (m){
union()
for(i=[0:$children-2]){
hull(){
children(m==true?0:i);
children(i+1);
}
}
}
module rotate2 (){
rotate([45,90-atan(sqrt(2)),0])
children();
}
module ring (d,n){
d=d==undef?10:d;
n=n==undef?5:n;
for(i=[0:n-1]){
rotate([0,0,360/n*i]){
translate([d/2,0,0])
children();
}
}
}
module fibo (s,n,r){
r=r==undef?true:r;
s=s==undef?1:s;
n=n==undef?128:n;
for(i=[1:n]){
rotate([0,0,angledor*i])
translate([s*i,0,0])
scale(r==true?s+pow(1.003,i):1)
children();
}
}
module skew (XY,XZ,YX,YZ,ZX,ZY){
matrice=[
[1,XY,XZ,0], //[redimX, skewXY, skewXZ,translateX]
[YX,1,YZ,0], //[SkewYX,RedimY,SkewYZ,translateY]
[ZX,ZY,1,0] //[SkewZX, SkewZY,redimZ,TranslateZ]
];
multmatrix(matrice){
children();
}
}
module cnc(d,show,fn){
show=show==undef?false:show;
d = d == undef ? 3:d;
fn = fn == undef ? 32:fn;
if(show==false){
offset(-d/2,$fn=fn)
offset(d/2,$fn=fn)
children();
}
else
{
color("green")
linear_extrude(1)
children();
color("red")
linear_extrude(0.5)
difference()
{
offset(-d/2,$fn=fn)
offset(d/2,$fn=fn)
children();
children();
}
}
}
module moebius(d,t,fn){ // version 2.0
fn = fn == undef ? 128 :fn;
d = d == undef ? 30 :d;
t = t == undef ? 0.5 :t;
union(){
for(j=[0:$children-1])
{
for(i=[1:fn]){
hull(){
rotate([0,360/fn*i,0])
translate([d/2,0,0])
rotate([0,0,i*(360*t)/fn])
linear_extrude(0.1)
children(j);
rotate([0,360/fn*(i+1),0])
translate([d/2,0,0])
rotate([0,0,(i+1)*(360*t)/fn])
linear_extrude(0.1)
children(j);
}
}
}
}
}
module grid (dim,x,y){
dim=dim==undef?[100,100]:dim;
x=x==undef?10:x;
y=y==undef?10:y;
for(i=[1:x-1])
translate([i*dim[0]/x,0,0])
rotate([-90,0,0])
linear_extrude(dim[1])
children();
for(i=[1:y-1])
translate([0,i*dim[1]/y,0])
rotate([-90,0,-90])
linear_extrude(dim[0])
children();
}
module rotate_extrude_correct (){
difference(){
children();
translate([-100000,-50000])
square([100000,100000]);
}
}
/*═══════════════════╕
│ Nouvelles formes \
╞══════╤═══════════════╛
│ 2D │
╘═════*/
module teardrop (d,a,fn){
polygon(teardrop(d=d==undef?10:d,a=a==undef?30:a,fn=fn==undef?16:fn));
}
module star (d1,d2,fn){
polygon(star(d1=d1==undef?10:d1,d2=d2==undef?20:d2,fn=fn==undef?7:fn));
}
module ellipse (dim,fn){
polygon(ellipse(dim,fn));
}
module losange (dim){
polygon(losange(dim));
}
module roundsquare (table,d,fn){
polygon(roundsquare(s=table,d=d,fn=fn));
}
module kochflake (d,maxit){
polygon (
koch
(
ngon(d=d,fn=3),
maxit=maxit
)
);
}
module ngon (d,fn,inside){
polygon(ngon(d,fn,inside));
}
module piepart (d,a,p){
polygon(piepart(d=d,a=a,p=p));
}
module triangle (w,h){
polygon(triangle(w=w,h=h));
}
module fractshape (d,fn,inside,maxit){
polygon(fractshape(fn=fn,d=d,maxit=maxit,inside=inside));
}
module lghs (){
for(i=[-1:2:1])
{
rotate([0,0,i*45]){
translate([0,-50,0])
difference(){
cnc(10)
union(){
hull(){
circle(d=20);
translate([0,100,0])
circle(d=15);
}
translate([0,100,0])
circle(d=50);
}
hull(){
translate([0,150,0])
rotate([0,0,30])
circle(d=25,$fn=6);
translate([0,110,0])
rotate([0,0,30])
circle(d=25,$fn=6);
}
circle(d=10);
}
}
}
}
module trace(table,d,fn,dot,dotfn,tr,d2){
tr=tr==undef?true:tr;
fn=fn==undef?8:dot==true?4:fn;
dotfn=dotfn==undef?16:dotfn;
dot=dot==undef?true:dot;
d=d==undef?1:d;
d2=d2==undef?d*2:d2;
for(i=[0:len(table)-2]){
if(tr==true)
{
hull(){
translate(table[i])
circle(d=d,$fn=fn);
translate(table[i+1])
circle(d=d,$fn=fn);
}
}
if(dot==true){
translate(table[i]) circle(d=d2,$fn=dotfn);}
if(dot==true){
translate(table[i+1]) circle(d=d2,$fn=dotfn);}
}
}
module voronoi(dim, w, t, c, n,seed){
n=n==undef?100:n;
dim=dim==undef?[1000,500]:dim;
table=pointgrid([dim[0],dim[1]],n=n,seed=seed);
c=c==undef?0:c;
t=table[0][0]+table[0][1];
w=w==undef?1:w;
seed=seed==undef?1/fn*n*c/w:seed;
outline(w=w*2,t="in") square(dim);
difference(){
square(dim);
cnc(-c/2)
for (p=table){
intersection_for(p2=table){
if (p!=p2){
translate((p+p2)/2 -normal(p2-p)*w){
rotate([0,0,-myangle(p,p2)])
translate([-t,-t])
square([2*t, t]);
}}}}}}
/*════════╕
│ 2D/3D │
╘════════*/
/*═════╕
│ 3D │
╘═════*/
module tube (d1,d2,h,center){
d1=d1==undef?10:d1;
d2=d2==undef?8:d2;
h=h==undef?30:h;
center=center==undef?false:center;
translate([0,0,center==true?-h/2:0])
difference(){
cylinder(d=d1,h=h);
translate([0,0,-1])
cylinder(d=d2,h=h+2);
}
}
module coude (d1,d2,a){
d1=d1==undef?10:d1;
d2=d2==undef?8:d2;
a=a==undef?90:a<=-90?-90:a>=90?90:a;
difference(){
union(){
cylinder(d=d1,h=d1/2);
translate([0,0,d1/2])
sphere(d=d1);
translate([0,0,d1/2])
rotate([0,a,0])
cylinder(d=d1,h=d1/2);
}
union(){
translate([0,0,-1])
cylinder(d=d2,h=d1/2+1);
translate([0,0,d1/2])
sphere(d=d2);
translate([0,0,d1/2])
rotate([0,a,0])
cylinder(d=d2,h=d1/2+1);
}
}
}
module roundcube (s,b,t,center,q){
s=s==undef?[50,40,30]:s;
b=b==undef?[5,5,5,5]:b;
t=t==undef?[20,20,20,20]:t;
q=q==undef?16:q;
center=center==undef?false:center;
translate([center==true?-s[0]/2:0,center==true?-s[1]/2:0,center==true?-s[2]/2:0])
hull(){
translate([b[0]/2,b[0]/2,b[0]/2]) sphere(d=b[0],$fn=q);
translate([s[0]-b[1]/2,b[1]/2,b[1]/2]) sphere(d=b[1],$fn=q);
translate([s[0]-b[2]/2,s[1]-b[2]/2,b[2]/2]) sphere(d=b[2],$fn=q);
translate([b[3]/2,s[1]-b[3]/2,b[3]/2]) sphere(d=b[3],$fn=q);
translate([t[0]/2,t[0]/2,s[2]-t[0]/2]) sphere(d=t[0],$fn=q);
translate([s[0]-t[1]/2,t[1]/2,s[2]-t[1]/2]) sphere(d=t[1],$fn=q);
translate([s[0]-t[2]/2,s[1]-t[2]/2,s[2]-t[2]/2]) sphere(d=t[2],$fn=q);
translate([t[3]/2,s[1]-t[3]/2,s[2]-t[3]/2]) sphere(d=t[3],$fn=q);
}
}
module bone (h,d1,d2,c,q){
h = h == undef ? 50 : h;
d1 = d1 == undef ? 20 : d1;
d2 = d2 == undef ? 14.14214 : d2;
c = c == undef ? 40 : c;
q = q == undef ? 128 : q;
rotate_extrude(){
rotate_extrude_correct(){
cnc((c)*1,fn=q)
{
translate([0,h,0]) circle(d=d2,$fn=q);
translate([0,0])
circle(d=d1,$fn=q);
}
}
}
}
module rock(d,c,seed){
c=c==undef?3:c;
seed=seed==undef?1:seed;
intersection_for(i=[0:c]){
a=[random(360,s=i*seed),random(360,s=i*seed*2),random(360,s=i*seed*3)];
rotate(a)
cube([d,d,d*10],center=true);
}
}
module pie (d,p,pct,i=1,a=0){
pct=topct(p);
echo(pct);
rotate([0,0,a*360])
linear_extrude(i)
piepart(d=d,p=p[i-1]/sum(p)+0.01);
if(ia[b]) i],
e=[for(i=a) if (i==a[b]) i]
)
invert==false?concat(sort(c),e,sort(d)):invert(concat(sort(c),e,sort(d)));
/*════════════════════════════╕
│ Sur vecteurs [[a,b],[c,d]] │
╘════════════════════════════*/
function length (a,b) = sqrt(((b[0]-a[0])*(b[0]-a[0]))+((b[1]-a[1])*(b[1]-a[1])));
function divide (a,b,c) = [a[0]+(b[0]-a[0])*c, a[1]+(b[1]-a[1])*c];
function myangle (a,b) = atan2(b[0]-a[0],b[1]-a[1]);
function join (a,c=0,t=[]) = let (u=concat(t,a[c]))c==len(a)?t:join(a=a,c=c+1,t=u);
// NIGHTLY BUILDS ONLY
function join2(aa) = [for(i=[0:len(aa)-1] ) each aa[i]];
function clean(a) = [for(i=[0:len(a)-1]) each (a[i]==a[i+1]?"":a[i][0]==undef?"":[a[i]])];
function koch (a,angle,maxit,it) = let(
a=a[0]==a[len(a)-1]?a:concat(a,[a[0]]),
b = [ for ( i = [ 0 : len(a)-2 ] ) [
a[i],
divide(a[i],a[i+1],1/3),
divide(a[i],a[i+1],1/3) + [
sin(myangle(a[i],a[i+1])-(angle==undef?60:angle<=60?60:angle>=180?180:angle))*length(a[i], a[i+1])/3,
cos(myangle(a[i],a[i+1])-(angle==undef?60:angle<=60?60:angle>=180?180:angle))*length(a[i],a[i+1])/3],
divide(a[i],a[i+1],2/3)+[sin(-90+myangle(a[i],a[i+1])-((90+(90-(angle<=60?60:angle>=180?180:angle)))))*length(a[i],a[i+1])/3,cos(-90+myangle(a[i],a[i+1])-(90+(90-(angle<=60?60:angle>=180?180:angle))))*length(a[i],a[i+1])/3],
divide(a[i],a[i+1],2/3),
a[i+1]
]],
maxit=maxit==undef?0:maxit,
it=it==undef?0:it
)
it==maxit?clean(join2(b)):koch(a=clean(join2(b)),angle=angle,maxit=maxit,it=it+1);
function fract(a,angle,in,maxit,it,close)= let(
close=close==undef?true:close,
a=close==true?a[0]==a[len(a)-1]?a:concat(a,[a[0]]):a,
maxit=maxit==undef?3:maxit==0?1:maxit,
it=it==undef?0:it,
inside=in==undef?1:in==true?1:-1,
angle=angle==undef?60:angle,
b = [ for ( i = [ 0 : len(a)-2 ] ) [
a[i],
divide(a[i],a[i+1],angle/180),
divide(a[i],a[i+1],angle/180) +
[
sin(myangle(a[i],a[i+1]) + angle*inside) * (length(a[i],a[i+1])/3) ,
cos(myangle(a[i],a[i+1]) + angle*inside) * (length(a[i],a[i+1])/3)
],
divide(a[i],a[i+1],1-(angle/180)),
a[i+1]]
]
)
it+1==maxit?clean(join2(b)):fract(a=clean(join2(b)),angle=angle,in=in,maxit=maxit,it=it+1,close=close);
/*
function fract (a,angle,in,maxit,it) = let(
a=a[0]==a[len(a)-1]?a:concat(a,[a[0]]),
maxit=maxit==undef?3:maxit==0?1:maxit,
it=it==undef?0:it,
angle=angle==undef?60:angle,
b = [ for ( i = [ 0 : len(a)-2 ] ) [
a[i],
divide(a[i],a[i+1],angle/180),
divide(a[i],a[i+1],1/2) +
[
sin(myangle(a[i],a[i+1]) + (in==false?-90:90)) * (length(a[i],a[i+1])/3) ,
cos(myangle(a[i],a[i+1]) + (in==false?-90:90)) * (length(a[i],a[i+1])/3)
],
divide(a[i],a[i+1],1-(angle/180)),
a[i+1]]
]
)
it+1==maxit?clean(join2(b)):fract(a=clean(join2(b)),angle=angle,in=in,maxit=maxit,it=it+1);
*/
function curve(table,fn) = let(
fn = fn == undef ? 8 : fn,
c = [ for ( i = [0:(fn)] ) each [divide(table[0],table[1],1/(fn)*i)]],
d = [ for ( i = [0:(fn)] ) each [divide(table[1],table[2],1/(fn)*i)]],
e = [ for ( i = [0:(fn)] ) each [divide(c[i],d[i],1/(fn)*i)]])
e;
function doublevector(table,f,it=0) = let(
f=f==undef?0:f,
aa = [for (i=[0:len(table)-1]) each [table[i],divide(table[i],table[i+1],0.5)]]
)
it==f?clean(aa):doublevector(clean(aa),f=f,it=it+1);
function ngon(d,fn,inside) = let (
d=d==undef?10:inside==undef?d:inside==true?d:d*((d/2)/(cos(360/fn/2)*d/2)),
fn=fn==undef?4:fn,
aa=[for(i=[0:fn])[sin(360/fn*i)*d/2,cos(360/fn*i)*d/2]]
)
aa;
function square(d,center)=let(
center=center==undef?false:center,
d=d==undef?[10,10]:d,
c1 = center == true ? [-d[0]/2,-d[1]/2] : [ 0, 0],
c2 = center == true ? [-d[0]/2, d[1]/2] : [ 0, d[1]],
c3 = center == true ? [ d[0]/2, d[1]/2] : [ d[0], d[1]],
c4 = center == true ? [ d[0]/2,-d[1]/2] : [ d[0], 0],
aa=[c1,c2,c3,c4,c1]
)
aa;
function ellipse(s,fn) = let (
fn=fn==undef?16:fn,
s=s==undef?[10,10*aphi]:s,
aa=[for(i =[0:fn] ) [sin(360/fn*i)*s[0]/2,cos(360/fn*i)*s[1]/2]]
)
aa;
function losange(s) = let (
s=s==undef?[10,10*aphi]:s,
aa=[for(i =[0:4] ) [sin(360/fn*i)*s[0]/2,cos(360/fn*i)*s[1]/2]]
)
aa;
function circle(d,r,fn) = let (
fn=fn==undef?16:fn,
r=r==undef?d==undef?5:d/2:r,
aa=ngon(d=r*2,fn=fn)
)
aa;
function star(d1,d2,fn) = let (
d1=d1==undef?10:d1/2,
d2=d2==undef?5:d2/2,
fn=fn==undef?7:fn,
aa=[for(i=[0:2*(fn)])[sin(360/(2*fn)*i)*(pair(i)==true?d1:d2),cos(360/(2*fn)*i)*(pair(i)==true?d1:d2)]]
)
aa;
function roundsquare(s,d,fn) = let (
fn = fn == undef ? 8:fn,
s = s == undef ? [15,20] : s,
d = d == undef ? [3,6,3,6] : len(d) == 1 ? [d[0]/2,d[0]/2,d[0]/2,d[0]/2]:len(d)==2?[d[0]/2,d[1]/2,d[1]/2,d[1]/2]:len(d)==3?[d[0]/2,d[1]/2,d[2]/2,d[2]/2]:d[0]==undef?[d/2,d/2,d/2,d/2]:d/2,
p1 = [0,0],
p2 = [0,d[0]],
p3 = [0,s[1]-d[1]],
p4 = [0,s[1]],
p5 = [d[1],s[1]],
p6 = [s[0]-d[2],s[1]],
p7 = [s[0],s[1]],
p8 = [s[0],s[1]-d[2]],
p9= [s[0],d[3]],
p10= [s[0],0],
p11= [s[0]-d[3],0],
p12= [d[0],0],
c1=curve([p3,p4,p5],fn=fn),
c2=curve([p6,p7,p8],fn=fn),
c3=curve([p9,p10,p11],fn=fn),
c4=curve([p12,p1,p2],fn=fn),
aa=clean(join2([c1,c2,c3,c4,[p3]]))
)
aa;
function piepart(d,a,p) = let (
d=d==undef?10:d/2,
a=a==undef?p==undef?90:p>=1?360*1/p:360*p:a,
aa=concat([[0,0]],[for(i=[0:a])[-sin(-90+i)*d,cos(-90+i)*d]])
)
aa;
function triangle(w,h)= let (
h=h==undef?cos(30)*w:h,
aa=[[-w/2,0],[0,h],[w/2,0],[-w/2,0]]
)
aa;
function fractshape(d,fn,inside,maxit)= let(
d=d==undef?10:d/2,
fn=fn==undef?5:fn,
maxit=maxit==undef?3:maxit,
inside=inside==undef?true:inside,
angle=fn==3?60:fn==4?89:360/fn,
points=fract(ngon(d=d*2,fn=fn),maxit=maxit,angle=angle,in=inside)
)
points;
function teardrop(d,a,fn)=let (
d=d==undef?10:d,
a=a==undef?30:a,
h=d*tan(90-a),
fn=fn==undef?16:fn,
courbe= [for(i=[0:fn]) [sin(90-a+(360-(90-a)*2)/fn*i)*d/2,cos(90-a+(360-(90-a)*2)/fn*i)*d/2]],
aa=concat(courbe,[[0,(cos(90-a)*d/2)+h*sin(90-a)/2]],[[sin(90-a)*d/2,cos(90-a)*d/2]])
)
aa;
function fractalize(table,force,maxit,seed)= let (
force=force==undef?1:force,
maxit=maxit==undef?3:maxit,
seed=seed==undef?1:seed,
aa=
[
for(i=[0:len(table)-2], ab = doublevector([[table[i][0],table[i][1]],[table[i+1][0],table[i+1][1]]],maxit=maxit))
for(j=ab[0]) each clean([[ab][0],[ab][1]]+[[(random(pos=false,n=force,s=sin(seed)*sin(ab[0])+sin(ab[1]))),(random(pos=false,n=force,s=cos(seed)*cos(ab[0])-sin(ab[1])))],[(random(n=force,s=tan(seed)+sin(ab[0])+2*cos(ab[1]))),(random(n=force,s=cos(seed)+cos(ab[0])-3*cos(ab[1])))]])
]
)
clean(aa);
function pointgrid(dim,n,seed) =[for(i=[0:n-1])[random(n=dim[0],s=sin(i/n/(seed==undef?1:seed))),random(n=dim[1],s=cos(i*2/n/(seed==undef?1:seed)))]];
function rescale(a,s) = [for (i=a) i*s];
function retranslate(a,t) = [for (i=a) i+t];
function 2Drot(object,angle) = [for(i=[0:len(object)-1]) [sin(myangle([0,0],object[i])+angle)*length([0,0],object[i]),cos(myangle([0,0],object[i])+angle)*length([0,0],object[i])]];
function to3D(a,b,h,bottom,top) = let (
bottom=bottom==undef?true:bottom,
top=top==undef?true:top,
aa=[ for(i=[0:len(a)]) each[[a[i][0],a[i][1],0],[b[i][0],b[i][1],h]] ],
bb=[ for(i=[0:1:len(aa)]) each [[i,i+1,i+2],[i+1,i+3,i+2]] ],
cc=bottom==true?[ for(i=[0:2:len(aa)]) each [i] ]:[],
// dd=top==true?[ for(i=[0:2:len(aa)]) each [len(aa)-1-i] ]:[],
dd=top==true?[ for(i=[0:2:len(aa)]) each [len(aa)-1-i] ]:[],
ee=concat(bb,[cc],[dd])
)
[clean(aa),clean(ee)];
function simple3D(a,b,h,bottom,top,angle,correct) = let (
angle=angle==undef?0:angle,
correct=correct==undef?0:correct,
bottom=true,
top=true,
c=2Drot(interpolate(a,b,maxstep=1,step=0,correct=correct,q=1),angle),
d=2Drot(interpolate(a,b,maxstep=1,step=1,correct=correct,q=1),angle),
aa=[ for(i=[0:len(c)]) each[[c[i][0],c[i][1],0],[d[i][0],d[i][1],h]] ],
bb=[ for(i=[0:1:len(aa)]) each [[i,i+1,i+2],[i+1,i+3,i+2]] ],
cc=bottom==true?[ for(i=[0:2:len(aa)]) each [i] ]:[],
dd=top==true?[ for(i=[0:2:len(aa)]) each [len(aa)-1-i] ]:[],
ee=concat(bb,[cc],[dd])
)
[clean(aa),clean(ee)];
function vectranslate(a,n,it)=let(
n=n==undef?0:n,
it=it==undef?0:it,
aa=n==0?a:[for(i=[0:len(a)-1]) i==0?a[len(a)-2]:a[i-1]]
)
it==n+len(a)-2?aa:vectranslate(a=aa,n=n,it=it+1);
module 2Dto3D(a,b,h,segment,correct,quality,rotation){
angle=rotation==undef?0:rotation/segment;
quality=quality==undef?1:quality;
he=h==undef?64:h;
mm=segment==undef?16:segment;
aabc=a==undef?ngon(d=50,fn=3):a;
adef=b==undef?chaincurve(koch(ngon(d=50,fn=3),maxit=1),fn=4):b;
correct=correct==undef?0:correct;
union(){
for(i=[0:mm-1]){
my3Dobject=to3D(
2Drot(interpolate(aabc,adef,maxstep=mm,step=i,correct=correct,q=quality),i*angle),
2Drot(interpolate(aabc,adef,maxstep=mm,step=i+1,correct=correct,q=quality),(i+1)*angle),
h=he/mm,
top=i==mm-1?true:true,
bottom=i==0?true:true);
translate([0,0,i*he/mm])
color([1/mm*i,1-(1/mm*i),1,1])
union()
{
polyhedron(my3Dobject[0],my3Dobject[1]);
polyhedron(my3Dobject[0],my3Dobject[1]);
}
}
}
}
function interpolate(a,b,step,maxstep,correct,q)= let(
pp=ppcm(len(a)-1,len(b)-1,q)-[1,1],
correct=correct==undef?0:correct,
abc=vectranslate(multiplyfaces(a,pp[0]),n=correct==undef?0:correct),
def=multiplyfaces(b,pp[1]),
aa=[for(i=[0:len(def)]) each [divide(abc[i],def[i],step/(maxstep))]])
clean(aa);
function ppcm(a,b,q)=let(
aa=[for(i=[0:max(a,b)]) each [i*a*(q==undef?1:q)]],
bb=[for(i=[0:max(a,b)]) each [i*b*(q==undef?1:q)]],
cc=[for(i=[0:max(a,b)]) each [for(j=[1:100]) each aa[i]==bb[j]?bb[j]:""]])
[cc[0]/a,cc[0]/b];
function multiplyfaces(object,n)=let(
n=n==undef?1:n==0?0:n,
aa=n==0?object:[for(i=[0:len(object)-2]) each
addpoints(object[i],object[i+1],n)
])
concat(clean(aa),[object[0]]);
function addpoints(c1,c2,n)=[for(i=[0:n]) each [divide(c1,c2,i/(n+1))]];
function chaincurve(table,fn,closed,detail) = let (
detail=detail==undef?1:detail==0?1:detail*sign(detail)*2+1,
closed=closed==undef?true:closed,
// table=table[0]==table[len(table)-1]?table:concat([for(i=[0:len(table)]) table[i]],table[len(table)-1]),
//totaltab=table,
totaltab=concat(table,[table[0]],closed==true?[table[1]]:"",closed==true?[table[2]]:""),
tab = multiplyfaces(totaltab,detail),
d = [for (i=[(closed==true?4:2):2:len(tab)-(closed==false?4:2)]) each curve([tab[(i)-1],tab[i],tab[i+1]],fn)],
b =table[0],
c = table[len(table)-1],
a = d
)
clean(a);
function RVB(a,b,c,d)= let( a=a==undef?0.5:1/255*a,
b=b==undef?0.5:1/255*b,
c=c==undef?0.5:1/255*c,
d=d==undef?1:1/255*d,
aa=[a,b,c,d]
)aa;
function mirror(a,x,y)=let(
xx=x==undef?1:x==true?-1:1,
yy=y==undef?1:y==true?-1:1,
aa=[
for(i=[0:len(a)-1])
each
[
[a[i][0]*xx,a[i][1]*yy]
]
]
)aa;
function center(a,center)=let(
LMax=sort([for(i=[0:len(a)-1])a[i][0]])[0],
LMin=sort([for(i=[0:len(a)-1])a[i][0]],invert=true)[0],
HMax=sort([for(i=[0:len(a)-1])a[i][1]])[0],
HMin=sort([for(i=[0:len(a)-1])a[i][1]],invert=true)[0],
LargMax=LMax*sign(LMax),
LargMin=LMin*sign(LMin),
HautMax=HMax*sign(HMax),
HautMin=HMin*sign(HMin),
Largeur=LargMax<=LargMin?LargMin-LargMax:LargMax-LargMin,
Hauteur=HautMax<=HautMin?HautMin-HautMax:HautMax-HautMin,
aa=retranslate(a,[-LMax-(center==false?0:Largeur/2),-HMax-(center==false?0:Hauteur/2)])
)aa;
function offset(a,d,i)= let
(
invert=i==undef?false:true,
aa=mesangles(a),
mesangles=orientangles(aa),
bb=[
for(i=[0:len(a)-2]) each [[a[i][0]+sin(90-mesangles[i])*d,a[i][1]+cos(90-mesangles[i])*d]]
]
)
concat(bb,[bb[0]]);
function mesangles(a,invert)=let
(
invert=invert==undef?false:true,
aa=[
for(i=[0:len(a)-2])
let(
a1=(invert==false?90:-90)-myangle(a[i],a[i==len(a)-2?0:i+1]),
a2=(invert==false?90:-90)-myangle(a[i],a[i==0?len(a)-2:i-1]),
aa1=(invert==false?90:-90)-myangle(a[i],a[i==len(a)-2?0:i+1]),
aa2=(invert==false?90:-90)-myangle(a[i],a[i==0?len(a)-2:i-1]),
a3=(a1+a2)/2+180,
aaa=aa[i-1]
)
a3
]
)
aa;
function orientangles(a,i)=
let
(
i=i==undef?0:i,
aa=[
for(j=[0:len(a)-1])
each (a[j]-a[j-1])>=90?a[j]-180:(a[j]-a[j-1])<=-90?a[j]+180:a[j]]
)
i==len(a)-1?aa:orientangles(a=aa,i=i+1);
function coeffdirect(a)=let //coefficient directeur
(
aa=(a[1][1]-a[0][1])/(a[1][0]-a[0][0])
)
aa;
/*
Dans un plan cartésien, on peut trouver les coordonnées du point d’intersection de deux courbes (comme par exemple deux droites) en résolvant le système d’équations.
Soit les droites dont les équations sont y = x – 4 et y = –2x + 5, alors : x – 4 = –2x + 5. On représente ces droites dans un plan cartésien.
Donc : 3x = 9 et x = 3
Puis : y = –1
Les coordonnées du point d’intersection de ces droites sont (3, –1).
*/
module 2D(a){
polygon(a);
}
module 3D(a){
if(a[1]!=undef)
{
polyhedron(a[0],a[1]);
}
}
function cube(d,center)=let
(
d=d==undef?[10,10,10]:d,
center=center==undef?false:center,
mys=square([d[0],d[1]],center=center),
aa=to3D(mys,mys,h=d[2])
)
center==false?aa:translate3D(aa,[0,0,-d[2]/2]);
function cylinder(d,d1,d2,h,fn,center)=let
(
d1=d==undef?d1==undef?10:d1:d,
d2=d==undef?d2==undef?10:d2:d,
h=h==undef?40:h,
fn=fn==undef?16:fn,
center=center==undef?false:center,
myg1=ngon(d=d1,fn=fn),
myg2=ngon(d=d2,fn=fn),
aa=to3D(myg1,myg2,h=h)
)
center==false?aa:translate3D(aa,[0,0,-h/2]);
function translate3D(a,b)=[[for(i=[0:len(a[0])-1]) a[0][i]+b],a[1]];
function rescale3D(a,s)= [[for(i=[0:len(a[0])-1]) a[0][i]*s],a[1]];
function gradient(a,b,c) = let
(
c=c==undef?1:c,
aR=a[0], aV=a[1], aB=a[2], aA=a[3],
bR=b[0], bV=b[1], bB=b[2], bA=b[3],
mR=(aR-bR)/c, mV=(aV-bV)/c, mB=(aB-bB)/c, mA=(aA-bA)/c,
aa=[for(i=[0:c-1]) [a[0]-mR*i,a[1]-mV*i,a[2]-mB*i,a[3]-mA*i]]
)
aa;
module menger(d,maxit,it){
let(it=it==undef?0:it)
if(it==maxit){
square([d,d]);
}
else{
union(){
menger(d=d/3+0.001,maxit=maxit,it=it+1);
translate([d/3,0])
menger(d=d/3+0.001,maxit=maxit,it=it+1);
translate([d/3*2,0])
menger(d=d/3+0.001,maxit=maxit,it=it+1);
translate([0,d/3])
menger(d=d/3+0.001,maxit=maxit,it=it+1);
translate([d/3*2,d/3])
menger(d=d/3+0.001,maxit=maxit,it=it+1);
translate([0,d/3*2])
menger(d=d/3+0.001,maxit=maxit,it=it+1);
translate([d/3,d/3*2])
menger(d=d/3+0.001,maxit=maxit,it=it+1);
translate([d/3*2,d/3*2])
menger(d=d/3+0.001,maxit=maxit,it=it+1);
}}}
module menger3d(it,d,maxit){
it=it==undef?1:it;
if (it==maxit){
cube([d,d,d],center=true);
}
if (it<=maxit){
union(){
for (i=[-1:1]){
translate([d/3,d/3,d/3*i]) rotate([0,90,0]) menger3d(it=it+1,d=d*1/3,maxit=maxit);
translate([-d/3,d/3,d/3*i]) rotate([0,90,0]) menger3d(it=it+1,d=d*1/3,maxit=maxit);
}
translate([0,d/3,d/3]) rotate([0,90,0]) menger3d(it=it+1,d=d*1/3,maxit=maxit);
translate([0,d/3,-d/3]) rotate([0,90,0]) menger3d(it=it+1,d=d*1/3,maxit=maxit);
for (i=[-1:1]){
translate([d/3,-d/3,d/3*i]) rotate([0,90,0]) menger3d(it=it+1,d=d*1/3,maxit=maxit);
translate([-d/3,-d/3,d/3*i]) rotate([0,90,0]) menger3d(it=it+1,d=d*1/3,maxit=maxit);
}
translate([0,-d/3,d/3]) rotate([0,90,0]) menger3d(it=it+1,d=d*1/3,maxit=maxit);
translate([0,-d/3,-d/3]) rotate([0,90,0]) menger3d(it=it+1,d=d*1/3,maxit=maxit);
translate([d/3,0,d/3]) rotate([0,90,0]) menger3d(it=it+1,d=d*1/3,maxit=maxit);
translate([d/3,0,-d/3]) rotate([0,90,0]) menger3d(it=it+1,d=d*1/3,maxit=maxit);
translate([-d/3,0,d/3]) rotate([0,90,0]) menger3d(it=it+1,d=d*1/3,maxit=maxit);
translate([-d/3,0,-d/3]) rotate([0,90,0]) menger3d(it=it+1,d=d*1/3,maxit=maxit);
}}}
module jcube(it,d,maxit){
it=it==undef?1:it;
union()
{
if(it==maxit)
{
cube([d,d,d],center=true);
}
if(it<=maxit)
{
translate([d/2,d/2,d/2])
translate([-d/2*(sqrt(2)-1),-d/2*(sqrt(2)-1),-d/2*(sqrt(2)-1)])
jcube(it=it+1,maxit=maxit,d=d*(sqrt(2)-1));
translate([-d/2,d/2,d/2])
translate([d/2*(sqrt(2)-1),-d/2*(sqrt(2)-1),-d/2*(sqrt(2)-1)])
jcube(it=it+1,maxit=maxit,d=d*(sqrt(2)-1));
translate([d/2,-d/2,d/2])
translate([-d/2*(sqrt(2)-1),d/2*(sqrt(2)-1),-d/2*(sqrt(2)-1)])
jcube(it=it+1,maxit=maxit,d=d*(sqrt(2)-1));
translate([-d/2,-d/2,d/2])
translate([d/2*(sqrt(2)-1),d/2*(sqrt(2)-1),-d/2*(sqrt(2)-1)])
jcube(it=it+1,maxit=maxit,d=d*(sqrt(2)-1));
translate([d/2,d/2,-d/2])
translate([-d/2*(sqrt(2)-1),-d/2*(sqrt(2)-1),d/2*(sqrt(2)-1)])
jcube(it=it+1,maxit=maxit,d=d*(sqrt(2)-1));
translate([-d/2,d/2,-d/2])
translate([d/2*(sqrt(2)-1),-d/2*(sqrt(2)-1),d/2*(sqrt(2)-1)])
jcube(it=it+1,maxit=maxit,d=d*(sqrt(2)-1));
translate([d/2,-d/2,-d/2])
translate([-d/2*(sqrt(2)-1),d/2*(sqrt(2)-1),d/2*(sqrt(2)-1)])
jcube(it=it+1,maxit=maxit,d=d*(sqrt(2)-1));
translate([-d/2,-d/2,-d/2])
translate([d/2*(sqrt(2)-1),d/2*(sqrt(2)-1),d/2*(sqrt(2)-1)])
jcube(it=it+1,maxit=maxit,d=d*(sqrt(2)-1));
translate([-d/2,-d/2,0])
translate([d/2*(1-(2*(sqrt(2)-1))),d/2*(1-(2*(sqrt(2)-1))),0])
jcube(it=it+1,maxit=maxit,d=d*(1-(2*(sqrt(2)-1))));
translate([-d/2,d/2,0])
translate([d/2*(1-(2*(sqrt(2)-1))),-d/2*(1-(2*(sqrt(2)-1))),0])
jcube(it=it+1,maxit=maxit,d=d*(1-(2*(sqrt(2)-1))));
translate([d/2,-d/2,0])
translate([-d/2*(1-(2*(sqrt(2)-1))),d/2*(1-(2*(sqrt(2)-1))),0])
jcube(it=it+1,maxit=maxit,d=d*(1-(2*(sqrt(2)-1))));
translate([d/2,d/2,0])
translate([-d/2*(1-(2*(sqrt(2)-1))),-d/2*(1-(2*(sqrt(2)-1))),0])
jcube(it=it+1,maxit=maxit,d=d*(1-(2*(sqrt(2)-1))));
translate([-d/2,0,-d/2])
translate([d/2*(1-(2*(sqrt(2)-1))),0,d/2*(1-(2*(sqrt(2)-1)))])
jcube(it=it+1,maxit=maxit,d=d*(1-(2*(sqrt(2)-1))));
translate([-d/2,0,d/2])
translate([d/2*(1-(2*(sqrt(2)-1))),0,-d/2*(1-(2*(sqrt(2)-1)))])
jcube(it=it+1,maxit=maxit,d=d*(1-(2*(sqrt(2)-1))));
translate([d/2,0,-d/2])
translate([-d/2*(1-(2*(sqrt(2)-1))),0,d/2*(1-(2*(sqrt(2)-1)))])
jcube(it=it+1,maxit=maxit,d=d*(1-(2*(sqrt(2)-1))));
translate([d/2,0,d/2])
translate([-d/2*(1-(2*(sqrt(2)-1))),0,-d/2*(1-(2*(sqrt(2)-1)))])
jcube(it=it+1,maxit=maxit,d=d*(1-(2*(sqrt(2)-1))));
translate([0,-d/2,-d/2])
translate([0,d/2*(1-(2*(sqrt(2)-1))),d/2*(1-(2*(sqrt(2)-1)))])
jcube(it=it+1,maxit=maxit,d=d*(1-(2*(sqrt(2)-1))));
translate([0,-d/2,d/2])
translate([0,d/2*(1-(2*(sqrt(2)-1))),-d/2*(1-(2*(sqrt(2)-1)))])
jcube(it=it+1,maxit=maxit,d=d*(1-(2*(sqrt(2)-1))));
translate([0,d/2,-d/2])
translate([0,-d/2*(1-(2*(sqrt(2)-1))),d/2*(1-(2*(sqrt(2)-1)))])
jcube(it=it+1,maxit=maxit,d=d*(1-(2*(sqrt(2)-1))));
translate([0,d/2,d/2])
translate([0,-d/2*(1-(2*(sqrt(2)-1))),-d/2*(1-(2*(sqrt(2)-1)))])
jcube(it=it+1,maxit=maxit,d=d*(1-(2*(sqrt(2)-1))));
}}}