Skip to content

图形和路径

图形 vs 路径

shapes 库中的每个函数创建一个 xy 平面中的 2D 坐标列表,格式为

[ [x0,y0], [x1,y1], [x2,y2], ... ]

paths 库中的每个函数创建一个 xz 平面中的 3D 向量列表,格式为

[ vec(x0,y0,z0), vec(x1,y1,z1), ... ]

因此,shapes.rectangle()paths.rectangle() 的输出是不同的。然而,除了库名不同,命令的语法几乎相同。以下描述是为 shapes 编写的,但可以通过将“shapes”改为“paths”来制作 paths。在必要时注明 shapespaths 之间的差异。

矩形

python
rt = shapes.rectangle(width=10, height=6)
属性名类型说明
width标量矩形的宽度,默认值 1
height标量矩形的高度,默认值 1

上述函数创建一个宽为 10、高为 6 的矩形角点的 2D x-y 坐标列表。如果省略高度值,则形状为边长等于给定宽度的正方形。如果打印上面创建的列表的值,将看到从右下角开始逆时针继续的 2D 坐标列表,最终回到起始位置:

[[5, -3], [5, 3], [-5, 3], [-5, -3], [5, -3]]

可以通过执行以下语句在 VPython 中可视化矩形形状,该语句将矩形形状沿从 vec(0,0,0) 到 vec(0,0,-0.1) 的线挤压到屏幕中:

python
rectshape = shapes.rectangle(width=10, height=6)
linepath = [ vec(0,0,0), vec(0,0,-0.1) ]
extrusion( shape=rectshape, path=linepath )

矩形的其他参数:

python
rt = shapes.rectangle(rotate=pi/6, roundness=0.1, invert=True, scale=2, pos=[2,1])
属性名类型说明
rotate标量矩形按指定角度(以弧度为单位)逆时针旋转。默认值 0
roundness标量将锐角替换为半径为 (roundness * min(height,width)) 的圆弧
invert布尔值设置 invertTrue 并设置 roundness 会产生斜角
scale标量将高度和宽度乘以 scale。默认值 1
xscale标量仅宽度的缩放因子
yscale标量仅高度的缩放因子
thickness标量仅形状使用。创建一个厚度为 (thickness * min(height,width)) 的空心矩形框,即一个带矩形孔的矩形。挤出此形状将形成一个空心盒。默认值 0(无孔)。如果 thickness > 0,则形状将包含两个 2D 点列表:一个用于内部轮廓,一个用于外部轮廓
pos列表仅形状使用。相对于路径的 2D 位置。默认值:矩形的中心放置在路径位置上

从左到右的图像:旋转矩形,圆角矩形,倒角矩形,矩形框

圆形

python
cr = shapes.circle(radius=2, np=128)
属性名类型说明
radius标量圆的半径。默认值 1
np标量用于近似圆的点数。默认值 64。未完成的圆将没有全部点数
scale标量将高度和宽度乘以 scale。默认值 1
xscale标量仅宽度的缩放因子
yscale标量仅高度的缩放因子
angle1标量从 +x 轴逆时针的起始角度,以弧度为单位。默认值 0
angle2标量从 +x 轴逆时针的结束角度,以弧度为单位。默认值 2*pi
thickness标量仅形状使用。创建宽度为 (thickness * radius) 的圆环。挤出此形状将形成一个空心圆柱。默认值 0(无孔)
pos列表仅形状使用。相对于路径的 2D 位置。默认值:圆的中心放置在路径位置上

从左到右的图像:圆环,angle1 和 angle2,以及 thickness

椭圆

python
myellipse = shapes.ellipse(width=5, height=3)
属性名类型说明
width标量x 轴方向的尺寸。默认值 2
height标量y 轴方向的尺寸。默认值 1

ellipse 的属性与 circle 的属性几乎相同,不同之处在于 xscaleyscale 被替换为 widthheight。椭圆的默认宽度是圆的两倍。

弧形

python
myarc = shapes.arc(radius=2, angle1=0, angle2=pi/2)
属性名类型说明
radius标量弧的半径

arc 的属性与 circle 的属性非常相似。弧可以旋转和缩放。对于形状,如果未指定厚度,弧形状会被赋予一个非常小的厚度,以便产生闭合轮廓。

