Model constructor

This commit is contained in:
Ian Gulliver
2016-12-25 12:43:12 -07:00
parent 552e344543
commit f79cd76e98
4 changed files with 23 additions and 18 deletions

View File

@@ -2,15 +2,15 @@ function fCube(dims) = (
let(x = fIsVector(dims) ? dims[0] : dims, let(x = fIsVector(dims) ? dims[0] : dims,
y = fIsVector(dims) ? dims[1] : dims, y = fIsVector(dims) ? dims[1] : dims,
z = fIsVector(dims) ? dims[2] : dims) z = fIsVector(dims) ? dims[2] : dims)
[ fModel(
[fKeyPoints, fCartesianProduct([[0, x], [0, y], [0, z]])], points=fCartesianProduct([[0, x], [0, y], [0, z]]),
[fKeyFaces, [ faces=[
[0, 2, 3, 1], // -x [0, 2, 3, 1], // -x
[0, 1, 5, 4], // -y [0, 1, 5, 4], // -y
[0, 4, 6, 2], // -z [0, 4, 6, 2], // -z
[4, 5, 7, 6], // +x [4, 5, 7, 6], // +x
[2, 6, 7, 3], // +y [2, 6, 7, 3], // +y
[1, 3, 7, 5], // +z [1, 3, 7, 5], // +z
]],
] ]
)
); );

View File

@@ -3,16 +3,15 @@ function fCylinder(h, r, r1=undef, r2=undef, sides=36) = (
side_range = [0 : sides - 1], side_range = [0 : sides - 1],
int_r1 = (r1 == undef) ? r : r1, int_r1 = (r1 == undef) ? r : r1,
int_r2 = (r2 == undef) ? r : r2) int_r2 = (r2 == undef) ? r : r2)
[ fModel(
[fKeyPoints, points=
[for (side = side_range) [for (side = side_range)
for (params = [[int_r1, 0], [int_r2, h]]) for (params = [[int_r1, 0], [int_r2, h]])
let (angle = side * degrees_per_side, let (angle = side * degrees_per_side,
radius = params[0], radius = params[0],
height = params[1]) height = params[1])
[radius * sin(angle), radius * cos(angle), height]], [radius * sin(angle), radius * cos(angle), height]],
], faces=concat(
[fKeyFaces, concat(
// bottom // bottom
[[for (side = [sides : -1 : 0]) side * 2]], [[for (side = [sides : -1 : 0]) side * 2]],
// top // top
@@ -20,7 +19,6 @@ function fCylinder(h, r, r1=undef, r2=undef, sides=36) = (
// sides // sides
[for (side = side_range) [for (side = side_range)
[for (vertex = [2, 3, 1, 0]) (side * 2 + vertex) % (sides * 2)]] [for (vertex = [2, 3, 1, 0]) (side * 2 + vertex) % (sides * 2)]]
)], )
] )
); );

View File

@@ -2,8 +2,8 @@ function fSphere(r, sides=36, stripes=18) = (
let(degrees_per_slice = 180 / stripes, let(degrees_per_slice = 180 / stripes,
degrees_per_side = 360 / sides, degrees_per_side = 360 / sides,
top_index = (stripes - 1) * sides) top_index = (stripes - 1) * sides)
[ fModel(
[fKeyPoints, concat( points=concat(
[for (stripe_index = [1 : stripes - 1]) [for (stripe_index = [1 : stripes - 1])
for (side_index = [0 : sides - 1]) for (side_index = [0 : sides - 1])
let (stripe_angle = stripe_index * degrees_per_slice, let (stripe_angle = stripe_index * degrees_per_slice,
@@ -18,8 +18,8 @@ function fSphere(r, sides=36, stripes=18) = (
[0, 0, r], // top [0, 0, r], // top
[0, 0, -r], // bottom [0, 0, -r], // bottom
] ]
)], ),
[fKeyFaces, concat( faces=concat(
// side squares // side squares
[for (stripe_index = [2 : stripes - 1]) [for (stripe_index = [2 : stripes - 1])
for (side_index = [0 : sides - 1]) for (side_index = [0 : sides - 1])
@@ -49,6 +49,6 @@ function fSphere(r, sides=36, stripes=18) = (
side_base + side_index, side_base + side_index,
] ]
] ]
)], )
] )
); );

View File

@@ -5,6 +5,13 @@
fKeyPoints = "points"; fKeyPoints = "points";
fKeyFaces = "faces"; fKeyFaces = "faces";
function fModel(points, faces) = (
[
[fKeyPoints, points],
[fKeyFaces, faces],
]
);
function fPoints(model) = ( function fPoints(model) = (
fMapLookup(fKeyPoints, model) fMapLookup(fKeyPoints, model)
); );