Emod Angles


Central Angles of the E-Module

By David Koski (trig) & Kirby Urner (python)

The above Fig. 986.411B shows the "plane net" or template for an E or T module.

If you cut it out with scissors and fold it up, reversing the lid (have to slice it off), you'll get a tetrahedron. You can fold it up in two ways, creasing towards you or away from you.

A & B modules, used to assemble other shapes, also come with plane nets and fold the same two ways, into "left" and "right". You can call them "congruent" but don't forget they're mirror images or inside-out versions of one another.

The T & E modules have the same angles. 120 Ts (60 left, 60 right) build a Rhombic Triacontahedron of tetravolume 5, whereas 120 Es build a Rhombic Triacontahedron of radius 1.

The Tmod RT has a slightly shorter radius of ~0.9994 versus 1.0. Its volume is therefore a bit less as well.

Here's Fig. 986.419 from Buckminster Fuller's Synergetics:

Per David Koski's research, we an use the arctangent function to express angles using expressions involving the golden ratio or Phi (Greek letter: Ø).

The central angles are at the center of the Rhombic Triacontahedron, where three vectors radiate towards the surface, forming three angles with one another. In this Notebook, we see how smaller angles may be used to define bigger ones.

The three central angles of the E module are:
a = 31.717474411º
b = 37.377368140º
c = 20.905157447º
these three sum to 90º

With the help of two smaller angles, d and e, we can build a and b.

d = 13.282525588º
e = 10.812316963º
a = c + e
b = 2d + e

And with still smaller angles, we can build d and e, also c:

Now we introduce three even smaller angles, f and g:
f = 7.622631859º
g = 5.659893729º
h = 5.152423234º

c = 2f + g
d = f + g
e = g + h

In sum, f and g will build all the angles so far:

a = 2f + 2g + h
b = 2f + 3g + h
c = 2f + g

Here are all of the eight angles in terms of the arctangent of a "phi expression":

a = 31.717474º  = arctan(Ø^-1)       = arctan(0.618034)
b = 37.377368º  = arctan(2Ø^-2)      = arctan(0.763932)
c = 20.905157º  = arctan(Ø^-2)       = arctan(0.381966)
d = 13.282525º  = arctan(Ø^-3)       = arctan(0.236068)
e = 10.812316º  = arctan(Ø^-2/2)     = arctan(0.190983)
f = 7.622631º   = arctan((2√5-3)/11) = arctan(0.133830)
g = 5.659893º   = arctan((5√5-9)/22) = arctan(0.099106)
h = 5.152423º   = arctan(Ø^-5)       = arctan(0.090169)

As a prelude to getting some work done, lets import some tools familiar to most Pythonistas. These are likewise "namepaces" e.g inside of numpy we find a collection of names. These names have "powers" in the sense of capabilities, as well as "attributes" (as in properties).


In [1]:
import numpy as np
import pandas as pd
from math import atan, tan, degrees, radians, sqrt

We say "square" root (in quotes) because in Synergetics we may want to use a triangular area to show the same idea. Two edges A, B at 60 degrees multiply to give an area A times B. Just add the 3rd vector (A-B) to "close the lid". The same technique applies to multiplying A times B times C: three vectors from an origin, at 60 degrees to one another, define a tetrahedron. "Close the lid" to get the corresponding volume.

Here's another figure, Fig. 990.01 from Synergetics to help make sense of this idea.

It's important to introduce these alternative models of 2nd and 3rd powering because our idea of "tetravolumes" derives from there.

As of 2018, very few mathematicians have dared to comment on this 1900s literary innovation within New England Transcendentalism.

Hugh Kenner, a James Joyce scholar, is one of the few to have contributed any secondary literature regarding Fuller's forays into mathematics and logic. Given how alien this thinking remains, we sometimes refer to it as "Martian Math".


In [2]:
rt5 = sqrt(5)    # 2nd root of 5 or "square" root
Ø = (1 + rt5)/2  # golden ratio

f = atan((2*rt5 - 3)/11)
g = atan((5*rt5 - 9)/22)
h = atan(Ø ** -5)

Per David's comments above: f, g, h serve as basis angles such that linear combinations thereof net additional angles a-e.

a = 2f + 2g + h
b = 2f + 3g + h
c = 2f + g
d = f + g
e = g + h

When it comes to linear combinations, we tend to use "matrix operations" and in this case simple integer coefficients do the work. Create [f, g, h] as a vertical column vector, and multiply it on the left with a matrix. For example, in the top row of this matrix we have [2,2,1] meaning we'll get 2 * f + 2 * g + h as the top cell of our 5 by 1 result matrix, or angle a.


In [3]:
m = np.array([f, g, h]).reshape(3,1)
m


Out[3]:
array([[0.13304002],
       [0.09878378],
       [0.08992675]])

In [4]:
coeffs = np.array([[2,2,1],[2,3,1],[2,1,0],[1,1,0],[0,1,1]])
coeffs


Out[4]:
array([[2, 2, 1],
       [2, 3, 1],
       [2, 1, 0],
       [1, 1, 0],
       [0, 1, 1]])

In [5]:
coeffs.dot(m)


