# Frank Stella Stars - How can we reproduce them?

Frank Stella (born 1936) is an American painter, sculptor and printmaker who lives and works in New York City. The Museum of Modern Art presented a retrospective of his work in 1970, making him the youngest artist to receive one. Stella's works are found in the most important museum collections worldwide. In recent years Frank Stella has produced a variety of stars whose basic structure is obviously based on a Dodecahedron.

The above "Summer Star" (2015) exhibits a process of rapid prototyping (RPT) that Stella used for many years. To create these types of pieces, he crafts a form, scans and refines it on the computer, and then 3D prints it.

"Flat Pack Star" (2016) is made of baltic plywood and has very unusual, aesthetically pleasing cutouts.

In Sol LeWitt's skeletal geometries cvgmt perfected a function of kglr which allows us to perforate polyhedra:

Perforate[width_ : .3, thickness_ : .05][bmesh_] :=
MeshPrimitives[bmesh, 2] /. Polygon[x_] :>
Module[{c = Mean @ x, p1 = Partition[x, 2, 1, {1, 1}], p2},
p2 = Map[Reverse] @ Partition[Map[(c + (1 - width) (# - c)) &, x], 2, 1, {1, 1}];
ReplaceAll[Polygon[y_] :> ConvexHullRegion[Join[y, (1 + thickness) y]]] @
MapThread[Polygon @* Join] @ {p1, p2}]


Applying this snippet to a SmallStellatedDodecahedron we can produce a Stella-like star:

Graphics3D[{
MaterialShading["Bronze"],
Perforate[.2] @ PolyhedronData["SmallStellatedDodecahedron", "BoundaryMeshRegion"]},
Background -> GrayLevel[0.8],
Boxed -> False,
Lighting -> "ThreePoint"]


Rotating it we can clearly see that the basic element of this polyhedron is a five-sided pyramid, which we can produce as well:

Graphics3D[{
MaterialShading["Bronze"],
Perforate[.2] @ PolyhedronData[{"CanonicalPyramid", 5}, "BoundaryMeshRegion"]},
Background -> GrayLevel[0.8],
Boxed -> False,
Lighting -> "ThreePoint"]


Request

I would accept any answer which brings me closer to either one of the two Stella-stars shown, particularly by

• producing a net-like structure like Summer Star
• coloring the spikes (pyramids) differently like Summer Star
• producing cutout-offsets like Flat Pack Star

And, last but not least, Merry Christmas to all of you

• Most impressive and very Christmassy :-) Happpy holidays to all! Dec 24, 2023 at 13:36

## For the Summer Star

• Only a starting point.
• Since the polyhedron construct from 12 space planar polygons, we use them to construct 12 half-spaces to cut the original polyhedon.
• And we use RegionPlot3D to add the mesh lines.
Clear["Global*"];
polyhedron =
PolyhedronData["SmallStellatedDodecahedron", "BoundaryMeshRegion"];
(* polys=PolyhedronData["SmallStellatedDodecahedron","Polygons"]; *)
polys = MeshPrimitives[polyhedron, 2];
draw[i_] := Module[{pts, normal, reg, halfspace},
pts = polys[[i, 1, 1 ;; 3]];
normal = Cross[pts[[1]] - pts[[3]], pts[[2]] - pts[[3]]];
halfspace = HalfSpace[normal, pts[[3]]];
reg =
RegionIntersection[BoundaryDiscretizeRegion@polyhedron,
BoundaryDiscretizeRegion[halfspace, RegionBounds[polyhedron]]];
RegionPlot3D[reg, MeshFunctions -> ({#1, #2, #3} . normal &),
Mesh -> 15, PlotStyle -> None,
MeshStyle -> {ColorData[95]@i, Tube[.005]}]];
Show[Table[draw[i], {i, 1, Length@polys}],
MeshPrimitives[polyhedron, 1] /. Line -> (Dynamic[Tube[#, .005]] &) //Graphics3D, Boxed -> False]


• Test the parametric of pyramid.
Clear["Global*"];
n = 5;
pts = Append[#, First[#]] &[PadRight[#, 3] & /@ CirclePoints[n]];
vertex = {0, 0, 2};
f = BSplineFunction[pts, SplineDegree -> 1];
ParametricPlot3D[{1 - t, t} . {f[Mod[s, 1]], vertex}, {t, 0, 1}, {s,
0, 1}, Boxed -> False, Axes -> False, PlotStyle -> None,
Mesh -> {Subdivide[0, 1, 10], Subdivide[0, 1, 30]},
Method -> {"BoundaryOffset" -> False},
MeshStyle -> Directive[Cyan, Tube @@ # &]]


• Use
RegionMeshMergeCells


to merge the discrete faces and get the vertexs of the pyramid by MeshCells.

Clear["Global*"];
polyhedron =
PolyhedronData["SmallStellatedDodecahedron", "BoundaryMeshRegion"];
polys = PolyhedronData["SmallStellatedDodecahedron", "Polygons"];
draw[i_] :=
Module[{pts, normal, halfspace, reg, regpts, baseindex, vertexindex,
bases, vertex, f}, pts = polys[[i, 1, 1 ;; 3]];
normal = -Cross[pts[[1]] - pts[[3]], pts[[2]] - pts[[3]]];
halfspace = HalfSpace[normal, pts[[3]]];
reg =
RegionIntersection[BoundaryDiscretizeRegion@polyhedron,
BoundaryDiscretizeRegion[halfspace, RegionBounds[polyhedron]]];
reg = RegionMeshMergeCells[reg];
regpts = MeshCoordinates[reg];
baseindex = MeshCells[reg, 2][[-1, -1]];
vertexindex = Complement[Range[Length@regpts], baseindex];
bases = regpts[[baseindex]];
vertex = regpts[[vertexindex]] // First;
f = BSplineFunction[Append[#, First@#] &@bases, SplineDegree -> 1];
ParametricPlot3D[{1 - t, t} . {f[Mod[s, 1]], vertex}, {t, 0,
1}, {s, 0, 1}, Boxed -> False, Axes -> False, PlotStyle -> None,
Mesh -> {Subdivide[0, 1, 10], Subdivide[0, 1, 17]},
Method -> {"BoundaryOffset" -> False},
MeshStyle -> ColorData[97]@i]] /. Line[pts_] :> Tube[pts, .005];
Graphics3D[Table[First@draw[i], {i, 1, Length@polys}], Boxed -> False]


• TODO : simplify the code and try to get a curved wireframe.

## For the Flat Pack Star

• We use Polygon[{p1,p2,p3}->{{q1,q2,q3,q4}] to get a hole on the triangle. Here q1=λ1*p1 + λ2*p2 + λ3*p3 with λ1 + λ2 + λ3==1 is the interior point of such triangle etc.
Clear["Global*"];
polyhedron =
PolyhedronData["SmallStellatedDodecahedron", "BoundaryMeshRegion"];
polys = PolyhedronData["SmallStellatedDodecahedron", "Polygons"];
draw[i_] :=
Module[{pts, normal, halfspace, reg, regpts, baseindex, bases,
vertex, vertexindex, triangleindexs}, pts = polys[[i, 1, 1 ;; 3]];
normal = -Cross[pts[[1]] - pts[[3]], pts[[2]] - pts[[3]]];
halfspace = HalfSpace[normal, pts[[3]]];
reg = RegionIntersection[BoundaryDiscretizeRegion@polyhedron,
BoundaryDiscretizeRegion[halfspace, RegionBounds[polyhedron]]];
reg = RegionMeshMergeCells[reg];
regpts = MeshCoordinates[reg];
baseindex = MeshCells[reg, 2][[-1, -1]];
vertexindex = Complement[Range[Length@regpts], baseindex];
bases = regpts[[baseindex]];
vertex = regpts[[vertexindex]] // First;
regpts = ScalingTransform[{1, 1, 1}*1.2, vertex]@regpts;
triangleindexs =
Table[NestWhile[RotateLeft, cells,
First@# =!= First@vertexindex &], {cells,
Most@MeshCells[reg, 2][[;; , 1]]}];
Graphics3D[{MaterialShading[{"Plastic", Lighter@Brown}],
With[{tripts = regpts[[#]]},
Polygon[tripts -> {{.7, .1, .2}, {.7, .2, .1}, {0, .5, .5}, \
{0, .2, .8}} . tripts]] & /@ triangleindexs},
Background -> GrayLevel[0.8], Boxed -> False,
Lighting -> "ThreePoint"]]
Show[Table[draw[i], {i, 1, Length@polys}], Boxed -> False]


• Thank you, cvgmt, this aready looks promising - I hope you continue working on it
– eldo
Dec 24, 2023 at 15:11
• @eldo One of the ways maybe parametric the pyramid,I will try this method later. Dec 24, 2023 at 22:45