Esta es una pregunta muy interesante, y creo que entiendo lo que ipmcc tiene en mente. Hay un montón de código de Mathematica involucrados en la generación de estas imágenes, así que voy a poner que al final.
La primera cosa a entender es que las "tarjetas están a medio camino entre ser coplanares con las 2 caras en cualquier lado". Si entiendo las cosas correctamente, la colocación de una placa con respecto a la dodecaedro debería ser algo como esto: ![dodecahedron and board]()
Con todos los consejos, debemos tener una nueva cara para cada edad borde. "¿Qué poliedro que tiene una cara para cada borde de un original?" se ha preguntado y respondido en hay tal cosa como el "borde-cara dual" de un poliedro, y es el "borde-cara dual" de un cubo de un dodecaedro rómbico?: Es el doble de la rectificado poliedro. Un rectificado dodecaedro es un icosidodecaedro, y el doble de la que es una rómbica triacontahedron (con 30 rombo de oro caras). Si dibujamos un triacontahedron en el exterior de nuestro dodecaedro, obtenemos algo como lo siguiente: ![tricontahedron and board]()
El problema es que realmente no se parece en nada a "conceptualmente cerrar" para el enlace de @TonyK publicado en un comentario. No queremos que el máximo posible pieza de cada junta (un rombo de oro), sólo queremos una astilla de cada rombo alrededor de los bordes de la original dodecaedro. Creo que la intención era algo que se parece a esto (posiblemente con menos ancho de astillas):
![slivers]()
Sin embargo, los hexágonos en esa imagen son infinitamente delgada, mientras que la pregunta se refería a la "carpintería" y "biselado"; necesitamos para hacerlas más densas. No podemos espesar ellos ingenuamente porque de los ángulos diedros. Ellos necesitan ser frusta: biselado, de modo que somos parte de un hexagonal pirámide con el "vértice superior" en el centro de la figura. Debería verse algo como esto: ![frusta]()
Por simetría, sólo necesita crear 30 copias de la misma truncado. La fijación de la longitud de la diagonal larga, un truncado depende de dos parámetros. Vamos a t ser un parámetro que varía de 0 a 1, donde 0 significa que usted tiene todo un rombo de oro de cara y 1 significa que usted tiene sólo un segmento de línea que es un borde de la dodecaedro (interpolación lineal). Let' s ser un parámetro que varía de 0 a 1, donde 0 significa que usted tiene toda la pirámide y 1 significa que usted tiene sólo el hexágono (interpolación lineal). A continuación, la imagen con el plano hexágonos había t=0.85 y s=1, y la imagen con la sólida frusta había t=s*a*=0.9. Para ver los efectos de cambio de t y s cualitativamente, aquí está un video en Youtube de animación de todo el dodecaedro como t y s son modificados, y aquí es un Youtube de animación de sólo uno de los truncado.
En descuidado Mathematica notación, donde phi
es la proporción áurea $\varphi=\frac{1+\sqrt{5}}{2}$, e s
y t
son los parámetros descritos, la siguiente es una lista de caras de un único truncado (de cara larga longitud de la diagonal $\frac{2}{\varphi}$), donde cada cara es una lista de vértices (en la mano derecha de la regla de la orden alrededor de la cara), y cada vértice es un triple de x, y, z coordenadas:
{
{{t - phi t, phi, 1 - t},
{(-1 + phi) t, phi, 1 - t},
{-1 + phi, phi, 0},
{(-1 + phi) t, phi, -1 + t},
{t - phi t, phi, -1 + t},
{1 - phi, phi, 0}},
{{s - phi s, phi s, 0},
{-(-1 + phi) s t, phi s, s (-1 + t)},
{(-1 + phi) s t, phi s, s (-1 + t)},
{(-1 + phi) s, phi s, 0},
{(-1 + phi) s t, phi s, s - s t},
{-(-1 + phi) s t, phi s, s - s t}},
{{s - phi s, phi s, 0},
{1 - phi, phi, 0},
{t - phi t, phi, -1 + t},
{-(-1 + phi) s t, phi s, s (-1 + t)}},
{{-(-1 + phi) s t, phi s, s (-1 + t)},
{t - phi t, phi, -1 + t},
{(-1 + phi) t, phi, -1 + t},
{(-1 + phi) s t, phi s, s (-1 + t)}},
{{(-1 + phi) s t, phi s, s (-1 + t)},
{(-1 + phi) t, phi, -1 + t},
{-1 + phi, phi, 0},
{(-1 + phi) s, phi s, 0}},
{{(-1 + phi) s, phi s, 0},
{-1 + phi, phi, 0},
{(-1 + phi) t, phi, 1 - t},
{(-1 + phi) s t, phi s, s - s t}},
{{(-1 + phi) s t, phi s, s - s t},
{(-1 + phi) t, phi, 1 - t},
{t - phi t, phi, 1 - t},
{-(-1 + phi) s t, phi s, s - s t}},
{{-(-1 + phi) s t, phi s, s - s t},
{t - phi t, phi, 1 - t},
{1 - phi, phi, 0},
{s - phi s, phi s, 0}}
}
Los ángulos del hexágono exterior se $\tan^{-1}2\approx 63.43^{\circ}$$720^{\circ}-2\tan^{-1}2\approx 148.28^{\circ}$. El ángulo diedro entre los más grandes del hexágono y uno de los cuatro más pequeños (suponiendo que t cerca de 1) trapezoidal caras es exactamente $72^{\circ}$. Sin embargo, el ángulo diedro entre los más grandes del hexágono y uno de los dos más grandes (suponiendo que t cerca de 1) trapezoidal las caras depende de t. Es $\approx86.07^{\circ}$ para t=0.9, y en general está dado por $$\cos^{-1}\left(\frac{\left(3-\sqrt{5}\right)\left(1+\sqrt{5}\right)\left(1-t\right)}{4*\sqrt{t^2+\frac{1}{2}\left(3-\sqrt{5}\right)\left(1-t\right)^{2}}}\right)$$
Si le sucede que tiene Mathematica 7 o superior (el código también podría funcionar en 6), aquí se encuentra la mayor parte del código (con algunos andamios retirados y algunos comentarios añadidos) para la generación de las imágenes y las fórmulas que se hace referencia anteriormente. Yo no hago promesas acerca de la elegancia o la eficiencia.
(*The Golden Ratio Phi is important*)
p = (1 + Sqrt[5])/2;
(*Coordinates and grouping from the Wikipedia article for \
dodecahedron.*)
groupedvs = {{{1, 1, -1}, {1, 1, 1}, {1, -1, 1}, {1, -1, -1}, {-1,
1, -1}, {-1, 1, 1}, {-1, -1, 1}, {-1, -1, -1}}, {{0, 1/p,
p}, {0, -1/p, p}, {0, 1/p, -p}, {0, -1/p, -p}}, {{1/p, p,
0}, {1/p, -p, 0}, {-1/p, p, 0}, {-1/p, -p, 0}}, {{p, 0, 1/p}, {p,
0, -1/p}, {-p, 0, 1/p}, {-p, 0, -1/p}}};
(*Normal vectors to two adjacent faces.*)
n2 = -Cross[{1/p, p, 0} - {1, 1, 1}, {0, 1/p, p} - {1, 1, 1}];
n3 = Cross[{-1/p, p, 0} - {1/p, p, 0}, {1, 1, -1} - {1/p, p, 0}];
(*A flat list of vertices of the dodecahedron which should be easier to work with.*)
vs = Flatten[groupedvs, 1];
(*A list of lists of vertex indices to represent the 12 faces of the \
dodecahedron.*)
faces = {{12, 4, 14, 16, 8}, {18, 4, 12, 11, 1}, {12, 8, 20, 5,
11}, {8, 16, 7, 19, 20}, {20, 19, 6, 15, 5}, {19, 7, 10, 9,
6}, {15, 6, 9, 2, 13}, {5, 15, 13, 1, 11}, {13, 2, 17, 18, 1}, {2,
9, 10, 3, 17}, {17, 3, 14, 4, 18}, {3, 10, 7, 16, 14}};
(*Show the "board" and the vertices of the dodecahedron and the faces \
of the dodecahedron.*)Show[(*Plot the vertices.*)
ListPointPlot3D[groupedvs,(*Color the vertices like on Wikipedia.*)
PlotStyle -> {Directive[Orange, PointSize[0.05]],
Directive[Green, PointSize[0.05]],
Directive[Blue, PointSize[0.05]],
Directive[Red, PointSize[0.05]]},
AxesLabel -> {x, y,
z}],(*Plot the board using the fact that the sum of the two \
normals for the adjacent faces should give a normal right in between.*)
ContourPlot3D[
Dot[n3 + n2, {x - 1/p, y - p, z}] == 0, {x, -1, 1}, {y, 0,
2 p}, {z, -p, p}, ContourStyle -> Opacity[0.5], Mesh -> False],
Graphics3D[(*A sequence of polygons*)
Polygon[(*where for every element of "faces"*)
MapThread[(*we make a list of all five corresponding vertices.*)
Table[vs[[(#1[[j]])]], {j, 1,
5}] &, {faces}]]](*Finally, make sure Mathematica doesn't \
squish the image.*), BoxRatios -> Automatic]
(*For later images, we'll need indices for the vertices that make up \
each edge of the dodecahedron.*)
edges = {{5, 11}, {11, 1}, {1, 13}, {13, 15}, {15, 5}, {1, 18}, {18,
4}, {4, 12}, {12, 11}, {13, 2}, {2, 17}, {17, 18}, {15, 6}, {6,
9}, {9, 2}, {9, 10}, {10, 3}, {3, 17}, {6, 19}, {19, 7}, {7,
10}, {19, 20}, {20, 8}, {8, 16}, {16, 7}, {20, 5}, {8, 12}, {14,
16}, {14, 4}, {14, 3}};
(*We also could use a raw list of faces for the rhombic \
tricontahedron where each face is a list of vertices in some cyclic \
order.*)purerhombic = {{{0, 1/2 (1 + Sqrt[5]), -1}, {0,
1/2 (-1 + Sqrt[5]), 1/2 (-1 - Sqrt[5])}, {-1, 0,
1/2 (-1 - Sqrt[5])}, {-1, 1, -1}}, {{1, 1, -1}, {0,
1/2 (1 + Sqrt[5]), -1}, {0, 1/2 (-1 + Sqrt[5]),
1/2 (-1 - Sqrt[5])}, {1, 0, 1/2 (-1 - Sqrt[5])}}, {{1,
1, -1}, {0, 1/2 (1 + Sqrt[5]), -1}, {1/2 (-1 + Sqrt[5]),
1/2 (1 + Sqrt[5]), 0}, {1/2 (1 + Sqrt[5]), 1,
0}}, {{1/2 (1 - Sqrt[5]), 1/2 (1 + Sqrt[5]), 0}, {0,
1/2 (1 + Sqrt[5]), -1}, {1/2 (-1 + Sqrt[5]), 1/2 (1 + Sqrt[5]),
0}, {0, 1/2 (1 + Sqrt[5]), 1}}, {{1/2 (1 - Sqrt[5]),
1/2 (1 + Sqrt[5]), 0}, {0, 1/2 (1 + Sqrt[5]), -1}, {-1,
1, -1}, {1/2 (-1 - Sqrt[5]), 1, 0}}, {{1,
1, -1}, {1/2 (1 + Sqrt[5]), 1, 0}, {1/2 (1 + Sqrt[5]), 0,
1/2 (1 - Sqrt[5])}, {1, 0,
1/2 (-1 - Sqrt[5])}}, {{1/2 (1 + Sqrt[5]), 0,
1/2 (1 - Sqrt[5])}, {1/2 (1 + Sqrt[5]), -1, 0}, {1, -1, -1}, {1,
0, 1/2 (-1 - Sqrt[5])}}, {{1, -1, -1}, {0,
1/2 (-1 - Sqrt[5]), -1}, {0, 1/2 (1 - Sqrt[5]),
1/2 (-1 - Sqrt[5])}, {1, 0, 1/2 (-1 - Sqrt[5])}}, {{1, 0,
1/2 (-1 - Sqrt[5])}, {0, 1/2 (-1 + Sqrt[5]),
1/2 (-1 - Sqrt[5])}, {-1, 0, 1/2 (-1 - Sqrt[5])}, {0,
1/2 (1 - Sqrt[5]), 1/2 (-1 - Sqrt[5])}}, {{1/2 (-1 + Sqrt[5]),
1/2 (1 + Sqrt[5]), 0}, {1/2 (1 + Sqrt[5]), 1, 0}, {1, 1, 1}, {0,
1/2 (1 + Sqrt[5]), 1}}, {{1/2 (1 + Sqrt[5]), 1, 0}, {1, 1,
1}, {1, 0, 1/2 (1 + Sqrt[5])}, {1/2 (1 + Sqrt[5]), 0,
1/2 (-1 + Sqrt[5])}}, {{1/2 (1 + Sqrt[5]), 0,
1/2 (1 - Sqrt[5])}, {1/2 (1 + Sqrt[5]), 1,
0}, {1/2 (1 + Sqrt[5]), 0,
1/2 (-1 + Sqrt[5])}, {1/2 (1 + Sqrt[5]), -1,
0}}, {{1/2 (1 - Sqrt[5]), 1/2 (1 + Sqrt[5]), 0}, {0,
1/2 (1 + Sqrt[5]), 1}, {-1, 1, 1}, {1/2 (-1 - Sqrt[5]), 1,
0}}, {{0, 1/2 (1 + Sqrt[5]), 1}, {0, 1/2 (-1 + Sqrt[5]),
1/2 (1 + Sqrt[5])}, {-1, 0, 1/2 (1 + Sqrt[5])}, {-1, 1, 1}}, {{1,
1, 1}, {0, 1/2 (1 + Sqrt[5]), 1}, {0, 1/2 (-1 + Sqrt[5]),
1/2 (1 + Sqrt[5])}, {1, 0, 1/2 (1 + Sqrt[5])}}, {{0,
1/2 (1 - Sqrt[5]), 1/2 (1 + Sqrt[5])}, {-1, 0,
1/2 (1 + Sqrt[5])}, {0, 1/2 (-1 + Sqrt[5]),
1/2 (1 + Sqrt[5])}, {1, 0, 1/2 (1 + Sqrt[5])}}, {{0,
1/2 (1 - Sqrt[5]), 1/2 (1 + Sqrt[5])}, {1, 0,
1/2 (1 + Sqrt[5])}, {1, -1, 1}, {0, 1/2 (-1 - Sqrt[5]),
1}}, {{1/2 (1 + Sqrt[5]), 0,
1/2 (-1 + Sqrt[5])}, {1/2 (1 + Sqrt[5]), -1, 0}, {1, -1, 1}, {1,
0, 1/2 (1 + Sqrt[5])}}, {{-1, 0, 1/2 (1 + Sqrt[5])}, {-1, 1,
1}, {1/2 (-1 - Sqrt[5]), 1, 0}, {1/2 (-1 - Sqrt[5]), 0,
1/2 (-1 + Sqrt[5])}}, {{-1, -1, 1}, {-1, 0,
1/2 (1 + Sqrt[5])}, {1/2 (-1 - Sqrt[5]), 0,
1/2 (-1 + Sqrt[5])}, {1/2 (-1 - Sqrt[5]), -1, 0}}, {{0,
1/2 (1 - Sqrt[5]), 1/2 (1 + Sqrt[5])}, {-1, 0,
1/2 (1 + Sqrt[5])}, {-1, -1, 1}, {0, 1/2 (-1 - Sqrt[5]),
1}}, {{1/2 (-1 - Sqrt[5]), -1, 0}, {1/2 (-1 - Sqrt[5]), 0,
1/2 (1 - Sqrt[5])}, {1/2 (-1 - Sqrt[5]), 1,
0}, {1/2 (-1 - Sqrt[5]), 0,
1/2 (-1 + Sqrt[5])}}, {{1/2 (-1 - Sqrt[5]), -1,
0}, {1/2 (-1 - Sqrt[5]), 0, 1/2 (1 - Sqrt[5])}, {-1, 0,
1/2 (-1 - Sqrt[5])}, {-1, -1, -1}}, {{0,
1/2 (-1 - Sqrt[5]), -1}, {1/2 (1 - Sqrt[5]), 1/2 (-1 - Sqrt[5]),
0}, {1/2 (-1 - Sqrt[5]), -1,
0}, {-1, -1, -1}}, {{1/2 (1 - Sqrt[5]), 1/2 (-1 - Sqrt[5]),
0}, {1/2 (-1 - Sqrt[5]), -1, 0}, {-1, -1, 1}, {0,
1/2 (-1 - Sqrt[5]), 1}}, {{-1, 1, -1}, {-1, 0,
1/2 (-1 - Sqrt[5])}, {1/2 (-1 - Sqrt[5]), 0,
1/2 (1 - Sqrt[5])}, {1/2 (-1 - Sqrt[5]), 1, 0}}, {{0,
1/2 (-1 - Sqrt[5]), -1}, {0, 1/2 (1 - Sqrt[5]),
1/2 (-1 - Sqrt[5])}, {-1, 0,
1/2 (-1 - Sqrt[5])}, {-1, -1, -1}}, {{0,
1/2 (-1 - Sqrt[5]), -1}, {1/2 (1 - Sqrt[5]), 1/2 (-1 - Sqrt[5]),
0}, {0, 1/2 (-1 - Sqrt[5]), 1}, {1/2 (-1 + Sqrt[5]),
1/2 (-1 - Sqrt[5]), 0}}, {{1, -1, -1}, {1/2 (1 + Sqrt[5]), -1,
0}, {1/2 (-1 + Sqrt[5]), 1/2 (-1 - Sqrt[5]), 0}, {0,
1/2 (-1 - Sqrt[5]), -1}}, {{1/2 (1 + Sqrt[5]), -1, 0}, {1, -1,
1}, {0, 1/2 (-1 - Sqrt[5]), 1}, {1/2 (-1 + Sqrt[5]),
1/2 (-1 - Sqrt[5]), 0}}};
(*If we want to plot this, we need to tell Mathematica these faces \
are polygons command throughout.*)
rhombic = MapThread[Polygon[#1] &, {purerhombic}];
Show[ListPointPlot3D[groupedvs,
PlotStyle -> {Directive[Orange, PointSize[0.05]],
Directive[Green, PointSize[0.05]],
Directive[Cyan, PointSize[0.05]],
Directive[Pink, PointSize[0.05]]}, AxesLabel -> {x, y, z}],
ContourPlot3D[
Dot[n3 + n2, {x - 1/p, y - p, z}] == 0, {x, -1, 1}, {y, 0,
2 p}, {z, -p, p}, ContourStyle -> Opacity[0.5], Mesh -> False],
Graphics3D[{Purple,
Thickness[
0.015],(*This time we have lines consisting of pairs of vertex \
indices, not polygons consisting of quintuples of indices.*)
Line[MapThread[Table[vs[[(#1[[j]])]], {j, 1, 2}] &, {edges}]]}],
Graphics3D[rhombic], BoxRatios -> Automatic]
(*To make parametrized hexagons, we need to make sure the lists of \
four vertices for each rhombus begin consistently with a large angle \
vertex. The length of a short diagonal is 2/phi which is about 1.2, \
and the length of a long diagonal is 2. Therefore, the following will \
reorder things appropriately.*)
rhombicorderedfaces =
MapThread[
If[Norm[N[#1[[1]] - #1[[3]]]] >
1.5, {#1[[2]], #1[[3]], #1[[4]], #1[[1]]}, #1] &, \
{purerhombic}];
(*With a bit of geometry, we can see how to build parametrized \
hexagons now.*)
parametrizedrhombic[t_] :=
MapThread[{#1[[1]], t*#1[[1]] + (1 - t)*#1[[2]],
t*#1[[3]] + (1 - t)*#1[[2]], #1[[3]], t*#1[[3]] + (1 - t)*#1[[4]],
t*#1[[1]] + (1 - t)*#1[[4]]} &, {rhombicorderedfaces}]
(*To have something to plot, we can use the polygon command again.*)
pararhombic[t_] := MapThread[Polygon[#1] &, {parametrizedrhombic[t]}];
(*t = .85 seems like a fine start.*)
Show[
Graphics3D[pararhombic[85/100], Axes -> True],
BoxRatios -> Automatic]
(*Next we make solid frusta.*)
listofsolidhexes[t_, s_] :=
MapThread[(*We need to flatten because I don't want to type out all \
six faces around.*)
Flatten[{(*The extra braces on the top and bottom faces ensure that \
flatten yields the right result.*){#1}, {s*#1},
Table[{s*#1[[i]], #1[[i]], #1[[6 - Mod[-(i + 1), 6]]],
s*#1[[6 - Mod[-(i + 1), 6]]]}, {i, 1, 6}]},
1] &, {parametrizedrhombic[t]}]
(*For the purposes of plotting, it doesn't matter which polygonal \
face belongs to which frustum.*)
listofpolysforsolidhexes[t_, s_] := Flatten[listofsolidhexes[t, s], 1]
(*For the purposes of plotting, we need polygon commands.*)
polylistofpolys[t_, s_] :=
MapThread[Polygon[#1] &, {listofpolysforsolidhexes[t, s]}];
(*To really see what's going on, we use Manipulate to let us modify t \
and s easily. For t=0.5 and s=1, we essentially have a pentatruncated \
rhombic triacontahedron, which is similar to, but distinct from, a \
European football shape.*)
Manipulate[
Graphics3D[polylistofpolys[t, s], Boxed -> False], {{t, .9}, 0,
1}, {{s, .9}, 0, 1}]
(*If we only need to look at one piece:*)
Manipulate[
Show[Graphics3D[
MapThread[
Polygon[#1] &, {listofsolidhexes[t,
s][[(*4 is the index that gives the frustum attached to the \
board in the early images.*)4]]}]], BoxRatios -> Automatic], {{t, .9},
0, 1}, {{s, .95}, 0, 1}]
(*The raw data for that single frustum:*)
listofsolidhexes[t, s][[4]]