9
$\begingroup$

Sol LeWitt (1928 - 2007) was an American artist linked to various movements, including conceptual art and minimalism. He used lines, geometric solids, patterns, formulas and permutations to create his structures and wall paintings. Most of his works have a decidedly mathematical flavour. LeWitt's works are found in the most important museum collections worldwide.

enter image description here

For the art piece I want to reproduce with Mathematica, LeWitt was probably inspired by Leonardo da Vinci's illustrations for Luca Pacioli's 1509 book The Divine Proportion.

enter image description here

Images from the Mathematical Association of America

It is relatively easy to reproduce skeletal polyhedra if we use tubes:

Graphics3D[{MaterialShading["Bronze"], PolyhedronData[#, "Lines"]},
     Boxed -> False,
     ImageSize -> 200,
     Lighting -> "ThreePoint"] /.
    Line :> (Tube[#, 0.04] &) & /@ {{"Pyramid", 4}, "Cube", "Dodecahedron"} // Row

enter image description here

But it is much more difficult to replicate Leonardo's style with rectangular polygons. Fortunately, kglr showed how we can do it in his answer to this question:

Construction of a Fuller dome

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_] :> ConvexHullMesh[Join[y, (1 + thickness) y]]] @
      MapThread[Polygon @* Join] @ {p1, p2}]

Graphics3D[
 Perforate[0.2] @ PolyhedronData["GreatRhombicosidodecahedron", "BoundaryMeshRegion"],
  Boxed -> False]

enter image description here

As Syed commented, there is also a repository function which might be useful: OutlinePolygons

Using this technique I started with my replica of LeWitt's Five Open Geometric Structures (1979):

enter image description here

The cube looked promising,

Graphics3D[{
  MaterialShading[<|"BaseColor" -> White, "MetallicCoefficient" -> 1, "RoughnessCoefficient" -> 0.5|>],
  Perforate[.2] @ PolyhedronData["Cube", "BoundaryMeshRegion"]},
 Background -> GrayLevel[0.4],
 Lighting -> {"Standard", GrayLevel[0.9]},
 Boxed -> False]

enter image description here

Thanks to kglr's comment I could also produce the 4-sided pyramid:

center =
 TransformedRegion[#,TranslationTransform[RegionCentroid[#]]] &;

Graphics3D[{
  MaterialShading[<|"BaseColor" -> White, "MetallicCoefficient" -> 1, "RoughnessCoefficient" -> 0.5|>], 
  Perforate[.2] @ center @ PolyhedronData[{"Pyramid", 4}, "BoundaryMeshRegion"]}, 
 Background -> GrayLevel[0.4], 
 Lighting -> {"Standard", GrayLevel[0.9]},
 Boxed -> False]

enter image description here

But the cuboid failed miserably producing lots of "ConvexHullMesh" error messages. The evildoer:

Graphics3D[Perforate[.2] @ BoundaryMeshRegion[Cuboid[{0, 0, 0}, {1, 2, 3}]]];

My Question

How can we reproduce the Five Open Geometric Structures?

If it is too difficult to find a polygon-based solution, I would also accept tubes or even solids, if they are neatly placed next to each other on a board with the right ViewPoint and ViewAngle.

Addendum

More Sol LeWitt on this tour of the Lisson Gallery:

Lisson Gallery

enter image description here

$\endgroup$
4
  • 5
    $\begingroup$ Useful link: OutlinePolygons. $\endgroup$
    – Syed
    Commented Dec 10, 2023 at 11:56
  • $\begingroup$ Thank you, Syed, I will add the link to my question $\endgroup$
    – eldo
    Commented Dec 10, 2023 at 12:08
  • $\begingroup$ for a (partial) rehabilitation of Perforate, pre-process input mesh with centerAtOrigin = TransformedRegion[#, TranslationTransform[RegionCentroid[#]]] &? $\endgroup$
    – kglr
    Commented Dec 10, 2023 at 12:26
  • $\begingroup$ Thank you, kglr, with your addition I can now produce the 4-sided pyramid. Also the cuboid, but with some mistakes. The repository function suggested by Syed also perforates the cuboid, but with even more mistakes. $\endgroup$
    – eldo
    Commented Dec 10, 2023 at 12:59

1 Answer 1

6
$\begingroup$

I found that if we replace ConvexHullMesh to ConvexHullRegion in the excellent code of @kglr, all of the thing is OK now.

Clear[Perforate];
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}]
{reg1, reg2, reg3, 
   reg4} = {PolyhedronData[{"Pyramid", 4}, "BoundaryMeshRegion"], 
   Cuboid[{0, 0, 0}, {1, 2, 3}], Cube[], 
   DiscretizeGraphics[ExampleData[{"Geometry3D", "Beethoven"}]]};

Graphics3D[{MaterialShading[<|"BaseColor" -> White, 
      "MetallicCoefficient" -> 1, "RoughnessCoefficient" -> 0.5|>], 
    Perforate[.2]@#}, Background -> GrayLevel[0.4], 
   Lighting -> {"Standard", GrayLevel[0.9]}, 
   Boxed -> False] & /@ {reg1, reg2, reg3, reg4}

enter image description here

$\endgroup$

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.