十字架2D图形可以看作由两个完全相同的长方形组成,其属性width是长方形长边的长度,默认值为1,属性thickness不是创建空心框架,而是长方形短边的长度,默认值为0.2。如用十字架2D图形作为拉伸路径,即path=paths.cross(),其thickness属性大于等于1时,其结果无法预测。为验证属性width和thickness的值,执行如下程序。
>>> from vpython import *
>>> print(shapes.cross(width=4, thickness=2))
[[2.0, -1.0], [2.0, 1.0], [1.0, 1.0], [1.0, 2.0], [-1.0, 2.0], [-1.0, 1.0], [-2.0, 1.0],
[-2.0, -1.0], [-1.0, -1.0], [-1.0, -2.0], [1.0, -2.0], [1.0, -1.0], [2.0, -1.0]]
在2D坐标上画出各点,连接各点将看到一个十字架2D图形,可以看出其属性width=4, thickness=2。
例1,将2D图形圆,用2D十字架外轮廓线作为拉伸路径,创建用圆管组成的3D十字架图形。请注意,2D图形圆,在xy平面,作为拉伸路径的十字架外轮廓线,在xz平面,可以用语句:print(paths.cross(width=4, thickness=0.99))显示拉伸路径的3D坐标,将看到显示的y坐标值都为0,说明该拉伸路径在xz平面。拉伸过程是:xy平面的圆,将xz平面的十字架外轮廓线作为拉伸路径,沿该拉伸路径,生成用圆管组成的3D十字架。为了能完整地看到生成的用圆管组成的3D十字架,3D十字架必须旋转90度,其旋转轴必须和坐标系x轴平行,并且穿过3D十字架自己中心点。旋转函数rotate()参数的意义,请参见本人的博文:“VPython程序设计入门”。
from vpython import *
c=extrusion(path=paths.cross(width=4, thickness=0.99), #拉伸路径是十字架
shape=shapes.circle(radius=0.2), color=color.green) #被拉伸图形是圆
c.rotate(angle=radians(90), axis=vec(1,0,0)) #3D十字架旋转90度
运行效果

例2,类似例1,但是被拉伸的2D图形是六边形(hexagon),其属性length是一条边的长度。拉伸路径是矩形,矩形的长度=5,宽度=2。程序如下。
from vpython import *
h=extrusion(path=paths.rectangle(width=5, height=2),
shape=shapes.hexagon(length=0.3), color=color.red)
h.rotate(angle=radians(71), axis=vec(1,0,0))
运行效果

下例中用到5个2D图形,其中弧(arc)作为拉伸路径,三角形和五角星作为拉伸对象,圆和梯形用来定义孔洞形状。弧是圆的一部分,其属性radius是该弧所在圆的半径,默认为2;弧起点和圆心连线,该连线和x轴之间角度是属性angle1(起始角度),默认为0;弧终点和圆心连线,该连线和x轴之间的角度是属性angle2(结束角度),默认为pi/2(90度)。等边三角形(triangle)边长为2,将沿弧指定的拉伸路径,被拉伸为3D图形,有两个孔洞,孔洞的形状由2D图形圆(circle)和梯形(trapezoid)确定,参见我的博文:将2D图形圆拉伸为有三角形和梯形孔洞的圆柱。五角星也将沿弧指定的拉伸路径,被拉伸为3D图形,五角星除了参数pos,其余参数都为默认值。可以看出,两个2D图形,可以使用同一个拉伸路径。start_face_color是拉伸开始面的颜色,end_face_color是拉伸结束面的颜色。
五角星有5个外角都小于90度,两个外角之间有一个内角,大于90度,共有5个内角。五角星常用属性有3个,默认n=5是5角星,如n=6是6角星;radius是5角星的外接圆的半径,默认为1;过5个内角顶点做圆,该圆半径为属性iradius,默认值为0.5*radius。
例3,2D图形三角形和五角星,沿弧指定的拉伸路径,请注意,该路径在xz平面,拉伸出两个3D图形。这两个3D图形,将成为一个独立的组合3D图形,有共用的属性,例如,属性size和pos,修改这两个属性,将同时修改用2D三角形和五角星拉伸的3D图形。程序如下。
from vpython import *
a=extrusion(path=paths.arc(radius=1.7,angle2=pi),texture=textures.metal,
shape=[[shapes.triangle(length=2),shapes.circle(pos=[0,0.5],radius=0.2),
shapes.trapezoid(pos=[0,-0.2],width=0.6, height=0.4)],[shapes.star(pos=[0,2.5])]],
start_face_color=vec(1,0,0),end_face_color=vec(0,0,1))
a.size=vec(10,10,10)
a.pos=vec(0,-1.5,0)
a.rotate(angle=radians(30), axis=vec(0,1,0))
运行效果

337

被折叠的 条评论
为什么被折叠?



