Two - Layer Geodesic Dome

G.W. Hart, 3 July 2008, Visualization of one triangle of a two-layer dome (Montreal Expo67 style, with dual triangular and hexagonal layers) and edge length calculation for MathCamp workshop. Start with P1, P2, P3 as three vertices of one face of a regular icosahedron. Point p[i,j,n] is the (i,j)th one of a n-frequency division of the triangle. Vertex v[i,j,n] is the projection of that point to a sphere of radius Rv; these are the vertices of the triangle layer. In the hexagon layer, on sphere of radius Rab, are points a[i,j,n] (centers of the the "up" triangles") and points b[i,j,n] (centers of the "down" triangles. In addition, mirrored across the big triangle edge from point a[0,j,n] is point aa[0,j,n]. The d[,] function gives the distance between two points.

tau=(1+Sqrt[5])/2;
unit[vec_] := vec/Sqrt[vec.vec];
d[v1_,v2_]:=Sqrt[(v1-v2).(v1-v2)];

P1={-1,0,tau}; P2={0,-tau,1}; P3={1,0,tau};

p[i_,j_,n_]:=P1 + (i/n) (P2-P1) +(j/n) (P3-P1)//N;
v[i_,j_,n_]:=Rv unit[p[i,j,n]];
a[i_,j_,n_]:=Rab unit[(1/3)(p[i,j,n]+p[i+1,j,n]+p[i,j+1,n])];
b[i_,j_,n_]:=Rab unit[(1/3)(p[i,j,n]+p[i-1,j,n]+p[i,j-1,n])];
aa[0,j_,n_]:={{1,0,0},{0,-1,0},{0,0,1}}.a[0,j,n];

Edge Lengths for MathCamp model:

n=4; 
Rv=295; 
Rab=265;

Triangle layer :

d[v[0,0,4],v[0,1,4]]

d[v[0,1,4],v[0,2,4]]

d[v[1,0,4],v[0,1,4]]

d[v[0,1,4],v[1,1,4]]

d[v[0,2,4],v[1,1,4]]

d[v[1,1,4],v[1,2,4]]

Hexagon layer :

d[a[0,0,4],b[1,1,4]]

d[a[0,1,4],b[1,1,4]]

d[a[0,1,4],b[1,2,4]]

d[a[1,1,4],b[1,2,4]]

d[a[0,0,4],aa[0,0,4]]

d[a[0,1,4],aa[0,1,4]]

Middle layer :

d[v[0,0,4],a[0,0,4]]

d[v[0,1,4],a[0,0,4]]

d[v[0,1,4],b[1,1,4]]

d[v[1,1,4],b[1,1,4]]

d[v[0,1,4],a[0,1,4]]

d[v[0,2,4],a[0,1,4]]

d[v[1,1,4],a[0,1,4]]

d[v[0,2,4],b[1,2,4]]

d[v[1,1,4],b[1,2,4]]

d[v[1,1,4],a[1,1,4]]

Dynamic Visualization

Manipulate[
 a[i_,j_,n_]:=R2 unit[(1/3)(p[i,j,n]+p[i+1,j,n]+p[i,j+1,n])];
b[i_,j_,n_]:=R2 unit[(1/3)(p[i,j,n]+p[i-1,j,n]+p[i,j-1,n])];
aa[0,j_,n_]:={{1,0,0},{0,-1,0},{0,0,1}}.a[0,j,n];
v[i_,j_,n_]:=R1 unit[p[i,j,n]]; 
Graphics3D[{
Blue,
Table[Sphere[{v[i,j,n]},sph], {i,0,n},{j,0,n-i}],
Table[Cylinder[{v[i,j,n],v[i+1,j,n]},cyl],{i,0,n-1},{j,0,n-i-1}],
Table[Cylinder[{v[j,i,n],v[j,i+1,n]},cyl],{i,0,n-1},{j,0,n-i-1}],
Table[Cylinder[{v[i,j,n],v[i-1,j+1,n]},cyl],{i,1,n},{j,0,n-i}],
Red,
Table[Sphere[{a[i,j,n]},sph], {i,0,n-1},{j,0,n-i-1}],
Table[Sphere[{b[i,j,n]},sph], {i,1,n},{j,1,n-i}],
Table[Cylinder[{b[i,j,n],a[i-1,j-1,n]},cyl],{i,1,n-1},{j,1,n-i}],
Table[Cylinder[{b[i,j,n],a[i-1,j,n]},cyl],{i,1,n-1},{j,1,n-i}],
Table[Cylinder[{b[i,j,n],a[i,j-1,n]},cyl],{i,1,n-1},{j,1,n-i}],
Green,
Table[Sphere[aa[0,j,n],sph],{j,0,n-1}],
Table[Cylinder[{a[0,j,n],aa[0,j,n]},cyl],{j,0,n-1}],
Yellow,
Table[Cylinder[{a[i,j,n],v[i,j,n]},cyl],{i,0,n-1},{j,0,n-i-1}],
Table[Cylinder[{a[i,j,n],v[i+1,j,n]},cyl],{i,0,n-1},{j,0,n-i-1}],
Table[Cylinder[{a[i,j,n],v[i,j+1,n]},cyl],{i,0,n-1},{j,0,n-i-1}],
Table[Cylinder[{b[i,j,n],v[i,j,n]},cyl],{i,1,n-1},{j,1,n-i}],
Table[Cylinder[{b[i,j,n],v[i-1,j,n]},cyl],{i,1,n-1},{j,1,n-i}],
Table[Cylinder[{b[i,j,n],v[i,j-1,n]},cyl],{i,1,n-1},{j,1,n-i}]
},Boxed->False],
{{n,4},2,20,1},{{R1,295},1,500},{{R2,265},1,500},{{sph,5},.01,10},{{cyl,3},.01,10}]