Added vnf option to regular_polyhedron_info and removed translate_points.

This commit is contained in:
Adrian Mariano 2020-03-21 18:24:49 -04:00
parent e67ba766c8
commit 5994e47cf9
2 changed files with 18 additions and 40 deletions

View file

@ -100,36 +100,6 @@ function path4d(points, fill=0) =
result + repeat(addition, len(result)); result + repeat(addition, len(result));
// Function: translate_points()
// Usage:
// translate_points(pts, v);
// Description:
// Moves each point in an array by a given amount.
// Arguments:
// pts = List of points to translate.
// v = Amount to translate points by.
function translate_points(pts, v=[0,0,0]) =
pts==[]? [] : let(
v=point3d(v)
) [for (pt = pts) pt+v];
// Function: scale_points()
// Usage:
// scale_points(pts, v, [cp]);
// Description:
// Scales each point in an array by a given amount, around a given centerpoint.
// Arguments:
// pts = List of points to scale.
// v = A vector with a scaling factor for each axis.
// cp = Centerpoint to scale around.
function scale_points(pts, v=[1,1,1], cp=[0,0,0]) =
pts==[]? [] : let(
cp = point3d(cp),
v = point3d(v,fill=1)
) [for (pt = pts) vmul(pt-cp,v)+cp];
// Function: rotate_points2d() // Function: rotate_points2d()
// Usage: // Usage:
// rotate_points2d(pts, a, [cp]); // rotate_points2d(pts, a, [cp]);
@ -289,7 +259,7 @@ function project_plane(point, a, b, c) =
v = unit(c-a), v = unit(c-a),
n = unit(cross(u,v)), n = unit(cross(u,v)),
w = unit(cross(n,u)), w = unit(cross(n,u)),
relpoint = is_vector(point)? (point-a) : translate_points(point,-a) relpoint = apply(move(-a),point)
) relpoint * transpose([w,u]); ) relpoint * transpose([w,u]);
@ -320,7 +290,7 @@ function lift_plane(point, a, b, c) =
n = unit(cross(u,v)), n = unit(cross(u,v)),
w = unit(cross(n,u)), w = unit(cross(n,u)),
remapped = point*[w,u] remapped = point*[w,u]
) is_vector(remapped)? (a+remapped) : translate_points(remapped,a); ) apply(move(a),remapped);
// Function: cylindrical_to_xyz() // Function: cylindrical_to_xyz()

View file

@ -9,7 +9,7 @@
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
include <BOSL2/hull.scad> include <hull.scad>
// CommonCode: // CommonCode:
@ -320,14 +320,14 @@ module regular_polyhedron(
in_radius = entry[5]; in_radius = entry[5];
if (draw){ if (draw){
if (rounding==0) if (rounding==0)
polyhedron(translate_points(scaled_points, translation), faces = face_triangles); polyhedron(move(translation, p=scaled_points), faces = face_triangles);
else { else {
fn = segs(rounding); fn = segs(rounding);
rounding = rounding/cos(180/fn); rounding = rounding/cos(180/fn);
adjusted_scale = 1 - rounding / in_radius; adjusted_scale = 1 - rounding / in_radius;
minkowski(){ minkowski(){
sphere(r=rounding, $fn=fn); sphere(r=rounding, $fn=fn);
polyhedron(translate_points(adjusted_scale*scaled_points,translation), faces = face_triangles); polyhedron(move(translation,p=adjusted_scale*scaled_points), faces = face_triangles);
} }
} }
} }
@ -335,13 +335,13 @@ module regular_polyhedron(
maxrange = repeat ? len(faces)-1 : $children-1; maxrange = repeat ? len(faces)-1 : $children-1;
for(i=[0:1:maxrange]) { for(i=[0:1:maxrange]) {
// Would like to orient so an edge (longest edge?) is parallel to x axis // Would like to orient so an edge (longest edge?) is parallel to x axis
facepts = translate_points(select(scaled_points, faces[i]), translation); facepts = move(translation, p=select(scaled_points, faces[i]));
center = mean(facepts); center = mean(facepts);
rotatedface = rotate_points3d(translate_points(facepts,-center), from=face_normals[i], to=[0,0,1]); rotatedface = rotate_points3d(move(-center, p=facepts), from=face_normals[i], to=[0,0,1]);
clockwise = sortidx([for(pt=rotatedface) -atan2(pt.y,pt.x)]); clockwise = sortidx([for(pt=rotatedface) -atan2(pt.y,pt.x)]);
$face = rotate_children? $face = rotate_children?
path2d(select(rotatedface,clockwise)) : path2d(select(rotatedface,clockwise)) :
select(translate_points(facepts,-center), clockwise); select(move(-center,p=facepts), clockwise);
$faceindex = i; $faceindex = i;
$center = -translation-center; $center = -translation-center;
translate(center) translate(center)
@ -549,6 +549,7 @@ _stellated_polyhedra_ = [
// Calculate characteristics of regular polyhedra or the selection set for regular_polyhedron(). // Calculate characteristics of regular polyhedra or the selection set for regular_polyhedron().
// Invoke with the same arguments used by regular_polyhedron() and use the `info` argument to // Invoke with the same arguments used by regular_polyhedron() and use the `info` argument to
// request the desired return value. Set `info` to: // request the desired return value. Set `info` to:
// * `"vnf"`: vnf for the selected polyhedron
// * `"vertices"`: vertex list for the selected polyhedron // * `"vertices"`: vertex list for the selected polyhedron
// * `"faces"`: list of faces for the selected polyhedron, where each entry on the list is a list of point index values to be used with the vertex list // * `"faces"`: list of faces for the selected polyhedron, where each entry on the list is a list of point index values to be used with the vertex list
// * `"face normals"`: list of normal vectors for each face // * `"face normals"`: list of normal vectors for each face
@ -688,8 +689,15 @@ function regular_polyhedron_info(
face_normals = rotate_points3d(faces_normals_vertices[1], from=down_direction, to=[0,0,-1]), face_normals = rotate_points3d(faces_normals_vertices[1], from=down_direction, to=[0,0,-1]),
side_length = scalefactor * entry[edgelen] side_length = scalefactor * entry[edgelen]
) )
info == "fullentry" ? [scaled_points, translation,stellate ? faces : face_triangles, faces, face_normals, side_length*entry[in_radius]] : info == "fullentry" ? [scaled_points,
info == "vertices" ? translate_points(scaled_points,translation) : translation,
stellate ? faces : face_triangles,
faces,
face_normals,
side_length*entry[in_radius]] :
info == "vnf" ? [move(translation,p=scaled_points),
stellate ? faces : face_triangles] :
info == "vertices" ? move(translation,p=scaled_points) :
info == "faces" ? faces : info == "faces" ? faces :
info == "face normals" ? face_normals : info == "face normals" ? face_normals :
info == "in_radius" ? side_length * entry[in_radius] : info == "in_radius" ? side_length * entry[in_radius] :