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]    № вершины
Вершины = [
            [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
          ];

# извлечение векторов координат вершин по осям
Вершины_матрица = Base.stack(Вершины, dims = 1);
Вершины_x = Вершины_матрица[:, 1];
Вершины_y = Вершины_матрица[:, 2];
Вершины_z = Вершины_матрица[:, 3];

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

连接顶点

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

In [ ]:
# разбиение граней на треугольники:
# грань А1 (состоит из треугольников 0-10-12, 0-4-10, 4-2-10, 4-3-2)
А1_i = [0,  0,  4,  4];
А1_j = [10, 4,  2,  3];
A1_k = [12, 10, 10, 2];
Соединения_А1 = (А1_i, А1_j, A1_k);

# грань А2
А2_i = [1,  1,  5,  5];
А2_j = [11, 5,  3,  2];
A2_k = [13, 11, 11, 3];
Соединения_А2 = (А2_i, А2_j, A2_k);

# грань Б1
Б1_i = [0, 0,  0,  4];
Б1_j = [8, 1,  13, 8];
Б1_k = [4, 13, 8,  7];
Соединения_Б1 = (Б1_i, Б1_j, Б1_k);

# грань Б2
Б2_i = [1, 1,  1,  5];
Б2_j = [9, 0,  12, 9];
Б2_k = [5, 12, 9,  6];
Соединения_Б2 = (Б2_i, Б2_j, Б2_k);

# грань В1
В1_i = [10, 10, 10, 5];
В1_j = [8,  7,  6,  2];
В1_k = [7,  6,  2,  6];
Соединения_В1 = (В1_i, В1_j, В1_k);

# грань В2
В2_i = [11, 11, 11, 7];
В2_j = [9,  6,  7,  4];
В2_k = [6,  7,  3,  3];
Соединения_В2 = (В2_i, В2_j, В2_k);

# грань Г
Г_i = [11, 10, 8,  8];
Г_j = [8,  9,  11, 9];
Г_k = [13, 12, 9,  10];
Соединения_Г = (Г_i, Г_j, Г_k);

# вектора значений для построения граней
Соединения = [Соединения_А1, Соединения_А2, Соединения_Б1, 
              Соединения_Б2, Соединения_В1, Соединения_В2, Соединения_Г];
Радуга =  [:red, :orange, :yellow, :green, :cyan, :blue, :purple];
Подпись = ["A1", "A2",    "Б1",    "Б2",   "В1",  "В2",  "Г"    ];

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

Sylahedron的建造

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

In [ ]:
# подключение библиотеки и бэкенда
using Plots;
plotlyjs();

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

In [ ]:
# функция для построения вершин и граней
function Грань(номер)
    if номер == 0 
        Plots.scatter3d(Вершины_x, Вершины_y, Вершины_z;
                        label="вершины", color = :black, markersize = 1,
                        xlabel = "x", ylabel = "y", zlabel = "z",
                        camera = (130, 20))
    else
        Plots.mesh3d!(Вершины_x, Вершины_y, Вершины_z;
                      connections = Соединения[номер],
                      color = Радуга[номер], label = Подпись[номер])
    end
end;

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

In [ ]:
# построение вершин
Plots.scatter3d(Вершины_x, Вершины_y, Вершины_z;
                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.