注意,np 是完整圆中的点数,而不是弧本身的点数。

沿弧路径挤出的弧形状可以形成带状物:

python
hshape = shapes.arc(angle1=0, angle2=pi/3)
hpath = paths.arc(angle1=pi/2, angle2=pi)
demihemi = extrusion(shape=hshape, path=hpath, color=color.yellow)

线条

python
Lshape = shapes.line(start=(1,0), end=(1,1), np=20)
属性名类型说明
start列表对于形状,线条起点的 2D 坐标。默认值 [0,0]。对于路径,起点是向量。
end列表对于形状,线条终点的 2D 坐标。默认值 [0,1]。对于路径,终点是向量。
np标量线条中的均匀分布点数

创建从 startend 的直线,总点数为 n,间隔均匀。如果要在挤出中使用 twist,这对路径很有用。

上图:沿着 30 个点的路径挤出的矩形,每步有 0.1 弧度的扭曲。

三角形

python
trishape = shapes.triangle(length=5, roundness=0.2)
属性名类型说明
length标量等边三角形的边长
rotate标量矩形按指定角度(以弧度为单位)逆时针旋转。默认值 0
roundness标量将锐角替换为半径为 roundness * length 的圆弧
invert布尔值设置 invertTrue 并设置 roundness 会产生倒角
scale标量将高度和宽度乘以 scale。默认值 1
xscale标量仅底边的缩放因子
yscale标量仅高的缩放因子
thickness标量仅形状使用。创建一个厚度为 thickness * length 的空心矩形框,即一个带矩形孔的矩形。挤出此形状将形成一个空心对象。默认值 0(无孔)。如果 thickness > 0,则形状将包含两个 2D 点列表:一个用于内部轮廓,一个用于外部轮廓
pos列表仅形状使用。相对于路径的 2D 位置。默认值:矩形的中心放置在路径位置上

五边形

python
pt = shapes.pentagon(length=3)
属性名类型说明
length标量边长
rotate标量按指定角度(以弧度为单位)逆时针旋转。默认值 0
roundness标量将锐角替换为半径为 (roundness * length) 的圆弧
invert布尔值设置 invertTrue 并设置 roundness 会产生倒角
scale标量将高度和宽度乘以 scale。默认值 1
xscale标量仅宽度的缩放因子
yscale标量仅高度的缩放因子
thickness标量仅形状使用。创建一个五边形框。挤出此形状将形成一个空心五边形。默认值 0(无孔)。如果 thickness > 0,则形状将包含两个 2D 点列表:一个用于内部轮廓,一个用于外部轮廓
pos列表仅形状使用。相对于路径的 2D 位置。默认值:五边形的中心放置在路径位置上

六边形

python
hx = shapes.hexagon(length=5)

hexagon 对象与 pentagon 拥有相同的属性。

八边形

python
oc = shapes.octagon(length=5)

octagon 形状与 pentagon 拥有相同的属性。

多边形

python
poly = shapes.ngon(np=7, length=5)
属性名类型说明
np标量图形的边数
radius标量n 边形可以嵌入一个具有此半径的圆中。此情况下边长会自动计算

其他参数与 pentagon 相同。

星形

python
starshape = shapes.star(n=6, radius=3, iradius=1)
属性名类型说明
n标量星形的“光束”数目。默认值:5
radius标量星形适合的圆的半径。改变 radius 仅影响星形的外凸顶点,内凹顶点不变
iradius标量内半径:经过星形内凸顶点的圆的半径。默认值为 0.5 * radius
rotate标量围绕中心旋转
roundness标量将锐角替换为圆弧
invert布尔值设置 invertTrue 并设置 roundness 会产生倒角
scale标量将高度和宽度乘以 scale。默认值 1
xscale标量仅宽度的缩放因子
yscale标量仅高度的缩放因子
thickness标量仅形状使用。创建一个星形框。挤出此形状将形成一个空心对象。默认值 0(无孔)。如果 thickness > 0,则形状将包含两个 2D 点列表:一个用于内部轮廓,一个用于外部轮廓
pos列表仅形状使用。相对于路径的 2D 位置。默认值:星形的中心放置在路径位置上

梯形

