Renamed place_copies() to move_copies()

This commit is contained in:
Revar Desmera 2020-03-24 18:31:22 -07:00
parent 6183e6d0d2
commit 971c1e795f
13 changed files with 45 additions and 46 deletions

View file

@ -82,15 +82,15 @@ function bez_point(curve,u)=
// n = The number of points to generate along the bezier curve.
// Example(2D): Quadratic (Degree 2) Bezier.
// bez = [[0,0], [30,30], [80,0]];
// place_copies(bezier_curve(bez, 16)) sphere(r=1);
// move_copies(bezier_curve(bez, 16)) sphere(r=1);
// trace_bezier(bez, N=len(bez)-1);
// Example(2D): Cubic (Degree 3) Bezier
// bez = [[0,0], [5,35], [60,-25], [80,0]];
// place_copies(bezier_curve(bez, 16)) sphere(r=1);
// move_copies(bezier_curve(bez, 16)) sphere(r=1);
// trace_bezier(bez, N=len(bez)-1);
// Example(2D): Degree 4 Bezier.
// bez = [[0,0], [5,15], [40,20], [60,-15], [80,0]];
// place_copies(bezier_curve(bez, 16)) sphere(r=1);
// move_copies(bezier_curve(bez, 16)) sphere(r=1);
// trace_bezier(bez, N=len(bez)-1);
function bezier_curve(curve,n) = [for(i=[0:1:n-1]) bez_point(curve, i/(n-1))];
@ -1006,7 +1006,7 @@ module trace_bezier_patches(patches=[], size=1, showcps=false, splinesteps=16)
{
if (showcps) {
for (patch = patches) {
place_copies(flatten(patch)) color("red") sphere(d=size*2);
move_copies(flatten(patch)) color("red") sphere(d=size*2);
color("cyan")
if (is_tripatch(patch)) {
for (i=[0:1:len(patch)-2], j=[0:1:len(patch[i])-2]) {
@ -1021,7 +1021,7 @@ module trace_bezier_patches(patches=[], size=1, showcps=false, splinesteps=16)
}
}
vnf = bezier_patch(patch, splinesteps=splinesteps);
color("blue") place_copies(vnf[0]) sphere(d=size);
color("blue") move_copies(vnf[0]) sphere(d=size);
}
}
bezier_polyhedron(patches=patches, splinesteps=splinesteps);

View file

@ -1,4 +1,4 @@
module translate_copies(a=[[0,0,0]]) place_copies(a) children();
module translate_copies(a=[[0,0,0]]) move_copies(a) children();
module xmove(x) right(x) children();
module ymove(y) back(y) children();
module zmove(z) up(z) children();

View file

@ -13,13 +13,13 @@
//////////////////////////////////////////////////////////////////////
// Module: place_copies()
// Module: move_copies()
//
// Description:
// Makes copies of the given children at each of the given offsets.
// Translates copies of all children to each given translation offset.
//
// Usage:
// place_copies(a) ...
// move_copies(a) ...
//
// Arguments:
// a = Array of XYZ offset vectors. Default `[[0,0,0]]`
@ -30,8 +30,8 @@
//
// Example:
// #sphere(r=10);
// place_copies([[-25,-25,0], [25,-25,0], [0,0,50], [0,25,0]]) sphere(r=10);
module place_copies(a=[[0,0,0]])
// move_copies([[-25,-25,0], [25,-25,0], [0,0,50], [0,25,0]]) sphere(r=10);
module move_copies(a=[[0,0,0]])
{
assert(is_list(a));
for ($idx = idx(a)) {

View file

@ -113,7 +113,7 @@ function distance_from_line(line, pt) =
// n = line_normal(p1,p2);
// stroke([p1,p2], endcap2="arrow2");
// color("green") stroke([p1,p1+10*n], endcap2="arrow2");
// color("blue") place_copies([p1,p2]) circle(d=2, $fn=12);
// color("blue") move_copies([p1,p2]) circle(d=2, $fn=12);
function line_normal(p1,p2) =
is_undef(p2)? line_normal(p1[0],p1[1]) :
unit([p1.y-p2.y,p2.x-p1.x]);
@ -895,7 +895,7 @@ function in_front_of_plane(plane, point) =
// stroke([[0,0],rad*[cos(315),sin(315)]]);
// }
// }
// place_copies(pts) color("blue") circle(d=2, $fn=12);
// move_copies(pts) color("blue") circle(d=2, $fn=12);
// translate(circ[0]) color("red") circle(d=2, $fn=12);
// labels = [[pts[0], "pt1"], [pts[1],"pt2"], [pts[2],"pt3"], [circ[0], "CP"], [circ[0]+[cos(315),sin(315)]*rad*0.7, "r"]];
// for(l=labels) translate(l[0]+[0,2]) color("black") text(text=l[1], size=2.5, halign="center");
@ -935,7 +935,7 @@ function find_circle_2tangents(pt1, pt2, pt3, r=undef, d=undef) =
// circ = find_circle_3points(pts[0], pts[1], pts[2]);
// translate(circ[0]) color("green") stroke(circle(r=circ[1]),closed=true,$fn=72);
// translate(circ[0]) color("red") circle(d=3, $fn=12);
// place_copies(pts) color("blue") circle(d=3, $fn=12);
// move_copies(pts) color("blue") circle(d=3, $fn=12);
function find_circle_3points(pt1, pt2, pt3) =
(is_undef(pt2) && is_undef(pt3) && is_list(pt1))? find_circle_3points(pt1[0], pt1[1], pt1[2]) :
collinear(pt1,pt2,pt3)? [undef,undef,undef] :
@ -984,8 +984,8 @@ function find_circle_3points(pt1, pt2, pt3) =
// tanpts = subindex(find_circle_tangents(r=r, cp=cp, pt=pt),1);
// color("yellow") translate(cp) circle(r=r);
// color("cyan") for(tp=tanpts) {stroke([tp,pt]); stroke([tp,cp]);}
// color("red") place_copies(tanpts) circle(d=3,$fn=12);
// color("blue") place_copies([cp,pt]) circle(d=3,$fn=12);
// color("red") move_copies(tanpts) circle(d=3,$fn=12);
// color("blue") move_copies([cp,pt]) circle(d=3,$fn=12);
function find_circle_tangents(r, d, cp, pt) =
assert(is_num(r) || is_num(d))
assert(is_vector(cp))
@ -1159,15 +1159,15 @@ function polygon_shift_to_closest_point(path, pt) =
// pent = subdivide_path([for(i=[0:4])[sin(72*i),cos(72*i)]],30);
// circ = circle($fn=30,r=2.2);
// reindexed = reindex_polygon(circ,pent);
// place_copies(concat(circ,pent)) circle(r=.1,$fn=32);
// color("red") place_copies([pent[0],circ[0]]) circle(r=.1,$fn=32);
// move_copies(concat(circ,pent)) circle(r=.1,$fn=32);
// color("red") move_copies([pent[0],circ[0]]) circle(r=.1,$fn=32);
// color("blue") translate(reindexed[0])circle(r=.1,$fn=32);
// Example(2D): The indexing that minimizes the total distance will not necessarily associate the nearest point of `poly` with the reference, as in this example where again the blue dot indicates the 0th entry in the reindexed result.
// pent = move([3.5,-1],p=subdivide_path([for(i=[0:4])[sin(72*i),cos(72*i)]],30));
// circ = circle($fn=30,r=2.2);
// reindexed = reindex_polygon(circ,pent);
// place_copies(concat(circ,pent)) circle(r=.1,$fn=32);
// color("red") place_copies([pent[0],circ[0]]) circle(r=.1,$fn=32);
// move_copies(concat(circ,pent)) circle(r=.1,$fn=32);
// color("red") move_copies([pent[0],circ[0]]) circle(r=.1,$fn=32);
// color("blue") translate(reindexed[0])circle(r=.1,$fn=32);
function reindex_polygon(reference, poly, return_error=false) =
assert(is_path(reference) && is_path(poly))
@ -1213,8 +1213,8 @@ function reindex_polygon(reference, poly, return_error=false) =
// $fn=32;
// pentagon = subdivide_path(pentagon(side=2),60);
// hexagon = subdivide_path(hexagon(side=2.7),60);
// color("red") place_copies(scale(1.4,p=align_polygon(pentagon,hexagon,[0:10:359]))) circle(r=.1);
// place_copies(concat(pentagon,hexagon))circle(r=.1);
// color("red") move_copies(scale(1.4,p=align_polygon(pentagon,hexagon,[0:10:359]))) circle(r=.1);
// move_copies(concat(pentagon,hexagon))circle(r=.1);
function align_polygon(reference, poly, angles, cp) =
assert(is_path(reference) && is_path(poly))
assert(len(reference)==len(poly), "Polygons must be the same length to be aligned in align_polygon")

View file

@ -83,7 +83,7 @@ module hull_points(points, fast=false) {
// Example(2D):
// pts = [[-10,-10], [0,10], [10,10], [12,-10]];
// path = hull2d_path(pts);
// place_copies(pts) color("red") sphere(1);
// move_copies(pts) color("red") sphere(1);
// polygon(points=pts, paths=[path]);
function hull2d_path(points) =
(len(points) < 3)? [] : let(
@ -156,7 +156,7 @@ function _remove_conflicts_and_insert_point(polygon, conflicts, point) =
// Example(3D):
// pts = [[-20,-20,0], [20,-20,0], [0,20,5], [0,0,20]];
// faces = hull3d_faces(pts);
// place_copies(pts) color("red") sphere(1);
// move_copies(pts) color("red") sphere(1);
// %polyhedron(points=pts, faces=faces);
function hull3d_faces(points) =
(len(points) < 3)? list_range(len(points)) : let (

View file

@ -1133,34 +1133,34 @@ function _sum_preserving_round(data, index=0) =
// method = One of `"length"` or `"segment"`. If `"length"`, adds vertices evenly along the total path length. If `"segment"`, adds points evenly among the segments. Default: `"length"`
// Example(2D):
// mypath = subdivide_path(square([2,2],center=true), 12);
// place_copies(mypath)circle(r=.1,$fn=32);
// move_copies(mypath)circle(r=.1,$fn=32);
// Example(2D):
// mypath = subdivide_path(square([8,2],center=true), 12);
// place_copies(mypath)circle(r=.2,$fn=32);
// move_copies(mypath)circle(r=.2,$fn=32);
// Example(2D):
// mypath = subdivide_path(square([8,2],center=true), 12, method="segment");
// place_copies(mypath)circle(r=.2,$fn=32);
// move_copies(mypath)circle(r=.2,$fn=32);
// Example(2D):
// mypath = subdivide_path(square([2,2],center=true), 17, closed=false);
// place_copies(mypath)circle(r=.1,$fn=32);
// move_copies(mypath)circle(r=.1,$fn=32);
// Example(2D): Specifying different numbers of points on each segment
// mypath = subdivide_path(hexagon(side=2), [2,3,4,5,6,7], method="segment");
// place_copies(mypath)circle(r=.1,$fn=32);
// move_copies(mypath)circle(r=.1,$fn=32);
// Example(2D): Requested point total is 14 but 15 points output due to extra end point
// mypath = subdivide_path(pentagon(side=2), [3,4,3,4], method="segment", closed=false);
// place_copies(mypath)circle(r=.1,$fn=32);
// move_copies(mypath)circle(r=.1,$fn=32);
// Example(2D): Since 17 is not divisible by 5, a completely uniform distribution is not possible.
// mypath = subdivide_path(pentagon(side=2), 17);
// place_copies(mypath)circle(r=.1,$fn=32);
// move_copies(mypath)circle(r=.1,$fn=32);
// Example(2D): With `exact=false` a uniform distribution, but only 15 points
// mypath = subdivide_path(pentagon(side=2), 17, exact=false);
// place_copies(mypath)circle(r=.1,$fn=32);
// move_copies(mypath)circle(r=.1,$fn=32);
// Example(2D): With `exact=false` you can also get extra points, here 20 instead of requested 18
// mypath = subdivide_path(pentagon(side=2), 18, exact=false);
// place_copies(mypath)circle(r=.1,$fn=32);
// move_copies(mypath)circle(r=.1,$fn=32);
// Example(FlatSpin): Three-dimensional paths also work
// mypath = subdivide_path([[0,0,0],[2,0,1],[2,3,2]], 12);
// place_copies(mypath)sphere(r=.1,$fn=32);
// move_copies(mypath)sphere(r=.1,$fn=32);
function subdivide_path(path, N, closed=true, exact=true, method="length") =
assert(is_path(path))
assert(method=="length" || method=="segment")

View file

@ -42,7 +42,7 @@
// Example(2D): Called as Function
// path = square([40,30], chamfer=5, anchor=FRONT, spin=30);
// stroke(path, closed=true);
// place_copies(path) color("blue") circle(d=2,$fn=8);
// move_copies(path) color("blue") circle(d=2,$fn=8);
module square(size=1, center, rounding=0, chamfer=0, anchor, spin=0) {
size = is_num(size)? [size,size] : point2d(size);
anchor = get_anchor(anchor, center, FRONT+LEFT, FRONT+LEFT);

View file

@ -445,11 +445,11 @@ function _rounding_offsets(edgespec,z_dir=1) =
// Example(2D): The curve passes through all the points, but features some unexpected wiggles. These occur because the curvature is too low to change fast enough.
// path = [[0,0], [0,3], [.5,2.8], [1,2.2], [1,0]];
// polygon(smooth_path(path));
// color("red") place_copies(path)circle(r=.1,$fn=16);
// color("red") move_copies(path)circle(r=.1,$fn=16);
// Example(2D): Using the k parameter is one way to fix this problem. By allowing sharper curvature (k<1) at the two points next to the problematic point we can achieve a smoother result. The other fix is to move your points.
// path = [[0,0], [0,3], [.5,2.8], [1,2.2], [1,0]];
// polygon(smooth_path(path,k=[1,.5,1,.5,1]));
// color("red") place_copies(path)circle(r=.1,$fn=16);
// color("red") move_copies(path)circle(r=.1,$fn=16);
function smooth_path(path, tangents, k, splinesteps=10, closed=false) =
let (
bez = path_to_bezier(path, tangents, k=k, closed=closed)

View file

@ -665,7 +665,6 @@ module cyl(
rotate_extrude(convexity=2) {
polygon(path);
}
//!place_copies(path) sphere(d=1);
}
}
children();

View file

@ -9,17 +9,17 @@ if (true) {
// Display of all solids with insphere, midsphere and circumsphere
for(i=[0:len(_polyhedra_)-1]) {
place_copies([[3*i,0,0]]) // Plain polyhedron
move_copies([[3*i,0,0]]) // Plain polyhedron
regular_polyhedron(index=i, mr=1,facedown=true);
place_copies([[3*i,3.5,0]]){ // Inner radius means sphere touches faces of the polyhedron
move_copies([[3*i,3.5,0]]){ // Inner radius means sphere touches faces of the polyhedron
sphere(r=1.005); // Sphere is slightly oversized so you can see it poking out from each face
%regular_polyhedron(index=i, ir=1,facedown=true);
}
place_copies([[3*i,7,0]]){ // Mid radius means the sphere touches the center of each edge
move_copies([[3*i,7,0]]){ // Mid radius means the sphere touches the center of each edge
sphere(r=1);
%regular_polyhedron(index=i, mr=1,facedown=true);
}
place_copies([[3*i,11,0]]){ // outer radius means points of the polyhedron are on the sphere
move_copies([[3*i,11,0]]){ // outer radius means points of the polyhedron are on the sphere
%sphere(r=.99); // Slightly undersized sphere means the points poke out a bit
regular_polyhedron(index=i, or=1,facedown=true);
}

View file

@ -68,7 +68,7 @@
// mat3d = move([2,3,4]); // Returns: [[1,0,0,2],[0,1,0,3],[0,0,1,4],[0,0,0,1]]
module move(v=[0,0,0], x=0, y=0, z=0)
{
translate(v+[x,y,z]) children();
translate(point3d(v)+[x,y,z]) children();
}
function move(v=[0,0,0], p=undef, x=0, y=0, z=0) =
@ -909,7 +909,7 @@ function zflip(z=0,p) =
// Example(2D): Calling as a 2D Function
// pts = skew(p=square(40,center=true), sxy=0.5);
// color("yellow") stroke(pts, closed=true);
// color("blue") place_copies(pts) circle(d=3, $fn=8);
// color("blue") move_copies(pts) circle(d=3, $fn=8);
// Example(FlatSpin): Calling as a 3D Function
// pts = skew(p=path3d(square(40,center=true)), szx=0.5, szy=0.3);
// trace_polyline(close_path(pts), showpts=true);

View file

@ -8,7 +8,7 @@
//////////////////////////////////////////////////////////////////////
BOSL_VERSION = [2,0,222];
BOSL_VERSION = [2,0,223];
// Section: BOSL Library Version Functions

View file

@ -656,7 +656,7 @@ module vnf_validate(vnf, size=1, show_warns=true, check_isects=false) {
stroke(pts, width=size, closed=true);
polyhedron(pts,[[for (i=idx(pts)) i]]);
} else {
place_copies(pts) sphere(d=size*3, $fn=18);
move_copies(pts) sphere(d=size*3, $fn=18);
}
}
}