西拉西多面体(Silahedron)的建造
在这个演示示例中,我们考虑使用函数构建Silashi多面体 mesh3d() 从图书馆 Plots.jl.
导言
Силацдр是一个非圆锥环形多面体,其欧拉-庞加莱特性具有以下相等性
哪里 -多面体的面数,以及 -嵌入其中的表面的孔的数量。
这种相等性来自这样一个条件,即在这样一个多面体中,每个面都与任何其他面有一个共同的边缘。
Sylahedron有7个六边形面,14个顶点和21条边。 在这个例子中,我们将根据顶点的可用坐标在笛卡尔坐标系中构造这个多面体。
顶点的坐标
首先,我们将介绍面和顶点的符号。 顶点具有从0到13的连续数字名称,成对全等面具有连续的字母数字名称:A1,A2,B1,B2,B1,B2,并且未配对的面具有字母名称G。
下面所示的多面体扫描上显示了相应的符号,并引入了调色板,稍后将在sylahedron的构建中使用。
让我们将变量添加到工作区Engee,以表征Sylahedron顶点的笛卡尔坐标。 这些坐标是从多面体的几何中心位于坐标原点的条件确定的,并且其最小的面部的长度为一。
# Координаты вершин:
# координаты [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-10和4-3-2形成的4个不相交的三角形。
因此,我们将sylahedron的每个面划分为不相交的三角形,并将形成它们的顶点写入向量I,J,K的相应索引中。
# разбиение граней на треугольники:
# грань А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 和用于构建的后端:
# подключение библиотеки и бэкенда
using Plots;
plotlyjs();
我们来介绍一下功能 Грань() 按索引绘制顶点和面:
# функция для построения вершин и граней
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;
让我们在一个循环中构造顶点和生成的面:
# построение вершин
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))
连接后端确保构建具有高交互性的多面体。 Silahedron可以缩放,旋转,并且可以启用或禁用元素(面和顶点)的显示。
最后,让我们创建一个sylahedron面顺序构造的动画。:
# анимация последовательного построения граней
анимация = @animate for N in [0, 7, 6, 5, 2, 1, 3, 4]
Грань(N)
end;
gif(анимация, "Силаэдр.gif", fps = 1)
结论
在这个例子中,我们通过使用函数的坐标来考虑Silashi多面体的构造 mesh3d() 从图书馆 Plots.jl.
