Bean Stalk Series: Dissecting the E & E3

by D. Koski & K. Urner, May 2018 (version 1.2), last modified Feb 13, 2019



Figure 1: E3 module dissected into Fum, Fo, Fi and Fe

What we see here is another vZome construction by David Koski, showing an E3 module dissected into four sub-modules, according to how the great circles of the 120 LCD Triangles cross the RT as chords. Compare with Figure 986.561 in Synergetics.

What are their volumes?

Lets start with E itself.


In [1]:
import gmpy2
from gmpy2 import sqrt as rt2
from gmpy2 import mpfr
gmpy2.get_context().precision=200

root2 = rt2(mpfr(2))
root3 = rt2(mpfr(3))
root5 = rt2(mpfr(5))

ø = (root5 + 1)/2
ø_down = ø ** -1
ø_up = ø

E_vol = (15 * root2 * ø_down ** 3)/120 # a little more than 1/24, volume of T module
print(E_vol)


0.041731316927773654299439512001665297072526423571415085063018243

Now lets import the tetravolume.py module, which in turn has dependencies, to get these volumes directly, based on edge lengths. I'll use the edges given in Fig. 986.411 of Synergetics, spoking out from the point C at the center of any RT diamond, and/or values computed by David Koski.

First, lets get a color coded version of the E module...

Figure 2: Dissected E-mod with color-coded vertexes (Koski with vZome)


The black hub is at the center of the RT, as shown here...


Figure 3: RT center is the black hub (Koski with vZome)


The edges of the Fum module, tetrahedron Black-Orange-Yellow-Blue will be... (note R=1, D=2):


In [2]:
# Edges needed for Fum and Emod
e0 = Black_Yellow  = root3 * ø_down
e1 = Black_Blue    = mpfr(1)  # raddfius of RT = 1 (same as unit-radius sphere)
e2 = Black_Orange  = 1/(rt2(ø**2+1)/2)
e3 = Yellow_Blue   = (3 - root5)/2
e4 = Blue_Orange   = (ø**-1)*(1/rt2(ø**2+1))
e5 = Orange_Yellow = rt2(Yellow_Blue**2 - Blue_Orange**2)

e6 = Black_Red  = rt2((5 - root5)/2)
e7 = Blue_Red   = 1/ø
e8 = Red_Yellow = rt2(5 - 2 * root5)

#print(e3 ** 2 + e7 ** 2)
#print(e8 ** 2)
#assert e3 ** 2 + e7 ** 2 == e8 ** 2  # check
#assert e4 ** 2 + e5 ** 2 == e3 ** 2  # check

# not needed for this computation
e9  = Black_Green = 20/(5 * root2 * ø**2) # Sfactor
e10 = Purple_Green = ø ** -4

for e in range(11):
    val = "e" + str(e)
    length = eval(val)
    print("Edge {:3} = {:40.37}".format(val, length))


Edge e0  =  1.0704662693192697958259095291382636219
Edge e1  =  1.0000000000000000000000000000000000000
Edge e2  =  1.0514622242382672120513381696957532146
Edge e3  =  0.3819660112501051517954131656343618823
Edge e4  =  0.3249196962329063261558714122151344650
Edge e5  =  0.2008114158862272798697976726327421423
Edge e6  =  1.1755705045849462583374119092781455372
Edge e7  =  0.6180339887498948482045868343656381177
Edge e8  =  0.7265425280053608858954667574806187496
Edge e9  =  1.0803630269509058144061726281963757020
Edge e10 =  0.1458980337503154553862394969030856468

In [3]:
import tetravolume as tv # has to be in your path, stored on Github with this JN
# D = 1 in this module, so final volume need to be divided by 8 to match R=1 (D=2)
# see Fig. 986.411A in Synergetics

Fum_vol = tv.Tetrahedron(e0,e1,e2,e3,e4,e5).ivm_volume()/8
E_vol   = tv.Tetrahedron(e1,e0,e6,e3,e8,e7).ivm_volume()/8
print("Fum volume (in tetravolumes): {:40.38}".format( Fum_vol ))
print("E volume (in tetravolumes)  : {:40.38}".format(  E_vol ))


Fum volume (in tetravolumes): 0.01153425231977786989958654934854448197
E volume (in tetravolumes)  : 0.04173131692777365429943951200166529707

