分布器

目录

  1. 分布器
    1. 分布器 / Distributors
      1. 变换分布器 / Transform Distributors
      2. 旋转分布器/Rotational Distributors

分布器 / Distributors

分布器是一类模块,用于在直线、区域、体积或环形上放置多个子对象的副本。
许多变换操作都有一个或多个对应的分布变体。

变换操作 相关的分布器
left()right() xcopies()
fwd()back() ycopies()
down()up() zcopies()
move()translate() move_copies()line_copies()grid_copies()
xrot() xrot_copies()
yrot() yrot_copies()
zrot() zrot_copies()
rot()rotate() rot_copies()arc_copies()
xflip() xflip_copy()
yflip() yflip_copy()
zflip() zflip_copy()
mirror() mirror_copy()

变换分布器 / Transform Distributors

使用 xcopies(),你可以沿 X 轴生成一排均匀间隔的形状副本。 例如,要沿 X 轴生成 5 个球体,每个球体间隔 20 个单位,可以这样写:

include <BOSL2/std.scad>
xcopies(20, n=5) sphere(d=10);

请注意,xcopies() 的第一个参数是间隔参数,因此你无需提供 spacing= 参数名称。

类似地,ycopies() 会沿 Y 轴生成一排均匀间隔的形状副本。例如,要沿 Y 轴生成 5 个球体,每个球体间隔 20 个单位,可以这样写:

include <BOSL2/std.scad>
ycopies(20, n=5) sphere(d=10);

同样地,zcopies() 会沿 Z 轴生成一排均匀间隔的形状副本。例如,要沿 Z 轴生成 5 个球体,每个球体间隔 20 个单位,可以这样写:

include <BOSL2/std.scad>
zcopies(20, n=5) sphere(d=10);

如果你未为 xcopies()ycopies()zcopies() 提供 n= 参数,它们的默认值是 2(两个)副本。实际上,这是最常见的用法:

include <BOSL2/std.scad>
xcopies(20) sphere(d=10);
include <BOSL2/std.scad>
ycopies(20) sphere(d=10);
include <BOSL2/std.scad>
zcopies(20) sphere(d=10);

如果你不确定想要的间隔,但知道希望副本分布的总长度,可以使用 l= 参数代替 spacing= 参数:

include <BOSL2/std.scad>
xcopies(l=100, n=5) sphere(d=10);
include <BOSL2/std.scad>
ycopies(l=100, n=5) sphere(d=10);
include <BOSL2/std.scad>
zcopies(l=100, n=5) sphere(d=10);

如果你不希望副本的直线排列以原点为中心,可以通过 sp= 参数指定起始点。对于 xcopies(),副本的排列将从起始点向右延伸:

include <BOSL2/std.scad>
xcopies(20, n=5, sp=[0,0,0]) sphere(d=10);

对于 ycopies(),副本的排列将从起始点向后延伸:

include <BOSL2/std.scad>
ycopies(20, n=5, sp=[0,0,0]) sphere(d=10);

对于 zcopies(),副本的排列将从起始点向上延伸:

include <BOSL2/std.scad>
zcopies(20, n=5, sp=[0,0,0]) sphere(d=10);

如果你需要沿任意直线分布副本,可以使用 line_copies() 命令。你可以通过 spacing= 参数同时指定直线的方向向量和副本的间隔:

include <BOSL2/std.scad>
line_copies(spacing=(BACK+RIGHT)*20, n=5) sphere(d=10);

通过 p1= 参数,你可以指定直线的起点:

include <BOSL2/std.scad>
line_copies(spacing=(BACK+RIGHT)*20, n=5, p1=[0,0,0]) sphere(d=10);

如果同时提供 p1=p2= 参数,你可以同时确定副本

include <BOSL2/std.scad>
line_copies(p1=[0,100,0], p2=[100,0,0], n=4)
    sphere(d=10);

grid_copies() 命令允许你同时在 X 和 Y 轴上分布副本:

include <BOSL2/std.scad>
grid_copies(20, n=6) sphere(d=10);

你可以分别为 X 轴和 Y 轴指定间隔,同时也可以指定行数和列数:

include <BOSL2/std.scad>
grid_copies([20,30], n=[6,4]) sphere(d=10);

grid_copies() 的另一个巧妙功能是可以使输出呈现交错排列:

include <BOSL2/std.scad>
grid_copies(20, n=[12,6], stagger=true) sphere(d=10);

如果将 stagger="alt",可以获得另一种交错模式:

include <BOSL2/std.scad>
grid_copies(20, n=[12,6], stagger="alt") sphere(d=10);

默认情况下,如果为间隔值提供一个标量,交错排列将生成一个六边形网格,此间隔表示从一个项目到周围六个项目的距离。如果将间隔值设置为包含两个元素的向量,则会分别指定列间和行间的 X 和 Y 间隔。

include <BOSL2/std.scad>
grid_copies([20,20], n=6, stagger=true) sphere(d=10);

或者,你可以通过指定网格的尺寸和间隔来定义网格:

include <BOSL2/std.scad>
grid_copies(20, size=100) sphere(d=10);
include <BOSL2/std.scad>
grid_copies(20, size=[100,80]) sphere(d=10);
include <BOSL2/std.scad>
grid_copies(20, size=[100,80], stagger=true) sphere(d=10);

你还可以通过指定网格的尺寸以及列数和行数来创建网格:

include <BOSL2/std.scad>
grid_copies(n=5, size=100) sphere(d=10);
include <BOSL2/std.scad>
grid_copies(n=[4,5], size=100) sphere(d=10);
include <BOSL2/std.scad>
grid_copies(n=[4,5], size=[100,80]) sphere(d=10);

最后,grid_copies() 命令还允许你提供一个多边形或区域形状,用于填充项目。只有网格中中心点位于该多边形或区域内的项目才会被创建。例如,要用项目填充一个星形区域,可以这样实现:

include <BOSL2/std.scad>
poly = [for (i=[0:11]) polar_to_xy(50*(i%2+1), i*360/12-90)];
grid_copies(5, stagger=true, inside=poly) {
    cylinder(d=4,h=10,spin=90,$fn=6);
}

旋转分布器/Rotational Distributors

您可以围绕中心旋转一个锥体,并创建六个副本:

include <BOSL2/std.scad>
zrot_copies(n=6) yrot(90) cylinder(h=50,d1=0,d2=20);

To Be Completed