-
Notifications
You must be signed in to change notification settings - Fork 12
/
cradle.go
70 lines (64 loc) · 1.98 KB
/
cradle.go
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
package main
import (
"github.com/unixpickle/model3d/model3d"
"github.com/unixpickle/model3d/toolbox3d"
)
func CreateCradle(a *Args) model3d.Solid {
solid := model3d.JoinedSolid{
// Base.
&model3d.Rect{
MinVal: model3d.Coord3D{X: -CradleThickness, Y: -(CradleThickness + CradleBaseSide),
Z: -CradleBottomThickness},
MaxVal: model3d.Coord3D{X: a.PhoneWidth + CradleThickness,
Y: a.PhoneDepth + CradleThickness + CradleBaseSide},
},
VerticalHolder{Args: a},
&model3d.SubtractedSolid{
Positive: &model3d.Rect{
MinVal: model3d.Coord3D{X: -CradleThickness, Y: -CradleThickness,
Z: -CradleThickness},
MaxVal: model3d.Coord3D{X: a.PhoneWidth + CradleThickness,
Y: CradleThickness + a.PhoneDepth, Z: CradleSideHeight},
},
Negative: &model3d.Rect{
MinVal: model3d.Coord3D{X: 0, Y: 0},
MaxVal: model3d.Coord3D{X: a.PhoneWidth + CradleThickness + 1e-5, Y: a.PhoneDepth,
Z: CradleSideHeight + 1e-5},
},
},
}
return &model3d.SubtractedSolid{
Positive: solid,
Negative: &toolbox3d.ScrewSolid{
P1: model3d.Coord3D{X: a.PhoneWidth / 2, Y: a.PhoneDepth / 2,
Z: -(CradleBottomThickness + 1e-5)},
P2: model3d.Coord3D{X: a.PhoneWidth / 2, Y: a.PhoneDepth / 2, Z: 1e-5},
Radius: ScrewRadius + ScrewSlack,
GrooveSize: ScrewGroove,
},
}
}
type VerticalHolder struct {
*Args
}
func (v VerticalHolder) Min() model3d.Coord3D {
return model3d.Coord3D{X: v.PhoneWidth/2 - VerticalHolderWidth/2, Y: -CradleThickness * 2}
}
func (v VerticalHolder) Max() model3d.Coord3D {
return model3d.Coord3D{
X: v.PhoneWidth/2 + VerticalHolderWidth/2,
Y: v.PhoneDepth + CradleThickness*2,
Z: v.PhoneHeight + CradleHeightSlack + v.PhoneDepth/2 + CradleThickness,
}
}
func (v VerticalHolder) Contains(c model3d.Coord3D) bool {
if !model3d.InBounds(v, c) {
return false
}
archZ := v.PhoneHeight + CradleHeightSlack
if c.Z < archZ {
return c.Y < 0 || c.Y > v.PhoneDepth
}
inset := c.Z - archZ
return c.Y < inset || c.Y > v.PhoneDepth-inset
}