{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "[Oregon Curriculum Network](http://4dsolutions.net/ocn/)\n", "\n", "[School of Tomorrow (Home)](School_of_Tomorrow.ipynb)\n", "\n", "![animated](anim.gif)\n", "\n", "# Generating the Flextegrity Lattice\n", "\n", "Our purpose here is to elaborate a classic Python framework for storing and writing geometric information in a variety of formats, suitable for ray tracing and use within CAD programs.\n", "\n", "The target architecture we want to model is [Flextegrity](http://c6xty.com), a tension-compression lattice based on holding compression islands in relative positions, in an all-way space. Its inventor is Sam Lanahan.\n", "\n", "The specific output from Python is Scene Description Language used by [POV-Ray](povray.org). You may provision your computer with these free components from original web sources or in the form of [Docker containers](https://hub.docker.com/r/jmaxwilson/povray).\n", "\n", "### CCP (Cubic Close Packing)\n", "The general case CCP lattice will form our background. The cubic closest packed matrix of balls serves as our \"holodeck\" (our substitute XYZ grid), for \"tuning in\" our Flextegrity lattices.\n", "\n", "Where spheres touch, they define the diamond faces of a rhombic dodecahedron, each tangent to twelve neighbors. This marks the \"high water mark\" for sphere size (inter-tangency) and is the CCP itself.\n", "\n", "From [Synergetics](http://www.rwgrayprojects.com/synergetics/findex/fx0900.html):\n", "\n", "![RD](rhombic_dodeca_ccp_ball.png)\n", "\n", "As spheres begin to contract, without losing their fixed coordinates, we're in a position to study alternative adjoining or holding strategies. \n", "\n", "How might these spheres still connect to each other in a way that preserves their initial positions, and yet allow for abberrational distortions, i.e. flexibility? Our lattice is not brittle. Sam's solutions find their roots in Tensegrity, and his own variations in that space, introducing springiness and curvature.\n", "\n", "### Elastic Interval Geometry\n", "\n", "Tensegrity and [Kenneth Snelson](http://grunch.net/snelson/) are also behind Elastic Interval Geometry, so named by me and one of its chief practitioners, Gerald de Jong. \n", "\n", "\"Pretty\n", "\n", "That's the same Gerald who contributed our tetravolumes computing algorithm, reminiscent of earlier algorithms for returning a tetrahedron's volume from its six edges.\n", "\n", "\"Computer\n", "\n", "### CCP in Architecture\n", "\n", "The center-to-center strategy is well known to some architects as a space frame patented as the \"octet truss\" by R. Buckminster Fuller, and featured as \"kites\" in earlier studies by Alexander Graham Bell. \n", "\n", "NASA went with [the octet truss](http://grunch.net/synergetics/octet.html) as a basic space frame for orbiting space station designs.\n", "\n", "\"Octet\n", "\n", "This lattice also went by the name of Isotropic Vector Matrix (IVM) in the philosophical language of Synergetics, pioneered by U.S. Medal of Freedom winner R. Buckminster Fuller (RBF). \n", "\n", "More curvilinear versions were employed in geodesic dome structures. We see more examples of the \"octet truss\" at PDX (the Portland airport) and at the Business Accelerator building (PSU).\n", "\n", "\"DSCF4255\"\n", "\n", "\"Business\n", "\n", "### Flextegrity\n", "\n", "Sam Lanahan pioneered a three-way weaving of mutually orthogonal truss members, called struts in some models, that suggest different, possibly flexible, materials. \n", "\n", "Flexibility means countouring, as road pavement matches the contour of the underlying topography.\n", "\n", "\"Flextegrity\n", "\n", "### Cubic Reference Cells\n", "\n", "Our cubic reference cell, surrounding any compression island, is defined by the short diagonals of the rhombic dodecahedron's diamond faces. \n", "\n", "The cube and dodeca have relative volumes 3 and 6 (1 and 2). Each dodeca carves out 1/6th of the six face-adhering neighboring reference cubes, pictured as void (no balls therein). This effectively describes the rhombic dodecahedron: a reference cube with six sixths added (so double the cube's volume).\n", "\n", "The rhombic dodecahedron is the space-filler associated with the CCP, with each ball nested snugly inside one. Diamonds have long and short diagonals. The twelve short ones define our reference cube. The twelve long ones define an octahedron.\n", "\n", "Relative the tetrahedron of four CCP balls, intertangent, the rhombic dodecahedron is six tetravolumes, the cube three, the octahedron four." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![ ](sphere_pack.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "From the Fuller Archives:\n", "\n", "\"Legendary\n", "\n", "Consider an icosahedron with its three XYZ golden rectangles parallel to those of our reference cube. If the rectangles terminate in the cube's faces, then connecting bands to adjacent cube edges will provide a mechanism for inter-icosahedron joining.\n", "\n", "![](flextegrity.png)\n", "\n", "As the icosahedrons grow such that their phi rectangles protrude through the cubes' faces, into the neighboring cube domains, all six of which are void (empty of sphere centers), the bands from golden rectangle termini, to the surrounding reference cube edges, will potentially slant, like the sides of a tent from a ridge pole, but not as steeply. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![](test_struts2.png)\n", "![](test_struts.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![](anim4.gif)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This slanting band will meet another at 180 degrees, coming from a neighboring icosahedron. Twelve icosahedron's around a nuclear icosahedron, will be held in place in this way.\n", "\n", "![](flextegrity3.png)\n", "\n", "When the compression island icosahedrons have their phi rectangles flush to the reference cube faces, the X, Y, Z strutworks of the Flextegrity system stay flat, unzigzaggy. Allowing the compression islands to vary in diameter is what introduces the zigzagging.\n", "\n", "![](flextegrity2.png)\n", "\n", "\"Flextegrity\n", "\n", "\n", "## Python Framework\n", "\n", "The Python framework we're developing has a generic purpose, of introducing simple vectorial geometry in conjunction with the Concentric Hierarchy well-known to School of Tomorrow students. The content is in the form of a Jupyter Notebook on Github.\n", "\n", "The skeletal Polyhedron class below is meant to be subclassed and further fleshed out. This inherited piece provides mechanisms for resizing and translating the beast. You may imagine adding rotation, as you learn more about vector-based computations based on technologies invented by Heaviside-Gibbs.\n", "\n", "Python allows operator overloading such that multiplying a Polyhedron object by a scalar using the asterisk triggers ```__mul__``` or ```__rmul__``` inside the class. \n", "\n", "![concentric_hierarchy](concentric_hierarchy.png)\n", "\n", "The scalar is say an int or float, and will clone the target polyhedron but for its size (its center coordinates remain unchanged). \n", "\n", "A new Polyhedron is delivered, following a more functional model emphasizing immutability of state, and ditto in the case of translation, optionally addable rotation.\n", "\n", "Throw away the old one if you don't need it, or let the garbage collector do it. The alternative, changing a polyhedron in place by default, is considered poor practice by today's lights.\n", "\n", "Using the addition operator (the plus symbol) triggers ```__add__``` or ```__radd__```, and by supplying a vector as an argument (like an arrow pointing to \"where it should move\"), the target polyhedron will thereby become translated, without resizing or rotating. \n", "\n", "Again, the original polyhedron is unaffected. New vertexes get created and edge termini updated. If someone has messed with the facial structure, this will come out in the distillation step. The facial structure as vertex rings, tuples of consecutive corners, last connecting to first, is the essential topology. \n", "\n", "Acting on all the vertexes effectively scales and/or moves the object, but the Polyhedron so defined need not entangle itself with the original.\n", "\n", "```python\n", ">>> t = Tetrahedron()\n", ">>> t2 = t + Qvector((2,1,1,0))\n", ">>> t2.edges \n", "[Edge from ivm_vector(a=2, b=2, c=1, d=0) to ivm_vector(a=1, b=0, c=0, d=0),\n", " Edge from ivm_vector(a=2, b=1, c=2, d=0) to ivm_vector(a=1, b=0, c=0, d=0),\n", " Edge from ivm_vector(a=3, b=1, c=1, d=0) to ivm_vector(a=2, b=1, c=2, d=0),\n", " Edge from ivm_vector(a=3, b=1, c=1, d=0) to ivm_vector(a=1, b=0, c=0, d=0),\n", " Edge from ivm_vector(a=3, b=1, c=1, d=0) to ivm_vector(a=2, b=2, c=1, d=0),\n", " Edge from ivm_vector(a=2, b=2, c=1, d=0) to ivm_vector(a=2, b=1, c=2, d=0)]\n", "```\n", "\n", "The strategy in both cases (resizing or moving) is similar: the vertexes are what anchor the whole show, are the tent stakes as it were. \n", "\n", "To resize and move requires recomputing the vertexes, relative to an origin. \n", "\n", "Additionally, each subclass of Polyhedron needs to bring to the table its own dictionary of labeled faces.\n", "\n", "Per the Cube:\n", "\n", "```python\n", "\n", " # 6 faces\n", " self.faces = (('a','f','c','h'),('h','c','e','b'),\n", " ('b','e','d','g'),('g','d','f','a'),\n", " ('c','f','d','e'),('a','h','b','g'))\n", "```\n", "\n", "where these lowercase labels correspond to their uppercase global counterparts, the A-Z of the Concentric Hierarchy.\n", "\n", "From the faces, a Polyhedron knows how to distill all the edge pairs. The Edge is a type of object all on its own, consisting of only two vectors. A vector, by definition, has its tail at the origin, and so only carries the information for one point in space (relative the fixed origin). An Edge connects any two vectors, so a Polyhedron may be considered a network of such edges." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "class Polyhedron:\n", " \"\"\"\n", " Designed to be subclassed, not used directly\n", " \"\"\"\n", " \n", " def scale(self, scalefactor):\n", " if hasattr(self, \"volume\"):\n", " self.volume = scalefactor ** 3\n", " newverts = {}\n", " for v in self.vertexes:\n", " newverts[v] = self.vertexes[v] * scalefactor\n", " newme = type(self)()\n", " newme.vertexes = newverts # substitutes new guts\n", " newme.edges = newme._distill() # update edges to use new verts\n", "\n", " return newme\n", "\n", " __mul__ = __rmul__ = scale\n", "\n", " def translate(self, vector):\n", " newverts = {}\n", " for v in self.vertexes:\n", " newverts[v] = self.vertexes[v] + vector\n", " newme = type(self)()\n", " newme.vertexes = newverts # substitutes new tent stakes\n", " if hasattr(self, \"center\"): # shift center before suppress!\n", " newme.center = self.center + vector\n", " if hasattr(self, \"suppress\"):\n", " newme.suppress = self.suppress\n", " if newme.suppress:\n", " newme.faces = newme._suppress()\n", " newme.edges = newme._distill() # update edges to use new verts \n", " return newme\n", "\n", " __add__ = __radd__ = translate\n", " \n", " def _distill(self):\n", "\n", " edges = []\n", " unique = set()\n", " \n", " for f in self.faces:\n", " for pair in zip(f , f[1:] + (f[0],)):\n", " unique.add( tuple(sorted(pair)) )\n", " \n", " for edge in unique:\n", " edges.append( Edge(self.vertexes[edge[0]],\n", " self.vertexes[edge[1]]) )\n", "\n", " return edges " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As provided, the Edge is little more than a two-vector storing device. In various frameworks, it might be fleshed out to provide its own rendering methods. By \"rendering\" I mean writing out in some other flavor of source code (outside of Python) such as in Scene Description Language (POV-Ray, free, open) or in Rhino (CAD).\n", "\n", "\"DSCF5299\"\n", "\n", "\"Disassembling\n", "\n", "Rather than customize the Edge here, the Scene Description Language rendering will be provided externally, as free-standing functions outside of Polyhedron or Edge types." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "class Edge:\n", "\n", " \"\"\"\n", " Edges are defined by two Vectors (above) and express as cylinder via draw().\n", " \"\"\"\n", "\n", " def __init__(self, v0, v1):\n", " self.v0 = v0 # actual coordinates, not a letter label\n", " self.v1 = v1\n", " \n", " def __repr__(self):\n", " return 'Edge from %s to %s' % (self.v0, self.v1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The master function we'll use for rendering a poly is ```draw_poly```. It takes the poly in question as a first argument, then the filetype object to which the output will go. Finally, some switches allow turning on and off rendering of specifically edges, vertexes and faces (V + F = E + 2)." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def draw_vert(v, c, r, t): pass\n", "def draw_face(f, c, r, t): pass\n", "def draw_edge(e, c, r, t): pass\n", "\n", "def draw_poly(p, the_file, v=True, f=False, e=True):\n", " \n", " ec = p.edge_color\n", " er = p.edge_radius\n", " vc = p.vert_color\n", " vr = p.vert_radius\n", " fc = p.face_color\n", " \n", " if v:\n", " for v in p.vertexes.values():\n", " draw_vert(v, vc, vr, the_file)\n", "\n", " if f:\n", " for f in p.faces:\n", " draw_face(f, fc, the_file)\n", "\n", " if e:\n", " for e in p.edges:\n", " draw_edge(e, ec, er, the_file)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![](qtet.png)\n", "\n", "### Quadray Coordinates\n", "\n", "For a change of pace, and to expand our horizons, the vector framework here introduced may seem unfamiliar. Instead of the three positive and three negative unit vectors, spokes in a \"jack\" arrangement, we have just four basis vectors, scalable but not rotatable, and use linear combinations of those four to specify our point \"out there\" from the origin, which is (0,0,0,0). Instead of a \"jack\" we're using a \"caltrop\".\n", "\n", "![quadrays](https://upload.wikimedia.org/wikipedia/commons/9/99/Quadray.gif)\n", "\n", "As discussed in [Generating the FCC](https://github.com/4dsolutions/School_of_Tomorrow/blob/master/Flextegrity_Lattice.ipynb), all twelve unique permutations of the quadray coordinates {2,1,1,0} give us the CCP positions relative the origin. We may fill space with the CCP, while using integral 4-tuple addressing for the rhombic dodecahedron centers." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from qrays import Qvector" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Globals: A-Z + Jitterbug\n", "\n", "Perhaps controversially, the global namespace gets populated with a set of reference vectors, conveniently A-Z i.e. 26 ASCII characters (consecutive). These are all vector sums of the original basis vectors, which go from the center of a tetrahedron in four directions, by convention to its points.\n", "\n", "The edges of the Tetrahedron formed by the four basis vectors have the lengths we most care about and we measure in CCP sphere radii or diameters. The Tetrahedron has edges = 1 CCP diameter (2 radii).\n", "\n", "We get pretty much all of the Concentric Hierarchy vertexes with A-Z, but for the 12 vertexes of the icosahedron (from which its dual, and rhombic triacontahedron, may be derived). The bridging to five-fold symmetry is accomplished by means of the Jitterbug Transformation in our curriculum.\n", "\n", "In the computations below, the outer 12 positions are transformed into the three mutually orthogonal phi rectangles or \"boards\" of the icosahedron." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![cubocta](https://upload.wikimedia.org/wikipedia/commons/d/dc/Povlabels.gif)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "import math\n", "PHI = (1 + math.sqrt(5))/2.0\n", "\n", "ORIGIN = Qvector((0,0,0,0))\n", "A = Qvector((1,0,0,0))\n", "B = Qvector((0,1,0,0))\n", "C = Qvector((0,0,1,0))\n", "D = Qvector((0,0,0,1))\n", "E,F,G,H = B+C+D, A+C+D, A+B+D, A+B+C\n", "I,J,K,L,M,N = A+B, A+C, A+D, B+C, B+D, C+D\n", "O,P,Q,R,S,T = I+J, I+K, I+L, I+M, N+J, N+K\n", "U,V,W,X,Y,Z = N+L, N+M, J+L, L+M, M+K, K+J\n", "\n", "# OPPOSITE DIAGONALS\n", "# ZY WX\n", "# RV OS\n", "# TU PQ\n", "control = (Z - T).length()\n", "\n", "midface = (Z + Y)\n", "gold = 0.5 * PHI * midface/midface.length()\n", "Zi = gold + J/J.length() * control/2\n", "Yi = gold + M/M.length() * control/2\n", "\n", "midface = (W + X)\n", "gold = 0.5 * PHI * midface/midface.length()\n", "Wi = gold + J/J.length() * control/2\n", "Xi = gold + M/M.length() * control/2\n", "\n", "midface = (R + V)\n", "gold = 0.5 * PHI * midface/midface.length()\n", "Ri = gold + I/I.length() * control/2\n", "Vi = gold + N/N.length() * control/2\n", "\n", "midface = (O + S)\n", "gold = 0.5 * PHI * midface/midface.length()\n", "Oi = gold + I/I.length() * control/2\n", "Si = gold + N/N.length() * control/2\n", "\n", "midface = (T + U)\n", "gold = 0.5 * PHI * midface/midface.length()\n", "Ti = gold + K/K.length() * control/2\n", "Ui = gold + L/L.length() * control/2\n", "\n", "midface = (P + Q)\n", "gold = 0.5 * PHI * midface/midface.length()\n", "Pi = gold + K/K.length() * control/2\n", "Qi = gold + L/L.length() * control/2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Subclassing the Polyhedron Class\n", "Subclassing may now commence. At this level, customization, a kind of \"rust\" is tainting our hitherto Platonic framework with abberational details of a specific subculture, that of [the POV-Ray users](http://hof.povray.org/), the raytracers.\n", "\n", "\"Outdoor\n", "\n", "Secondary characteristics (as these were known to Descartes) include such not-Platonic features as color, texture, even weight. Tension and compression start to creep in, as real world properties. All of this is for the better, but it complicates our code, so we have postponed, until now, any introduction of Scene Description Language." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "class Tetrahedron(Polyhedron):\n", " \"\"\"\n", " Tetrahedron\n", " \"\"\"\n", " \n", " def __init__(self):\n", " # POV-Ray\n", " self.edge_color = \"rgb <{}, {}, {}>\".format(1, 165/255, 0) # orange\n", " self.edge_radius= 0.03\n", " self.vert_color = \"rgb <{}, {}, {}>\".format(1, 165/255, 0) # orange\n", " self.vert_radius= 0.03\n", " self.face_color = \"rgb <0, 0, 0>\" # not used \n", " \n", " verts = dict(a = Qvector((1,0,0,0)), #A\n", " b = Qvector((0,1,0,0)), #B\n", " c = Qvector((0,0,1,0)), #C\n", " d = Qvector((0,0,0,1))) #D\n", " \n", " self.name = \"Tetrahedron\"\n", " self.volume = 1 # per Concentric Hierarchy\n", " self.center = ORIGIN\n", "\n", " # 4 vertices\n", " self.vertexes = verts\n", " \n", " # 4 faces\n", " self.faces = (('a','b','c'),('a','c','d'),\n", " ('a','d','b'),('b','d','c'))\n", "\n", " self.edges = self._distill()\n", "\n", "class InvTetrahedron(Polyhedron):\n", " \"\"\"\n", " Inverse Tetrahedron\n", " \"\"\"\n", " \n", " def __init__(self):\n", " # POV-Ray\n", " self.edge_color = \"rgb <{}, {}, {}>\".format(0, 0, 0) # black\n", " self.edge_radius= 0.03\n", " self.vert_color = \"rgb <{}, {}, {}>\".format(0, 0, 0) # black\n", " self.vert_radius= 0.03\n", " self.face_color = \"rgb <0, 0, 0>\" # not used \n", " \n", " verts = dict(e = -Qvector((1,0,0,0)), #E\n", " f = -Qvector((0,1,0,0)), #F\n", " g = -Qvector((0,0,1,0)), #G\n", " h = -Qvector((0,0,0,1))) #H\n", " \n", " self.name = \"InvTetrahedron\"\n", " self.volume = 1 # per Concentric Hierarchy\n", " self.center = ORIGIN\n", " \n", " # 4 vertices\n", " self.vertexes = verts\n", " \n", " # 4 faces\n", " self.faces = (('e','f','g'),('e','g','h'),\n", " ('e','h','f'),('f','h','g'))\n", "\n", " self.edges = self._distill()\n", " \n", "class Cube (Polyhedron):\n", " \"\"\"\n", " Cube\n", " \"\"\"\n", "\n", " def __init__(self):\n", " # POV-Ray\n", " self.edge_color = \"rgb <0, 1, 0>\"\n", " self.edge_radius= 0.03\n", " self.vert_color = \"rgb <0, 1, 0>\"\n", " self.vert_radius= 0.03\n", " self.face_color = \"rgb <0, 0, 0>\"\n", "\n", " verts = {}\n", " for vert_label in \"abcdefgh\":\n", " # keep the uppercase A-Z universe (namespace) unobstructed\n", " verts[vert_label] = eval(vert_label.upper())\n", " \n", " self.name = \"Cube\"\n", " self.volume = 3 # per Concentric Hierarchy\n", " self.center = ORIGIN\n", " \n", " # 8 vertices\n", " self.vertexes = verts\n", " \n", " # 6 faces\n", " self.faces = (('a','f','c','h'),('h','c','e','b'),\n", " ('b','e','d','g'),('g','d','f','a'),\n", " ('c','f','d','e'),('a','h','b','g'))\n", "\n", " self.edges = self._distill()\n", " \n", "\n", "class Octahedron (Polyhedron):\n", " \"\"\"\n", " Octahedron\n", " \"\"\"\n", "\n", " def __init__(self):\n", " # POV-Ray\n", " self.edge_color = \"rgb <1, 0, 0>\"\n", " self.edge_radius= 0.03\n", " self.vert_color = \"rgb <1, 0, 0>\"\n", " self.vert_radius= 0.03\n", " self.face_color = \"rgb <0, 0, 0>\"\n", " \n", " verts = {}\n", " for vert_label in \"ijklmn\":\n", " # keep the uppercase A-Z universe unobstructed\n", " verts[vert_label] = eval(vert_label.upper())\n", "\n", " self.name = \"Octahedron\"\n", " self.volume = 4 # per Concentric Hierarchy\n", " self.center = ORIGIN\n", " \n", " # 6 vertices\n", " self.vertexes = verts\n", "\n", " # 8 faces\n", " self.faces = (('j','k','i'),('j','i','l'),('j','l','n'),('j','n','k'), \n", " ('m','k','i'),('m','i','l'),('m','l','n'),('m','n','k'))\n", "\n", " self.edges = self._distill()\n", " \n", "class RD (Polyhedron):\n", " \"\"\"\n", " Rhombic Dodecahedron\n", " \"\"\"\n", "\n", " def __init__(self):\n", " self.edge_color = \"rgb <0, 0, 1>\"\n", " self.edge_radius= 0.03\n", " self.vert_color = \"rgb <0, 0, 1>\"\n", " self.vert_radius= 0.03\n", " self.face_color = \"rgb <0, 0, 0>\"\n", "\n", " verts = {}\n", " for vert_label in \"abcdefghijklmn\":\n", " # keep the uppercase A-Z universe unobstructed\n", " verts[vert_label] = eval(vert_label.upper())\n", " \n", " self.name = \"RD\"\n", " self.volume = 6 # per Concentric Hierarchy\n", " self.center = ORIGIN\n", " \n", " # 14 vertices\n", " self.vertexes = verts\n", "\n", " # 12 faces\n", " # I,J,K,L,M,N = A+B, A+C, A+D, B+C, B+D, C+D\n", " self.faces = (('j','f','k','a'),('j','f','n','c'),('j','c','l','h'),('j','h','i','a'),\n", " ('m','d','k','g'),('m','d','n','e'),('m','e','l','b'),('m','b','i','g'),\n", " ('k','d','n','f'),('n','c','l','e'),('l','h','i','b'),('i','a','k','g'))\n", "\n", " self.edges = self._distill()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![cubocta](https://upload.wikimedia.org/wikipedia/commons/d/dc/Povlabels.gif)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The code above goes back to the original Quadray coodinates of each vertex in some cases. \n", "\n", "In other cases, the ```__init__``` method copies the relevant globals from A-Z to their lowercase internal counterparts, or copies Oi - Zi in the case of the icosahedron, these being the icosahedrally arranged correlates of the cuboctahedron's O-Z." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Experimenting with translation: create a new Tetrahedron object (canonically sized) and move it to the center of a neighboring CCP position, i.e. to the center of a tangent CCP ball relative the ball at the origin." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[Edge from ivm_vector(a=3, b=1, c=1, d=0) to ivm_vector(a=1, b=0, c=0, d=0),\n", " Edge from ivm_vector(a=3, b=1, c=1, d=0) to ivm_vector(a=2, b=1, c=2, d=0),\n", " Edge from ivm_vector(a=3, b=1, c=1, d=0) to ivm_vector(a=2, b=2, c=1, d=0),\n", " Edge from ivm_vector(a=2, b=1, c=2, d=0) to ivm_vector(a=1, b=0, c=0, d=0),\n", " Edge from ivm_vector(a=2, b=2, c=1, d=0) to ivm_vector(a=2, b=1, c=2, d=0),\n", " Edge from ivm_vector(a=2, b=2, c=1, d=0) to ivm_vector(a=1, b=0, c=0, d=0)]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t = Tetrahedron()\n", "t2 = t + Qvector((2,1,1,0))\n", "t2.vertexes\n", "t2.edges" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Scene Description Language (POV-Ray)\n", "\n", "Since POV-Ray Scene Description Language is a whole world unto itself, much like VRML (Virtual Reality Markup Language), why not provide direct access to the header, so the end user, any reader of this Notebook, is empowered to play with lighting, camera position, available texturing libraries.\n", "\n", "Some of the POV-Ray figures rendered in this Notebook will have alternative viewing angles, base on changes to the camera code:\n", "\n", "```\n", "// perspective (default) camera\n", "camera {\n", " location <4, 0.1, 0.2>\n", " rotate <45, 45, 0.0>\n", " look_at <0.0, 0.0, 0.0>\n", " right x*image_width/image_height\n", "}\n", "```\n", "\n", "Our project is not about recreating the capable POV-Ray GUI in some alternative Python compatible GUI widget kit. That could be fun to undertake, but we're just using povray at the command line, from within the bash shell (orginally on Mac OSX). Something similar works on Windows, or on Linux (including on a Pi, where POV-Ray may be successfully compiled)." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "pov_header = \\\n", "\"\"\"\n", "// Persistence of Vision Ray Tracer Scene Description File\n", "// File: xyz.pov\n", "// Vers: 3.6\n", "// Desc: test file\n", "// Date: Sat Sep 7 09:49:33 2019\n", "// Auth: me\n", "// ==== Standard POV-Ray Includes ====\n", "#include \"colors.inc\" // Standard Color definitions\n", "// include \"textures.inc\" // Standard Texture definitions\n", "// include \"functions.inc\" // internal functions usable in user defined functions\n", "\n", "// ==== Additional Includes ====\n", "// Don't have all of the following included at once, it'll cost memory and time\n", "// to parse!\n", "// --- general include files ---\n", "// include \"chars.inc\" // A complete library of character objects, by Ken Maeno\n", "// include \"skies.inc\" // Ready defined sky spheres\n", "// include \"stars.inc\" // Some star fields\n", "// include \"strings.inc\" // macros for generating and manipulating text strings\n", "\n", "// --- textures ---\n", "// include \"finish.inc\" // Some basic finishes\n", "// include \"glass.inc\" // Glass textures/interiors\n", "// include \"golds.inc\" // Gold textures\n", "// include \"metals.inc\" // Metallic pigments, finishes, and textures\n", "// include \"stones.inc\" // Binding include-file for STONES1 and STONES2\n", "// include \"stones1.inc\" // Great stone-textures created by Mike Miller\n", "// include \"stones2.inc\" // More, done by Dan Farmer and Paul Novak\n", "// include \"woodmaps.inc\" // Basic wooden colormaps\n", "// include \"woods.inc\" // Great wooden textures created by Dan Farmer and Paul Novak\n", "\n", "global_settings {assumed_gamma 1.0}\n", "global_settings {ambient_light rgb<1, 1, 1> }\n", "\n", "// perspective (default) camera\n", "camera {\n", " location <4, 0.1, 0.2>\n", "// rotate <45, 45, 0.0>\n", " look_at <0.0, 0.0, 0.0>\n", " right x*image_width/image_height\n", "}\n", "\n", "// create a regular point light source\n", "light_source {\n", " 0*x // light's position (translated below)\n", " color rgb <1,1,1> // light's color\n", " translate <-20, 15, 10>\n", "}\n", "\n", "// create a regular point light source\n", "light_source {\n", " 0*x // light's position (translated below)\n", " color rgb <1,1,1> // light's color\n", " translate <20, -15, -10>\n", "}\n", "\n", "background { color rgb <1.0, 1.0, 1.0> }\n", "\"\"\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, lets rewrite the functions left as stubs above. Our ```draw_poly``` function cycles through all of these in concert.\n", "\n", "As we're mainly concerned with polyhedrons in wireframe view (with \"wires\" as thick or thin as we set their radii), no work was expended on face rendering." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def draw_vert(v, c, r, t): \n", " v = v.xyz\n", " x,y,z = v.x, v.y, v.z\n", " data = \"< %s, %s, %s >\" % (x,y,z), r, c \n", " template = (\"sphere { %s, %s texture \"\n", " \"{ pigment { color %s } } no_shadow }\") \n", " print(template % data, file=t)\n", "\n", "def draw_face(f, c, t): pass\n", "\n", "def draw_edge(e, c, r, t): \n", " v = e.v0.xyz\n", " v0 = \"< %s, %s, %s >\" % (v.x, v.y, v.z) \n", " v = e.v1.xyz\n", " v1 = \"< %s, %s, %s >\" % (v.x, v.y, v.z) \n", " data = (v0, v1, r, c)\n", " template = (\"cylinder { %s, %s, %s texture \"\n", " \"{pigment { color %s } } no_shadow }\")\n", " print(template % data, file=t)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "with open(\"demo.pov\", \"w\") as target:\n", " target.write(pov_header)\n", " cube = Cube()\n", " octa = Octahedron()\n", " rd = RD()\n", " draw_poly(cube, target)\n", " draw_poly(octa, target)\n", " draw_poly(rd, target)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![](demo.png)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "with open(\"testme.pov\", \"w\") as target:\n", " target.write(pov_header)\n", " cube = Cube() * 2\n", " tetra = Tetrahedron() * 2\n", " invtetra = InvTetrahedron() * 2\n", " draw_poly(cube, target)\n", " draw_poly(tetra, target)\n", " draw_poly(invtetra, target)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![](testme.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Further Reading\n", "\n", "[Silicon Forest Curriculum](https://medium.com/@kirbyurner/a-silicon-forest-curriculum-in-context-71d6dd5621b1)\n", "\n", "[Polyhedrons 101](https://github.com/4dsolutions/Python5/blob/master/Polyhedrons%20101.ipynb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## APPENDIX: Additional Source Code and Renderings\n", "\n", "Below are those 12 quadrays to nearest CCP neighbors around the origin. All 26 A-Z reference points are similarly integral (and positive in canonical form).\n", "\n", "By means of translation, we may conjure a cube at the origin, clone it around, and put some other figure inside each, appropriately scaled.\n", "\n", "A sphere in particular may be:\n", "\n", "* tangent to the reference cube's six faces\n", "* tangent to the reference cube's 12 mid-edges (high water mark)\n", "* internal to the cube (shrinking)\n", "* bulging from the cube (growing)\n", "\n", "Now mentaly replace each sphere with a compression island, perhaps an icosahedron, and you're ready to weave some Flextegrity!" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{(1, 0, 1, 2), (2, 1, 1, 0), (1, 1, 2, 0), (0, 1, 2, 1), (1, 0, 2, 1), (1, 2, 0, 1), (2, 1, 0, 1), (2, 0, 1, 1), (1, 1, 0, 2), (1, 2, 1, 0), (0, 2, 1, 1), (0, 1, 1, 2)}\n" ] } ], "source": [ "from itertools import permutations\n", "g = permutations((2,1,1,0))\n", "unique = {p for p in g} # set comprehension\n", "print(unique)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![cubocta](https://upload.wikimedia.org/wikipedia/commons/d/dc/Povlabels.gif)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "class Cuboctahedron (Polyhedron):\n", "\n", " def __init__(self):\n", " # 8 vertices\n", " self.edge_color = \"rgb <1, 1, 0>\"\n", " self.edge_radius= 0.03\n", " self.vert_color = \"rgb <1, 1, 0>\"\n", " self.vert_radius= 0.03\n", " self.face_color = \"rgb <0, 0, 0>\"\n", "\n", " self.vertexes = dict(o = O,\n", " p = P,\n", " q = Q,\n", " r = R,\n", " s = S,\n", " t = T,\n", " u = U,\n", " v = V,\n", " w = W,\n", " x = X,\n", " y = Y,\n", " z = Z)\n", " self.name = \"Cuboctahedron\"\n", " self.volume = 20\n", " self.center = ORIGIN\n", " \n", " # 6 faces\n", " self.faces = (('o','w','s','z'),('z','p','y','t'),\n", " ('t','v','u','s'),('w','q','x','u'),\n", " ('o','p','r','q'),('r','y','v','x'),\n", " ('z','s','t'),('t','y','v'),\n", " ('y','p','r'),('r','q','x'),\n", " ('x','u','v'),('u','s','w'),\n", " ('w','q','o'),('o','z','p'))\n", "\n", " self.edges = self._distill()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "def twelve_around_one(p):\n", " twelve = [ ]\n", " for v in unique:\n", " trans_vector = Qvector(v)\n", " twelve.append(p + trans_vector)\n", " return twelve" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "with open(\"cubocta.pov\", \"w\") as target:\n", " target.write(pov_header) \n", " cubocta = Cuboctahedron()\n", " cube = Cube()\n", " draw_poly(cubocta, target)\n", " for c in twelve_around_one(cube):\n", " draw_poly(c, target)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![ ](cubocta.png)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "with open(\"sphere_pack.pov\", \"w\") as target:\n", " target.write(pov_header)\n", " cube = Cube()\n", " rd = RD()\n", " cubocta = Cuboctahedron()\n", " draw_poly(cube, target)\n", " draw_poly(rd, target)\n", " for p in twelve_around_one(cube):\n", " draw_poly(p, target)\n", " for p in twelve_around_one(rd):\n", " draw_poly(p, target)\n", " cubocta.vert_radius = Qvector((2,1,1,0)).length()/2 # grow the balls\n", " cubocta.vert_color = \"rgb <1,0,0>\"\n", " draw_poly(cubocta, target, v=True, e=False)\n", " draw_vert(Qvector((0,0,0,0)), c=cubocta.vert_color, \n", " r=cubocta.vert_radius, t=target)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "# !/usr/local/bin/povray +A +H768 +W1024 sphere_pack.pov" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![ ](sphere_pack.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![](anim2.gif)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "sm_radius = (A-F).length()/2" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "with open(\"smaller_sphere_pack.pov\", \"w\") as target:\n", " target.write(pov_header) \n", " c = Cube()\n", " draw_poly(c, target)\n", " for c in twelve_around_one(c):\n", " draw_poly(c, target)\n", " cubocta.vert_radius = sm_radius\n", " cubocta.vert_color = \"rgb <1,0,0>\"\n", " draw_poly(cubocta, target, v=True, e=False)\n", " draw_vert(Qvector((0,0,0,0)), c=cubocta.vert_color, \n", " r=cubocta.vert_radius, t=target)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![ ](smaller_sphere_pack.png)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "class Icosahedron (Polyhedron):\n", "\n", " def __init__(self):\n", " # 8 vertices\n", " self.edge_color = \"rgb <0, 1, 1>\"\n", " self.edge_radius= 0.03\n", " self.vert_color = \"rgb <0, 1, 1>\"\n", " self.vert_radius= 0.03\n", " self.face_color = \"rgb <0, 0, 0>\"\n", "\n", " self.vertexes = dict(o = Oi,\n", " p = Pi,\n", " q = Qi,\n", " r = Ri,\n", " s = Si,\n", " t = Ti,\n", " u = Ui,\n", " v = Vi,\n", " w = Wi,\n", " x = Xi,\n", " y = Yi,\n", " z = Zi)\n", " \n", " self.name = \"Icosahedron\"\n", " self.volume = 18.51\n", " self.center = ORIGIN\n", " # 20 faces\n", " # OPPOSITE DIAGONALS of cubocta\n", " # ZY WX\n", " # RV OS\n", " # TU PQ\n", " self.faces = (('o','w','s'),('o','z','s'),\n", " ('z','p','y'),('z','t','y'),\n", " ('t','v','u'),('t','s','u'),\n", " ('w','q','x'),('w','u','x'),\n", " ('p','o','q'),('p','r','q'),\n", " ('r','y','v'),('r','x','v'),\n", " ('z','s','t'),('t','y','v'),\n", " ('y','p','r'),('r','q','x'),\n", " ('x','u','v'),('u','s','w'),\n", " ('w','q','o'),('o','z','p'))\n", "\n", " self.edges = self._distill()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![cubocta](https://upload.wikimedia.org/wikipedia/commons/d/dc/Povlabels.gif)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "ico = Icosahedron()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "with open(\"jitterbug.pov\", \"w\") as target:\n", " target.write(pov_header) \n", " c = Cube()\n", " ico = Icosahedron() * (1/PHI * math.sqrt(2)/2)\n", " draw_poly(c, target, f=False)\n", " draw_poly(ico, target, f=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![icosa](jitterbug.png)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "with open(\"flextegrity.pov\", \"w\") as target:\n", " target.write(pov_header) \n", " cube = Cube()\n", " draw_poly(cube, target)\n", " for c in twelve_around_one(cube):\n", " draw_poly(c, target, f=False)\n", " ico = Icosahedron() * (1/PHI * math.sqrt(2)/2) * 0.7\n", " draw_poly(ico, target)\n", " for ik in twelve_around_one(ico):\n", " draw_poly(ik, target)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![](flextegrity.png)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "class Struts(Polyhedron):\n", " \n", " def __init__(self, c=None, ico=None, suppress=False):\n", "\n", " self.edge_color = \"rgb <1, 0, 0>\"\n", " self.edge_radius= 0.02\n", " self.vert_color = \"rgb <1, 0, 0>\"\n", " self.vert_radius= 0.02\n", " self.face_color = \"rgb <0, 0, 0>\"\n", " self.suppress = suppress\n", " \n", " if not c and not ico:\n", " c = Cube()\n", " ico = Icosahedron()\n", " \n", " self.vertexes = dict(\n", " # cube mid-edges\n", " af = (c.vertexes['a'] + c.vertexes['f'])/2,\n", " ag = (c.vertexes['a'] + c.vertexes['g'])/2,\n", " ah = (c.vertexes['a'] + c.vertexes['h'])/2,\n", " be = (c.vertexes['b'] + c.vertexes['e'])/2,\n", " bh = (c.vertexes['b'] + c.vertexes['h'])/2,\n", " bg = (c.vertexes['b'] + c.vertexes['g'])/2,\n", " ce = (c.vertexes['c'] + c.vertexes['e'])/2,\n", " cf = (c.vertexes['c'] + c.vertexes['f'])/2,\n", " ch = (c.vertexes['c'] + c.vertexes['h'])/2,\n", " de = (c.vertexes['d'] + c.vertexes['e'])/2,\n", " df = (c.vertexes['d'] + c.vertexes['f'])/2,\n", " dg = (c.vertexes['d'] + c.vertexes['g'])/2,\n", " # icosa mid-edges\n", " # OPPOSITE DIAGONALS of cubocta\n", " # ZY WX\n", " # RV OS\n", " # TU PQ\n", " os = (ico.vertexes['o'] + ico.vertexes['s'])/2,\n", " pq = (ico.vertexes['p'] + ico.vertexes['q'])/2,\n", " rv = (ico.vertexes['r'] + ico.vertexes['v'])/2,\n", " tu = (ico.vertexes['t'] + ico.vertexes['u'])/2,\n", " wx = (ico.vertexes['w'] + ico.vertexes['x'])/2,\n", " yz = (ico.vertexes['y'] + ico.vertexes['z'])/2\n", " )\n", "\n", " self.name = 'struts'\n", " self.center = ico.center\n", " \n", " self.faces = (('os', 'af'), ('os', 'ch'),\n", " ('rv', 'be'), ('rv', 'dg'), \n", " ('tu', 'cf'), ('tu', 'de'),\n", " ('pq', 'ah'), ('pq', 'bg'),\n", " ('yz', 'ag'), ('yz', 'df'),\n", " ('wx', 'bh'), ('wx', 'ce')) \n", "\n", " if self.suppress:\n", " self.faces = self._suppress()\n", " \n", " self.edges = self._distill()\n", " \n", " def _suppress(self):\n", " \"\"\"\n", " A global IVM of integral Qray positions is expected for \n", " the suppress feature to work. This could be an n-frequency\n", " cuboctahedron or perhaps a layered tetrahedron of half-\n", " octahedron of balls.\n", " \"\"\"\n", " global IVM\n", " keep = []\n", " # print(\"Suppressing disconnected edges\")\n", " for f in self.faces:\n", " # print(f, self.center)\n", " neighbor = self.center + eval(f[1][0].upper()) + eval(f[1][1].upper())\n", " # print(\"Neighbor=\", neighbor)\n", " for layer in IVM:\n", " if neighbor in IVM[layer]:\n", " # print(\"Bing!\")\n", " keep.append(f)\n", " break\n", " else:\n", " pass\n", " # print(\"Not found\")\n", " return keep " ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "with open(\"test_struts.pov\", \"w\") as target:\n", " target.write(pov_header) \n", " ico = Icosahedron() * 0.6\n", " cube= Cube() * PHI * 1.5\n", " s = Struts(cube, ico)\n", " draw_poly(ico, target)\n", " draw_poly(cube, target)\n", " draw_poly(s, target)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![](test_struts.png)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "with open(\"test_struts2.pov\", \"w\") as target:\n", " target.write(pov_header) \n", " ico = Icosahedron() * 1.2\n", " cube= Cube() * PHI * 1.5\n", " s = Struts(cube, ico)\n", " draw_poly(ico, target)\n", " draw_poly(cube, target)\n", " draw_poly(s, target)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![](test_struts2.png)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "with open(\"flextegrity2.pov\", \"w\") as target:\n", " target.write(pov_header) \n", " c = Cube()\n", " ico = Icosahedron() * (1/PHI * math.sqrt(2)/2)\n", " st = Struts(c, ico)\n", " draw_poly(ico, target)\n", " draw_poly(st, target)\n", " for ik in twelve_around_one(ico):\n", " draw_poly(ik, target)\n", " for s in twelve_around_one(st):\n", " draw_poly(s, target)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![](flextegrity2.png)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "with open(\"flextegrity3.pov\", \"w\") as target:\n", " target.write(pov_header) \n", " c = Cube()\n", " ico = Icosahedron() * (1/PHI * math.sqrt(2)/2) * 1.1 # a little outside reference cube\n", " st = Struts(c, ico)\n", " draw_poly(ico, target)\n", " draw_poly(st, target)\n", " for ik in twelve_around_one(ico):\n", " draw_poly(ik, target)\n", " for s in twelve_around_one(st):\n", " draw_poly(s, target)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![](flextegrity3.png)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "with open(\"flextegrity4.pov\", \"w\") as target:\n", " target.write(pov_header) \n", " c = Cube()\n", " ico = Icosahedron() * (1/PHI * math.sqrt(2)/2) * 0.6 # a little inside reference cube\n", " st = Struts(c, ico)\n", " draw_poly(ico, target)\n", " draw_poly(st, target)\n", " for ik in twelve_around_one(ico):\n", " draw_poly(ik, target)\n", " for s in twelve_around_one(st):\n", " draw_poly(s, target)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![](flextegrity4.png)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "import os\n", "import numpy as np\n", "\n", "def animation(targdir=\"anim\"):\n", " \n", " path = os.path.join(\".\",targdir)\n", " if not os.path.isdir(targdir):\n", " os.mkdir(targdir)\n", " \n", " radii = np.linspace(1.2, 0.8, 8).tolist()\n", " radii += reversed(radii[1:-1])\n", " for frame_id, radius in enumerate(radii, start=1):\n", " filename = f\"flextegrity{frame_id:03}.pov\"\n", "\n", " with open(os.path.join(path,filename), \"w\") as target:\n", " target.write(pov_header) \n", " cube = Cube()\n", " ico = Icosahedron() * (1/PHI * math.sqrt(2)/2) * radius \n", " st = Struts(cube, ico)\n", " draw_poly(ico, target)\n", " draw_poly(st, target)\n", " draw_poly(cube, target)\n", " for ik in twelve_around_one(ico):\n", " draw_poly(ik, target)\n", " for c in twelve_around_one(cube):\n", " draw_poly(c, target)\n", " for s in twelve_around_one(st):\n", " draw_poly(s, target)\n", " \n", "animation()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![animated](anim.gif)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/Users/mac/opt/anaconda3/envs/new_world/lib/python3.9/site-packages/PIL/__init__.py\n", "786432\n", "(768, 1024)\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from PIL import Image # Image is a module!\n", "import PIL\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from matplotlib.pyplot import imshow\n", " \n", "im = Image.open(\"flextegrity.png\")\n", "data = np.array(im)\n", "\n", "print(PIL.__file__)\n", "\n", "layer = data[:,:,2] # grab a single layer\n", "print(layer.size)\n", "print(layer.shape)\n", "\n", "%matplotlib inline\n", "# each color band has 8-bit values\n", "plt.gca().axes.get_yaxis().set_visible(False)\n", "plt.gca().axes.get_xaxis().set_visible(False)\n", "imshow(layer, cmap='gray', vmin=0, vmax=255);" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Processing... /usr/local/bin/povray +A +H768 +W1024 ./balls001.pov\n", "Processing... /usr/local/bin/povray +A +H768 +W1024 ./balls002.pov\n", "Processing... /usr/local/bin/povray +A +H768 +W1024 ./balls003.pov\n", "Processing... /usr/local/bin/povray +A +H768 +W1024 ./balls004.pov\n", "Processing... /usr/local/bin/povray +A +H768 +W1024 ./balls005.pov\n", "Processing... /usr/local/bin/povray +A +H768 +W1024 ./balls006.pov\n", "Processing... /usr/local/bin/povray +A +H768 +W1024 ./balls007.pov\n", "Processing... /usr/local/bin/povray +A +H768 +W1024 ./balls008.pov\n", "Processing... /usr/local/bin/povray +A +H768 +W1024 ./balls009.pov\n", "Processing... /usr/local/bin/povray +A +H768 +W1024 ./balls010.pov\n", "Processing... /usr/local/bin/povray +A +H768 +W1024 ./balls011.pov\n", "Processing... /usr/local/bin/povray +A +H768 +W1024 ./balls012.pov\n", "Processing... /usr/local/bin/povray +A +H768 +W1024 ./balls013.pov\n", "Processing... /usr/local/bin/povray +A +H768 +W1024 ./balls014.pov\n", "Processing... /usr/local/bin/povray +A +H768 +W1024 ./demo.pov\n" ] } ], "source": [ "import os\n", "os.chdir('/Users/mac/Documents/School_of_Tomorrow/anim4')\n", "files = sorted([fname for fname in os.listdir(\".\") if \".pov\" in fname])\n", "for f in files:\n", " cmd = \"/usr/local/bin/povray +A +H768 +W1024 ./{}\".format(f)\n", " print(\"Processing...\", cmd)\n", " # output = os.system(cmd) # <-- uncomment for actual frame generation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Bonus Features" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "image/jpeg": "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gMbsnV27VK5IyN6IptPx5+RJs+kH0qrjTDXgtuuByWHFmo4udBJ8AO4LGzVGExlhInCQplJgqghtSmwDW5wEnsCnbk57nKoRXBqIDWF2cKr0NZTUfXrOMBpAH+5xMKdb3XKQBPeqzR1tu2O0UyPbcHAjMObBWWR1JHqezcSngyKT/E1GywqWhowq4Efj2dqkEFjhxkgjKoMCO+FCtDRVpU6rhg8C945/NX2nre0ODGta6GguJzg7PBaatzi91FQb4knTX7GNW21TT4upDwYLag1xt1FaNDW1lA1HunIgAf7jrUezmQeLJuHNuqdoUS4A4yZMyASprajNZpa9d7osLZpSraTdGDDkBr/nzgtjtDup0HVHm678IzJJ2rRY9K8Q0uayne13gZ/db3aWfaWgvaGtYZw14YfNVrwbOUXFzm7fZEOzV3Gm8Zupvc0g64OH5KdUsL2Btak4tkSHt7dRCotE2q/aauypLtxw/dWj7fWFLkzCGgEy4nGCZj91EZaomnU4I4M8lLZ0pL68r7mT9JVONv1QA6C28MjIiewrxjhzudzpy7IGOxKLQblN72kvkAnIwJMlaqlkdSceLjtbMjwV9uxxzc2rl379iRRsVR1EVajoptHMB144QPmtJLuM5sZYz3heU698BrnOJYMGu1dy2Wa0MpWtj6joY1rie0xgI1lOFZdJZciittuWWVn0bVqm/Uce92fgNSgabrUubRoG85p57u3KJ3ry36Wq2o3GA06Zwuj2nd/8BQatM03cXEEEAjYqq2bTcI2obvu2e2eyycTJ2rpdB2ED709zfmVX0m8bVa082+YHYAJgeAXTsYGgACAMAom6VF+jxOc3kfC4MkRFkeuEREAREQBERAEREAREQBU+k/enu+SuFT6T96e75IDfYPdN861IUewe6b51qSgIVvzb4/JWoVVb82+PyVqEAREQBERAEREAREQBERAEREAREQBERAFxuln/AP5GpRMltVoc3sIbj+y7JVdq0IyrbKVqLyDTEXQMDnr8Utp2g4QyRlCfdfn2OUY4tr072N1wBnW04K1tlCmKruKMgYT8p1rdpbRYFQOAlueH7KutlN90xzGxjguheT5zImv7bW98/wA8kV/MxDSZzIWqm1j3c+oJ1BwICg09KFp+7YXdkfIKyoX64v1KLaeOAII8RKopxk6R1ZOjy4Ia8ipfNX9j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\n", "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import YouTubeVideo\n", "YouTubeVideo(\"NLSBdkEVqXU\") " ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "image/jpeg": "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\n", "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import YouTubeVideo\n", "YouTubeVideo(\"E_UUvDT2Fxk\") " ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9.12" } }, "nbformat": 4, "nbformat_minor": 4 }