Out[5]:
array([[0.55357436],
       [0.65235814],
       [0.36486383],
       [0.2318238 ],
       [0.18871053]])

In order to use "parallel assignment" we may stretch this column vector into a numpy array of shape (5, ), making it akin to an ordinary Python list.


In [6]:
angles = coeffs.dot(m).ravel()
angles.shape


Out[6]:
(5,)

In [7]:
a,b,c,d,e = angles  # get the five values

Now let's build a 1-d vector this time adding f,g,h on the end. We will use this numpy ndarray to transition to a pandas Series, very like a column vector yet able to support labels i.e. string indexes.


In [8]:
vector = np.array([a,b,c,d,e,f,g,h])
vector


Out[8]:
array([0.55357436, 0.65235814, 0.36486383, 0.2318238 , 0.18871053,
       0.13304002, 0.09878378, 0.08992675])

In [9]:
col1 = pd.Series(vector, index=['a','b','c','d','e','f','g','h'])  # note letter indexes

In [10]:
col1 # a pandas Series


Out[10]:
a    0.553574
b    0.652358
c    0.364864
d    0.231824
e    0.188711
f    0.133040
g    0.098784
h    0.089927
dtype: float64

We get our arctangent results in radians. To confirm we getting the right numbers in terms of degrees, lets set up a parallel column. Numpy operations apply to entire columns or vectors, no need to write a Python loop.


In [11]:
col2 = np.degrees(col1)  # convert radians to degrees
col2


Out[11]:
a    31.717474
b    37.377368
c    20.905157
d    13.282526
e    10.812317
f     7.622632
g     5.659894
h     5.152423
dtype: float64

Now we'll use the pandas concat function to create a pandas Dataframe. Since we're expanding along the column axis, not the row axis, we say axis = 1. Otherwise concat will try to put the columns on top of one another.


In [12]:
df = pd.concat([col1, col2], axis=1)  # build a 2-column dataframe

In [13]:
df.rename(columns={0: 'Radians', 1: 'Degrees'}, inplace=True) # renaming columns

In [14]:
df


Out[14]:
Radians Degrees
a 0.553574 31.717474
b 0.652358 37.377368
c 0.364864 20.905157
d 0.231824 13.282526
e 0.188711 10.812317
f 0.133040 7.622632
g 0.098784 5.659894
h 0.089927 5.152423

Using the Dataframe loc attribute, and square brackets (for indexing), we may give both row and column lists. Below we're checking that a, b, c sum to 90 degrees as expected. If we sum the radians column, we would expect pi/2.


In [15]:
np.sum(df.loc[['a','b','c'], 'Degrees'])


Out[15]:
90.00000000000001

In [16]:
np.sum(df.loc[['a','b','c'], 'Radians'])


Out[16]:
1.570796326794897

The arctangent function is the inverse of the tangent function. Going from the radians column back to some initial argument to arctangent, should give us a final cross-check of our initial phi expressions, derived by David Koski.

Here we go then:


In [17]:
col0 = np.tan(col1)  # work back from radians

In [18]:
col0


Out[18]:
a    0.618034
b    0.763932
c    0.381966
d    0.236068
e    0.190983
f    0.133831
g    0.099106
h    0.090170
dtype: float64
The arctangents of the 8 angles described above:
a = 31.717474º  = arctan(Ø^-1)       = arctan(0.618034)
b = 37.377368º  = arctan(2Ø^-2)      = arctan(0.763932)
c = 20.905157º  = arctan(Ø^-2)       = arctan(0.381966)
d = 13.282525º  = arctan(Ø^-3)       = arctan(0.236068)
e = 10.812316º  = arctan(Ø^-2/2)     = arctan(0.190983)
f = 7.622631º   = arctan((2√5-3)/11) = arctan(0.133830)
g = 5.659893º   = arctan((5√5-9)/22) = arctan(0.099106)
h = 5.152423º   = arctan(Ø^-5)       = arctan(0.090169)

In [19]:
phi_expr = pd.Series([Ø**-1, 2*Ø**-2, Ø**-2, Ø**-3, 
                     (Ø**-2)/2,(2*rt5-3)/11, (5*rt5-9)/22, Ø**-5],
                    index=['a','b','c','d','e','f','g','h'])
phi_expr


Out[19]:
a    0.618034
b    0.763932
c    0.381966
d    0.236068
e    0.190983
f    0.133831
g    0.099106
h    0.090170
dtype: float64

In [20]:
df = pd.concat([phi_expr, col0, col1, col2], axis=1)

In [21]:
df.rename(columns={0: "Phi Expr", 1: "Arctan of...", 2: 'Radians', 3: 'Degrees'}, inplace=True)

In [22]:
df


Out[22]:
Phi Expr Arctan of... Radians Degrees
a 0.618034 0.618034 0.553574 31.717474
b 0.763932 0.763932 0.652358 37.377368
c 0.381966 0.381966 0.364864 20.905157
d 0.236068 0.236068 0.231824 13.282526
e 0.190983 0.190983 0.188711 10.812317
f 0.133831 0.133831 0.133040 7.622632
g 0.099106 0.099106 0.098784 5.659894
h 0.090170 0.090170 0.089927 5.152423