-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrounded-corner.scad
106 lines (90 loc) · 2.67 KB
/
rounded-corner.scad
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
//o=[0,0];
//polygon([[-100,0],o,[100,-100],[100,-200],[-100,-200]]);
//r=20;
$fn=50;
difference() {
square([200,200],center=true);
union() {
translate([100,100])
cutCornerTR(75,75,30,30);
translate([-100,100])
cutCornerTL(25,75,20,50);
translate([100,-100])
cutCornerBR(25,75,20,50);
translate([-100,-100])
cutCornerBL(50,25,40,20);
}
}
//cutCornerTR(50,25,30,10);
function fCutCorner(xOffset,yOffset,r) = let (
// POV: top/right
//
// 2 connected lines L1, L2
// find circle with radius r tangent to the lines
//
// o
// L1 ---- - - - +
// a \
// \ |
// \
// \|
// |
// L2
//
angle=atan2(yOffset,xOffset),
a =(180-angle)/2,
// delta = distance from o along L1,L2
// where the circle is tangent to lines
delta = r/tan(a), // tan(a)=r/x;
cOrigin=[-xOffset-delta,-r],
dx2=cos(angle)*delta,
dy2=sin(angle)*delta,
cutExact=[[-xOffset,0],[0,0],[0,-yOffset],[-xOffset,0]],
overlap=10,
xO=xOffset+overlap/yOffset*xOffset,
yO=yOffset+overlap/xOffset*yOffset,
cutExtended=[[-xO,overlap],[overlap,overlap],[overlap,-yO],[-xO,overlap]],
circlePie=[cOrigin,[cOrigin.x,0],[-xOffset+dx2,-dy2],cOrigin],
circlePieEnd=[[-xOffset,0],[cOrigin.x,0],[-xOffset+dx2,-dy2],[-xOffset,0]],
v=[-xOffset+dx2-cOrigin.x,-dy2-cOrigin.y],
circlePieExtended=[[cOrigin.x,r],cOrigin,[cOrigin.x+v.x*2,cOrigin.y+v.y*2],[cOrigin.x,r]]
) [cutExtended,cOrigin,circlePieExtended,delta];
module cutCornerTR(xOffset,yOffset,r1,r2) {
c1=fCutCorner(xOffset,yOffset,r1);
cut=c1[0];
cOrigin=c1[1];
circlePieExtended=c1[2];
//translate([0,0,1]) color("red")
polygon(cut);
//translate([0,0,2]) color("green")
difference() {
polygon(circlePieExtended);
translate(cOrigin)
circle(r1);
}
c2=fCutCorner(yOffset,xOffset,r2);
cut2=c2[0];
cOrigin2=c2[1];
circlePieExtended2=c2[2];
dx2=c2[3];
reverseXY=[for(i=circlePieExtended2) [i.y,i.x]];
//polygon(cut2);
difference() {
polygon(reverseXY);
translate([cOrigin2.y,cOrigin2.x])
circle(r2);
}
}
module cutCornerTL(xOffset,yOffset,r1,r2) {
mirror([-1,0,0])
cutCornerTR(xOffset,yOffset,r1,r2);
}
module cutCornerBR(xOffset,yOffset,r1,r2) {
mirror([0,-1,0])
cutCornerTR(xOffset,yOffset,r1,r2);
}
module cutCornerBL(xOffset,yOffset,r1,r2) {
mirror([-1,0,0])
mirror([0,-1,0])
cutCornerTR(xOffset,yOffset,r1,r2);
}