{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "# Bean Stalk Series: Dissecting the E & E3\n", "#### by D. Koski & K. Urner, May 2018 (version 1.2), last modified Feb 13, 2019\n", "\n", "
\n", "
\n", "\n", "
\n", "\"E\n", "
\n", "Figure 1: E3 module dissected into Fum, Fo, Fi and Fe\n", "
\n", "
\n", "\n", "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](http://www.rwgrayprojects.com/synergetics/s09/figs/f86561.html) in Synergetics.\n", "\n", "
\n", "\"Excerpt\n", "
\n", "\n", "What are their volumes?\n", "\n", "Lets start with E itself." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.041731316927773654299439512001665297072526423571415085063018243\n" ] } ], "source": [ "import gmpy2\n", "from gmpy2 import sqrt as rt2\n", "from gmpy2 import mpfr\n", "gmpy2.get_context().precision=200\n", "\n", "root2 = rt2(mpfr(2))\n", "root3 = rt2(mpfr(3))\n", "root5 = rt2(mpfr(5))\n", "\n", "ø = (root5 + 1)/2\n", "ø_down = ø ** -1\n", "ø_up = ø\n", "\n", "E_vol = (15 * root2 * ø_down ** 3)/120 # a little more than 1/24, volume of T module\n", "print(E_vol)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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](http://www.rwgrayprojects.com/synergetics/s09/figs/f86411a.html) of Synergetics, spoking out from the point C at the center of any RT diamond, and/or values computed by David Koski.\n", "\n", "First, lets get a color coded version of the E module...\n", "
\n", "
\n", "\n", "
\n", "\"LCD\n", "
\n", "Figure 2: Dissected E-mod with color-coded vertexes (Koski with vZome)\n", "
\n", "
\n", "\n", "
\n", "The black hub is at the center of the RT, as shown here...\n", "\n", "
\n", "\n", "
\n", "\"E\n", "
\n", "Figure 3: RT center is the black hub (Koski with vZome)\n", "
\n", "
\n", "\n", "
\n", "\n", "The edges of the Fum module, tetrahedron Black-Orange-Yellow-Blue will be... (note R=1, D=2):" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Edge e0 = 1.0704662693192697958259095291382636219\n", "Edge e1 = 1.0000000000000000000000000000000000000\n", "Edge e2 = 1.0514622242382672120513381696957532146\n", "Edge e3 = 0.3819660112501051517954131656343618823\n", "Edge e4 = 0.3249196962329063261558714122151344650\n", "Edge e5 = 0.2008114158862272798697976726327421423\n", "Edge e6 = 1.1755705045849462583374119092781455372\n", "Edge e7 = 0.6180339887498948482045868343656381177\n", "Edge e8 = 0.7265425280053608858954667574806187496\n", "Edge e9 = 1.0803630269509058144061726281963757020\n", "Edge e10 = 0.1458980337503154553862394969030856468\n" ] } ], "source": [ "# Edges needed for Fum and Emod\n", "e0 = Black_Yellow = root3 * ø_down\n", "e1 = Black_Blue = mpfr(1) # raddfius of RT = 1 (same as unit-radius sphere)\n", "e2 = Black_Orange = 1/(rt2(ø**2+1)/2)\n", "e3 = Yellow_Blue = (3 - root5)/2\n", "e4 = Blue_Orange = (ø**-1)*(1/rt2(ø**2+1))\n", "e5 = Orange_Yellow = rt2(Yellow_Blue**2 - Blue_Orange**2)\n", "\n", "e6 = Black_Red = rt2((5 - root5)/2)\n", "e7 = Blue_Red = 1/ø\n", "e8 = Red_Yellow = rt2(5 - 2 * root5)\n", "\n", "#print(e3 ** 2 + e7 ** 2)\n", "#print(e8 ** 2)\n", "#assert e3 ** 2 + e7 ** 2 == e8 ** 2 # check\n", "#assert e4 ** 2 + e5 ** 2 == e3 ** 2 # check\n", "\n", "# not needed for this computation\n", "e9 = Black_Green = 20/(5 * root2 * ø**2) # Sfactor\n", "e10 = Purple_Green = ø ** -4\n", "\n", "for e in range(11):\n", " val = \"e\" + str(e)\n", " length = eval(val)\n", " print(\"Edge {:3} = {:40.37}\".format(val, length))" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fum volume (in tetravolumes): 0.01153425231977786989958654934854448197\n", "E volume (in tetravolumes) : 0.04173131692777365429943951200166529707\n" ] } ], "source": [ "import tetravolume as tv # has to be in your path, stored on Github with this JN\n", "# D = 1 in this module, so final volume need to be divided by 8 to match R=1 (D=2)\n", "# see Fig. 986.411A in Synergetics\n", "\n", "Fum_vol = tv.Tetrahedron(e0,e1,e2,e3,e4,e5).ivm_volume()/8\n", "E_vol = tv.Tetrahedron(e1,e0,e6,e3,e8,e7).ivm_volume()/8\n", "print(\"Fum volume (in tetravolumes): {:40.38}\".format( Fum_vol ))\n", "print(\"E volume (in tetravolumes) : {:40.38}\".format( E_vol ))" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fe: 0.00608851708557343129604019222150604124\n", "Fi: 0.00985142758554226390245304251955107153\n", "Fo: 0.01425711993688008920135972791206370233\n", "Fum: 0.01153425231977786989958654934854448197\n", "E_vol: 0.04173131692777365429943951200166529707\n", "E_vol: 0.04173131692777365429943951200166529707\n" ] } ], "source": [ "Fe = (ø**-7) * (rt2(2)/8)\n", "Fi = (ø**-6) * (rt2(2)/8)\n", "Fo = ((5-rt2(5))/5) * (ø**-4) * (rt2(2)/8)\n", "Fum = (rt2(5)/5) * (ø**-4)*(rt2(2)/8)\n", "Fe_Fi = (ø**-5) * (rt2(2)/8)\n", "Fo_Fum = (ø**-4) * (rt2(2)/8)\n", "print(\"Fe: {:40.38}\".format(Fe))\n", "print(\"Fi: {:40.38}\".format(Fi))\n", "print(\"Fo: {:40.38}\".format(Fo))\n", "print(\"Fum: {:40.38}\".format(Fum))\n", "print(\"E_vol: {:40.38}\".format((Fe_Fi) + (Fo_Fum)))\n", "print(\"E_vol: {:40.38}\".format((ø**-3)*(rt2(2)/8)))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lets start with a Pentagonal Dodecahedron and build it from Es + e3s." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "15.35001820805078186401100574822181338985187177431493578911136\n" ] } ], "source": [ "PD = 3 * root2 * (ø ** 2 + 1)\n", "print(PD)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "15.35001820805078186401100574822181338985187177431493578911136\n" ] } ], "source": [ "E = e = E_vol # shorthand (E3 = E * ø_up ** 3, e3 = E * ø_down ** 3, E = e)\n", "e3 = e * ø_down ** 3\n", "PD = 348 * E + 84 * e3\n", "print(PD)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "RT3, on the other hand, has a volume we may express as:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "21.213203435596425732025330863145471178545078130654221097650211\n" ] } ], "source": [ "RT3 = 480 * E + 120 * e3 # e3 is e * ø_down ** 3 (e = E)\n", "print(RT3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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).\n", "\n", "It turns out that if we shave a Fum3 off an E3, and multiply by 120, we get the PD's volume.\n", "\n", "Put another way: RT3 - PD leaves a volume of 120 Fum3 volumes. In other words 120 * (E3 - Fum3) = PD." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.17677669529663688110021109052621225982120898442211850914708495\n", "0.048859876896213698900119375957697148239110052969494044237823767\n", "5.8631852275456438680143251149236577886932063563392853085388504\n", "5.8631852275456438680143251149236577886932063563392853085388504\n" ] } ], "source": [ "E3 = E_vol * ø_up ** 3\n", "Fum3 = Fum_vol * ø_up ** 3\n", "print(E3)\n", "print(Fum3)\n", "print(RT3 - PD)\n", "print(120 * Fum3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you can see, the relationship holds, though floating point numbers add some noise.\n", "\n", "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." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10.452578723944649\n", "13.282525588538993\n", "20.905157447889298\n", "31.717474411461005\n", "37.37736814064969\n", "0.7853981633974483\n", "0.7853981633974483\n", "1.1071487177940904\n", "1.1071487177940906\n", "63.43494882292202\n", "1.2490457723982542\n", "1.2490457723982544\n", "71.56505117707799\n" ] } ], "source": [ "from math import atan, sqrt as rt2, degrees\n", "\n", "Ø = (1 + rt2(5))/2 # back to floating point\n", "\n", "print(degrees(atan(Ø**-2)/2)) # 10.812316º\n", "print(degrees(atan(Ø**-3))) # 13.282525º\n", "print(degrees(atan(Ø**-2))) # 20.905157º\n", "print(degrees(atan(Ø**-1))) # 31.717474º\n", "print(degrees(atan(2*Ø**-2))) # 37.377368º\n", "\n", "print(atan(Ø ** -1) + atan(Ø ** -3))\n", "print(atan(1)) # arctan 1 = 45º\n", "\n", "print(2 * atan(Ø**-1))\n", "print(atan(2)) # 63.434948º\n", "print(degrees(atan(2))) # 63.434948º\n", "\n", "print( atan(Ø**-1) + 3 * atan(Ø**-3) )\n", "print(atan(3)) # 71.565051º\n", "print(degrees(atan(3))) # 71.565051º" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For Further Reading:\n", "* [Cuboidal E3](https://github.com/4dsolutions/Python5/blob/master/CuboidalE3.ipynb)\n", "* [Terminology and Scope](http://worldgame.blogspot.com/2017/10/terminology-and-scope.html)\n", "* [Escaping the Vortex of Standardized Tests](https://medium.com/@kirbyurner/escaping-the-vortex-of-standardized-tests-a-game-plan-84d77d75d100)\n", "* [S&E Modules (Python 3 Repl)](https://repl.it/@kurner/SandE-Modules)\n", "* [Figure 986.411A in Synergetics](http://www.rwgrayprojects.com/synergetics/s09/figs/f86411a.html)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.7" } }, "nbformat": 4, "nbformat_minor": 2 }