15
$\begingroup$

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.

enter image description here

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.

enter image description here

"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"]

enter image description here

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"]

enter image description here

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

enter image description here

$\endgroup$
1
  • 3
    $\begingroup$ Most impressive and very Christmassy :-) Happpy holidays to all! $\endgroup$
    – Hans Olo
    Dec 24, 2023 at 13:36

1 Answer 1

16
$\begingroup$

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]

enter image description here

  • 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 @@ # &]]

enter image description here

  • Use
Region`Mesh`MergeCells

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 = Region`Mesh`MergeCells[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]

enter image description here

  • 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 = Region`Mesh`MergeCells[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]

enter image description here

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.