Engee 文档
Notebook

西拉西多面体(Silahedron)的建造

在这个演示示例中,我们考虑使用函数构建Silashi多面体 mesh3d() 从图书馆 Plots.jl.

导言

Силацдр是一个非凸面环形多面体,其欧拉-庞加莱特性具有以下相等性

哪里 -多面体的面数,以及 -在其被嵌入的表面上的孔的数量。
这种相等性来自这样一个条件,即在这样一个多面体中,每个面都与任何其他面有一个共同的边缘。

Sylahedron有7个六边形面,14个顶点和21条边。 在这个例子中,我们将根据顶点的可用坐标在笛卡尔坐标系中构造这个多面体。

顶点的坐标

首先,我们将介绍面和顶点的符号。 顶点具有从0到13的连续数字名称,成对全等面具有连续的字母数字名称:A1,A2,B1,B2,B1,B2,并且未配对的面具有字母名称G
下面所示的多面体扫描上显示了相应的符号,并引入了调色板,稍后将在sylahedron的构建中使用。

Net_of_szilassi_polyhedron.png

让我们将变量添加到工作区Engee,以表征Sylahedron顶点的笛卡尔坐标。 这些坐标是从多面体的几何中心位于坐标原点的条件确定的,并且其最小的面部的长度为一。

In [ ]:
# 顶点的坐标:
# [x,y,z]顶点编号的坐标
Vertexes=[
            [12,  0, 12],           # 0
            [-12, 0, 12],           # 1
            [0, 12.6, -12],         # 2
            [0, -12.6, -12],        # 3
            [2, -5, -8],            # 4
            [-2, 5, -8],            # 5
            [3.75, 3.75, -3],       # 6
            [-3.75, -3.75, -3],     # 7
            [4.5, -2.5, 2],         # 8
            [-4.5, 2.5, 2],         # 9
            [7, 0, 2],              # 10
            [-7, 0, 2],             # 11
            [7, 2.5, 2],            # 12
            [-7, -2.5, 2]           # 13
          ];

# 沿轴提取顶点坐标的矢量
Vertice_matrix=基数。堆栈(顶点,dims=1;
顶点X=顶点矩阵[:,1];
Vertexes Y=Vertexes矩阵[:,2];
Vertice_z=Vertice_matrix[:,3];

在向量中 Вершины 给出了具有注释中指示的序号的顶点的坐标向量。 为了方便它们的构造,沿轴的坐标被提取成单独的矢量。

连接顶点

使用函数构建面 Plots.mesh3d() 有必要定义三个向量(I,J,K),其相应的索引是属于多面体面的三角形的顶点。 例如,在面A1中有4个由顶点0-10-12,0-4-10,4-2-104-3-2形成的不相交三角形。
因此,我们将sylahedron的每个面划分为不相交的三角形,并将形成它们的顶点写入向量I,J,K的相应索引中。

In [ ]:
# 将面划分为三角形:
# 面A1(由三角形0-10-12,0-4-10,4-2-10,4-3-2组成)
A1_i= [0, 0, 4, 4];
A1_j= [10, 4, 2, 3];
A1_k = [12, 10, 10, 2];
Connection_A1=(A1_i,A1_j,A1_k);

# 面对A2
A2_i= [1, 1, 5, 5];
A2_j= [11, 5, 3, 2];
A2_k = [13, 11, 11, 3];
Connection_A2=(A2_i,A2_j,A2_k);

# 脸B1
B1_i= [0, 0, 0, 4];
B1_j= [8, 1, 13, 8];
B1_k= [4, 13, 8, 7];
Junction_b1=(B1_i,B1_j,B1_k);

# 脸B2
B2_i= [1, 1, 1, 5];
B2_j= [9, 0, 12, 9];
B2_k= [5, 12, 9, 6];
Junction_b2=(B2_i,B2_j,B2_k);

# 脸B1
B1_i= [10, 10, 10, 5];
B1_j= [8, 7, 6, 2];
In1_k= [7, 6, 2, 6];
Connection_in1=(B1_i,B1_j,B1_k);

# 脸B2
B2_i= [11, 11, 11, 7];
B2_j= [9, 6, 7, 4];
B2_k= [6, 7, 3, 3];
Connection_in2=(B2_i,B2_j,B2_k);

# G的脸
G_i= [11, 10, 8, 8];
G_j= [8, 9, 11, 9];
G_k= [13, 12, 9, 10];
JUNCTION_G=(G_i,G_j,G_k);

# 构造人脸的值向量
连接=[Junction_a1,Junction_a2,JUNCTION_B1, 
              JUNCTION_B2,JUNCTION_B1,JUNCTION_B2,JUNCTION_G];
彩虹=[:红色,:橙色,:黄色,:绿色,:青色,:蓝色,:紫色];
Подпись = ["A1", "A2",    "B1",    "B2",   "B1",  "B2",  "G"    ];

得到的向量被组合成元组以传输到函数 mesh3d(),定义了调色板的变量和多面体面的名称。

Sylahedron的建造

连接图书馆 Plots.jl 和用于构建的后端:

In [ ]:
# 连接库和后端
using Plots;
plotlyjs();

我们来介绍一下功能 Грань() 按索引绘制顶点和面:

In [ ]:
# 构造顶点和面的函数
功能面(编号)
    如果数字==0 
        情节。scatter3d(顶点X,顶点Y,顶点Z;
                        label="[医]椎体", color = :black, markersize = 1,
                        xlabel = "x", ylabel = "y", zlabel = "z",
                        camera = (130, 20))
    else
        情节。mesh3d!(顶点X,顶点Y,顶点Z;
                      连接=连接[数目],
                      颜色=彩虹[数字],标签=签名[数字]
    end
end;

让我们在一个循环中构造顶点和生成的面:

In [ ]:
# 建筑顶点
情节。scatter3d繝サVertexes;
                label="[医]椎体", color = :black, markersize = 1)

# 循环建筑面
for N in 1:7
    (N)
end

# 舞台设计
plot!(xlabel = "x", ylabel = "y", zlabel = "z", camera = (130, 20))
Out[0]:

连接后端确保构建具有高交互性的多面体。 Silahedron可以缩放,旋转,并且可以启用或禁用元素(面和顶点)的显示。

最后,让我们创建一个sylahedron面顺序构造的动画。:

In [ ]:
# 面顺序构造的动画
动画=@animate for N in[0, 7, 6, 5, 2, 1, 3, 4]
    (N)
end;

gif(анимация, "Силаэдр.gif", fps = 1)
[ Info: Saved animation to /user/start/examples/math_and_optimization/silaedr/Силаэдр.gif
Out[0]:
No description has been provided for this image

结论

在这个例子中,我们使用函数通过坐标检查了Silashi多面体的构造 mesh3d() 从图书馆 Plots.jl.