In [4]:
Fe     = (ø**-7) * (rt2(2)/8)
Fi     = (ø**-6) * (rt2(2)/8)
Fo     = ((5-rt2(5))/5) * (ø**-4) * (rt2(2)/8)
Fum    = (rt2(5)/5) * (ø**-4)*(rt2(2)/8)
Fe_Fi  = (ø**-5) * (rt2(2)/8)
Fo_Fum = (ø**-4) * (rt2(2)/8)
print("Fe:    {:40.38}".format(Fe))
print("Fi:    {:40.38}".format(Fi))
print("Fo:    {:40.38}".format(Fo))
print("Fum:   {:40.38}".format(Fum))
print("E_vol: {:40.38}".format((Fe_Fi) + (Fo_Fum)))
print("E_vol: {:40.38}".format((ø**-3)*(rt2(2)/8)))


Fe:    0.00608851708557343129604019222150604124
Fi:    0.00985142758554226390245304251955107153
Fo:    0.01425711993688008920135972791206370233
Fum:   0.01153425231977786989958654934854448197
E_vol: 0.04173131692777365429943951200166529707
E_vol: 0.04173131692777365429943951200166529707

Lets start with a Pentagonal Dodecahedron and build it from Es + e3s.


In [5]:
PD = 3 * root2 * (ø ** 2 + 1)
print(PD)


15.35001820805078186401100574822181338985187177431493578911136

In [6]:
E  = e = E_vol # shorthand (E3 = E * ø_up ** 3, e3 = E * ø_down ** 3, E = e)
e3 = e * ø_down ** 3
PD = 348 * E + 84 * e3
print(PD)


15.35001820805078186401100574822181338985187177431493578911136

RT3, on the other hand, has a volume we may express as:


In [7]:
RT3 = 480 * E + 120 * e3  # e3 is e * ø_down ** 3 (e = E)
print(RT3)


21.213203435596425732025330863145471178545078130654221097650211

Recall RT3 is the Rhombic Triacontahedron we get by intersecting the two Platonic duals: Icosahedron (Icosa) and Pentagonal Dodecahedron (PD), with the former having edges = 2R and volume ~18.51 (5 * rt2(2) * ø ** 2).

It turns out that if we shave a Fum3 off an E3, and multiply by 120, we get the PD's volume.

Put another way: RT3 - PD leaves a volume of 120 Fum3 volumes. In other words 120 * (E3 - Fum3) = PD.


In [8]:
E3 = E_vol * ø_up ** 3
Fum3 = Fum_vol * ø_up ** 3
print(E3)
print(Fum3)
print(RT3 - PD)
print(120 * Fum3)


0.17677669529663688110021109052621225982120898442211850914708495
0.048859876896213698900119375957697148239110052969494044237823767
5.8631852275456438680143251149236577886932063563392853085388504
5.8631852275456438680143251149236577886932063563392853085388504

As you can see, the relationship holds, though floating point numbers add some noise.

In addition to edge lengths, we have a succinct way to express the angles of this LCD triangle in terms of ø, thanks to David Koski.


In [9]:
from math import atan, sqrt as rt2, degrees

Ø = (1 + rt2(5))/2  # back to floating point

print(degrees(atan(Ø**-2)/2))  # 10.812316º
print(degrees(atan(Ø**-3)))    # 13.282525º
print(degrees(atan(Ø**-2)))    # 20.905157º
print(degrees(atan(Ø**-1)))    # 31.717474º
print(degrees(atan(2*Ø**-2)))  # 37.377368º

print(atan(Ø ** -1) + atan(Ø ** -3))
print(atan(1)) # arctan 1 = 45º

print(2 * atan(Ø**-1))
print(atan(2))          # 63.434948º
print(degrees(atan(2))) # 63.434948º

print( atan(Ø**-1) + 3 * atan(Ø**-3) )
print(atan(3))          # 71.565051º
print(degrees(atan(3))) # 71.565051º


10.452578723944649
13.282525588538993
20.905157447889298
31.717474411461005
37.37736814064969
0.7853981633974483
0.7853981633974483
1.1071487177940904
1.1071487177940906
63.43494882292202
1.2490457723982542
1.2490457723982544
71.56505117707799