Remove start/end angle, do substantial cleanup
This commit is contained in:
74
fcad.scad
74
fcad.scad
@@ -1,4 +1,4 @@
|
||||
fDraw(fSphere(5));
|
||||
fDraw(fSphere(10));
|
||||
|
||||
///// Drawing modules
|
||||
module fDraw(model) {
|
||||
@@ -45,59 +45,40 @@ function fCube(dims) = (
|
||||
]
|
||||
);
|
||||
|
||||
function fCylinder(r, h, start_angle=0, end_angle=360, sides=36) = (
|
||||
let(degrees_per_face = (end_angle - start_angle) / sides,
|
||||
face_range = [0 : sides - 1],
|
||||
vertical_range = [0 : sides],
|
||||
complete = (start_angle == 0 && end_angle == 360),
|
||||
bottom_index = (sides + 1) * 2)
|
||||
function fCylinder(h, r, sides=36) = (
|
||||
let(degrees_per_side = 360 / sides,
|
||||
side_range = [0 : sides - 1])
|
||||
[
|
||||
[fKeyPoints, concat(
|
||||
[fKeyPoints,
|
||||
fCartesianProduct([
|
||||
[for (i = vertical_range)
|
||||
let (angle = start_angle + (i * degrees_per_face))
|
||||
[for (side = side_range)
|
||||
let (angle = side * degrees_per_side)
|
||||
[r * sin(angle), r * cos(angle)]],
|
||||
[0, h],
|
||||
]),
|
||||
complete ? [] : [
|
||||
[0, 0, 0], // bottom center
|
||||
[0, 0, h], // top center
|
||||
]
|
||||
)],
|
||||
],
|
||||
[fKeyFaces, concat(
|
||||
// bottom
|
||||
[concat(
|
||||
[for (i = [sides : -1 : 0]) i * 2],
|
||||
complete ? [] : [bottom_index]
|
||||
)],
|
||||
[[for (side = [sides : -1 : 0]) side * 2]],
|
||||
// top
|
||||
[concat(
|
||||
[for (i = [0 : sides]) i * 2 + 1],
|
||||
complete ? [] : [bottom_index + 1]
|
||||
)],
|
||||
[[for (side = [0 : sides]) side * 2 + 1]],
|
||||
// sides
|
||||
[for (i = face_range)
|
||||
[for (j = [2, 3, 1, 0]) i * 2 + j]],
|
||||
// cut ins
|
||||
complete ? [] : [
|
||||
[0, 1, bottom_index + 1, bottom_index],
|
||||
[bottom_index - 1, bottom_index - 2, bottom_index, bottom_index + 1],
|
||||
]
|
||||
[for (side = side_range)
|
||||
[for (vertex = [2, 3, 1, 0]) (side * 2 + vertex) % (sides * 2)]]
|
||||
)],
|
||||
]
|
||||
);
|
||||
|
||||
function fSphere(r, sides=36, stripes=18) = (
|
||||
let(stripe_slice = 180 / stripes,
|
||||
side_slice = 360 / sides,
|
||||
top_index = (stripes - 1) * sides,
|
||||
bottom_index = top_index + 1)
|
||||
let(degrees_per_slice = 180 / stripes,
|
||||
degrees_per_side = 360 / sides,
|
||||
top_index = (stripes - 1) * sides)
|
||||
[
|
||||
[fKeyPoints, concat(
|
||||
[for (stripe_index = [1 : stripes - 1])
|
||||
for (side_index = [0 : sides - 1])
|
||||
let (stripe_angle = stripe_index * stripe_slice,
|
||||
side_angle = side_index * side_slice,
|
||||
let (stripe_angle = stripe_index * degrees_per_slice,
|
||||
side_angle = side_index * degrees_per_side,
|
||||
stripe_radius = r * sin(stripe_angle),
|
||||
stripe_z = r * cos(stripe_angle),
|
||||
side_x = stripe_radius * sin(side_angle),
|
||||
@@ -110,23 +91,34 @@ function fSphere(r, sides=36, stripes=18) = (
|
||||
]
|
||||
)],
|
||||
[fKeyFaces, concat(
|
||||
// side squares
|
||||
[for (stripe_index = [2 : stripes - 1])
|
||||
for (side_index = [0 : sides - 1])
|
||||
let (prev_side_base = (stripe_index - 2) * sides,
|
||||
side_base = (stripe_index - 1) * sides)
|
||||
[prev_side_base + (side_index + 1) % sides,
|
||||
[
|
||||
prev_side_base + (side_index + 1) % sides,
|
||||
prev_side_base + side_index,
|
||||
side_base + side_index,
|
||||
side_base + (side_index + 1) % sides]
|
||||
side_base + (side_index + 1) % sides,
|
||||
]
|
||||
],
|
||||
// top triangles
|
||||
[for (side_index = [0 : sides - 1])
|
||||
[top_index, side_index, (side_index + 1) % sides]
|
||||
[
|
||||
top_index,
|
||||
side_index,
|
||||
(side_index + 1) % sides,
|
||||
]
|
||||
],
|
||||
// bottom triangles
|
||||
[for (side_index = [0 : sides - 1])
|
||||
let (side_base = (stripes - 2) * sides)
|
||||
[bottom_index,
|
||||
[
|
||||
top_index + 1,
|
||||
side_base + (side_index + 1) % sides,
|
||||
side_base + side_index]
|
||||
side_base + side_index,
|
||||
]
|
||||
]
|
||||
)],
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user