python
tr = shapes.trapezoid(pos=[-2,3], width=5, height=1, top=3)
属性名类型说明
width标量底边的宽度
height标量从底边到顶边的垂直距离
top标量顶边的长度。默认值为 0.5 * width

其他属性请参考 pentagon

十字形

python
st = shapes.cross(width=10, thickness=2)
属性名类型说明
width标量十字形的宽度。默认值 1
thickness标量臂的厚度。默认值 0.2。注意,这不会创建空心框架
rotate标量按指定角度(以弧度为单位)逆时针旋转。默认值 0
scale标量将高度和宽度乘以 scale。默认值 1
xscale标量仅宽度的缩放因子
yscale标量仅高度的缩放因子
pos列表仅形状使用。相对于路径的 2D 位置。默认值:十字形的中心放置在路径位置上

paths.cross() 生成路径,但 thickness 属性对于 thickness >= 1 时不会产生可预测的结果。

此函数仅适用于形状。如果要指定自己的路径,只需将点列表作为参数传递给挤出。

python
ptshape = shapes.points(pos=[[1,0], [1,1], [-2,3], [1,0]], rotate=pi/4)
属性名类型说明
pos列表定义多边形边界的点列表。最后一个点必须与第一个点相同。
scale标量将高度和宽度乘以 scale。默认值 1
rotate标量围绕中心旋转
roundness标量将锐角替换为圆弧

请注意,pos 并不是相对于路径的偏移量,如在其他形状中一样。

齿轮

齿轮用于通过改变旋转速度和方向以及相关的扭矩来传递运动。有关齿轮和齿轮术语的详细说明,请参考齿轮。请务必点击放大解释齿轮命名法的图表。它提到了“渐开线齿轮”,可在渐开线齿轮中讨论。默认的齿轮形状是“正齿轮”。

齿轮参数定义了齿轮的行为。这些参数必须相互协调以获得定义良好的齿轮。此程序中并未提供所有参数以完全控制齿轮结构。某些参数是通过使用其他参数计算的,因此可能会导致齿轮结构不一致。许多齿轮参数是从半径派生的。用户有责任提供一组一致的参数。

python
g = shapes.gear()
属性名类型说明
radius标量从齿轮中心延伸到齿根和齿顶中点。通常,将两个齿轮的中心放置在两个半径之隔通常可以使齿轮正确啮合。默认值 1。
scale标量对齿轮应用统一缩放
pos列表仅形状使用。相对于路径的 2D 位置。默认值:矩形的中心放置在路径位置上
n整数定义齿轮的齿数。通常,“齿尺寸”和齿数应定义齿轮的周长(或半径),但在此程序中,“齿尺寸”不是控制参数,而是根据齿数和半径计算的。因此,齿数 n 可以任意设置,并且可以得到一些不合理的“齿尺寸”值。用户应适当设置参数以获得合理的齿结构。默认齿数为 20。
phi标量耦合齿轮在旋转过程中在齿轮轮廓上施加力。Phi 被称为压力角,这是定义齿轮轮廓以获得更好接触的基本参数之一。同样,“齿尺寸”组件如底部间隙(大致为齿底之间的间隙)和顶部间隙(齿顶的厚度)是使用压力角计算的。默认压力角为 20 度。
addendum标量“齿深度”定义为齿顶和齿根的总和。齿顶是从半径到齿顶的部分。默认值为 0.08 倍半径。
dedendum标量齿根是从节圆半径到齿深度的部分。默认值为 0.1 倍半径。
fradius标量底部圆角半径,定义齿根与齿根之间的圆弧半径。默认值为 0.02 倍半径。
rotate标量按指定角度(以弧度为单位)逆时针旋转。默认值 0
res标量此参数定义绘图网格分辨率,不影响齿轮结构。由于大多数网格点位于圆上或定义齿轮轮廓的曲线上,res 用于控制网格不同部分在不同尺度下的曲率分辨率。默认值为 1.0,增加 res 可以获得更好的分辨率。

内向齿轮

您可以通过将圆形外形与内齿轮形状组合来制作带有内向齿的齿轮:

python
outer = shapes.circle(radius=1) # 圆盘
inner = shapes.gear(radius=0.8) # 圆盘中的齿轮形状孔
extrusion(path=[vec(0,0,0), vec(0,0,0.2)], shape=[outer, inner])