First, I defined dd
as follows:
dd = Entity["Polyhedron", "Dodecahedron"]
(* regular dodecahedron *)
Probing the properties of this Entity
object, I can extract the vertex coordinates (I used Short
here to truncate the output):
dd["VertexCoordinates"]//Short
(* {{-Sqrt[1+2/Sqrt[5]],0,Root[1-20 #1^2+80 #1^4&,3]},<<19>>} *)
Now, I can use the property "FaceIndices"
to see which coordinate corresponds to which point in the face of each side.
dd["FaceIndices"]
(* {{15, 10, 9, 14, 1}, {2, 6, 12, 11, 5}, {5, 11, 7, 3, 19},
{11, 12, 8, 16, 7}, {12, 6, 20, 4, 8}, {6, 2, 13, 18, 20},
{2, 5, 19, 17, 13}, {4, 20, 18, 10, 15}, {18, 13, 17, 9, 10},
{17, 19, 3, 14, 9}, {3, 7, 16, 1, 14}, {16, 8, 4, 15, 1}} *)
It turns out that the order given is (not surprisingly) for a pentagon rather than a pentagram...
Graphics3D[Arrow[dd["VertexCoordinates"][[dd["FaceIndices"][[1]]]]]]

But a bit of shuffling can correct that. I used Permute
and PermutationCycles
.
Finally, I want to close the loop and connect the last vertex to the first one (for each face). To do this, I used BSplineCurve
with the option SplineClosed -> True
.
All together:
pents = BSplineCurve[Permute[#, PermutationCycles[{1, 3, 5, 2, 4}]],
SplineDegree -> 1,
SplineClosed -> True] & /@ (Part[dd["VertexCoordinates"], #] & /@
dd["FaceIndices"]);
Graphics3D[{Thick, White, pents, Purple, Opacity[0.75], dd["Faces"]}]

And if desired, rather than using BSplineCurve
, you can use Polygon
to also get a nice effect:
pents2 = Polygon[
Permute[#,
PermutationCycles[{1, 3, 5, 2, 4}]]] & /@ (Part[
dd["VertexCoordinates"], #] & /@ dd["FaceIndices"]);
Graphics3D[{Thick, White, pents2}, Background -> Black,
Lighting -> "Neutral"]
