Sunday, October 07, 2007

Geodesic dome construction

I have been thinking about how to automate the design of geodesic domes using Mathematica. I started off by looking at what Google Earth could see of the geodesic domes at the Eden Project (see 50.3612°N, -4.74483°W in Google Earth). Here is a clear view of the structure of one of the domes.


There is a central pentagon at the highest point of the dome, which is surrounded by 5 hexagons each of which is divided into 6 small triangles, which are in turn surrounded by hexagons (which are not divided into triangles). If you look very carefully you will find other pentagons lower down the dome.

How could this geodesic dome be designed in a semi-automatic way? I have worked out a way of doing this using Mathematica which goes as follows.

Load the library of polyhedron operations so that you can derive tessellated versions of polyhedra.

Needs["PolyhedronOperations`"];

Fix the order of the tessellation. A larger order will eventually give you a geodesic dome with smaller faces.

n=6;

Display an icosahedron and its tessellation, and extract the faces of the tessellation for later use.

GraphicsRow[Map[Graphics3D,{#, faces=Geodesate[#,n]}&[PolyhedronData["Icosahedron", "Faces"]]]]


The main problem now is to find a way of extracting pentagons and hexagons from all of the triangles that appear in the above tessellation. This is not trivial because it has to be done in such a way that the extracted polygons neither overlap nor have any gaps between them. The strategy that I use to achieve this is to gradually build up a set of polygon centres in such a way that each new centre is exactly far enough away from all of the centres found thus far that it defines a new polygon that neither overlaps nor leaves a gap with the polygons found thus far.

Define a function for computing all of the triangle face edges surrounding a set of vertices.

faceedges[perimeters_, centres_] := Flatten[Map[Cases[perimeters, {x___,#,y___} :> {x, y}]&, centres], 1] // Union;

Define a function for computing all of the vertices surrounding a set of triangle face edges.

facecentres[perimeters_, edges_] := Map[Cases[perimeters, {x___,#[[1]],y___,#[[2]],z___} | {x___,#[[2]],y___,#[[1]],z___} :> {x,y,z}]&, edges] // Flatten // Union;

Iterating the above pair of functions causes the set of vertices to grow until it covers the whole of the original set with pentagon and hexagon centres. As long as the order of the tessellation is chosen appropriately, then this algorithm will give the centres needed to construct a geodesic dome. Have a play to see what the algorithm does for you, and how it might be improved.

Fix the starting vertex to be the one at the top of the tessellated icosahedron.

startingcentre = {Position[faces[[1]], {0,0,1}][[1,1]]};

Derive the pentagon and hexagon centres and edges of the geodesic dome.

centres = Nest[
(
faceedgesold = faceedges[faces[[2,1]], #];
centresnew = facecentres[faces[[2,1]], faceedgesold]
)&,
startingcentre,
5
];

edges = faceedges[faces[[2,1]], centres];

Display the geodesic dome.

Graphics3D[{
{Opacity[0.75], faces},
{PointSize[0.02], Red, Map[Point[faces[[1,#]]]&, centres]},
{Thickness[0.01], Blue, Map[Line[{faces[[1,#[[1]]]], faces[[1,#[[2]]]]}]&, edges]}
}
]



If you compare this result with the photo of the geodesic dome at the Eden Project then you can see that it has all of the essential features correct. There is a pentagon at the top of the dome, which is surrounded by hexagons, and lower down the dome there are more pentagons.

No comments: