{ "cells": [ { "cell_type": "markdown", "id": "5ed38757-aa0e-4a6c-b79a-83990a88d540", "metadata": {}, "source": [ "[![nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/4dsolutions/School_of_Tomorrow/blob/master/Schemata.ipynb)" ] }, { "cell_type": "markdown", "id": "624691e9-27e6-462a-8363-02848eeee7db", "metadata": {}, "source": [ "## M4W Project (Math for Wisdom)" ] }, { "cell_type": "markdown", "id": "211dd3d1-01f3-4fbb-abbb-8abda7de8953", "metadata": {}, "source": [ "\"Screen\n", "\n", "Uber Dynkin Diagram by [Andrius Kulikauskas](https://www.math4wisdom.com/) using the cloud-based drafting tool [math3d.org](math3d.org)." ] }, { "cell_type": "markdown", "id": "cb9614c4-cf29-4c92-8ec6-fda8ebc14dcb", "metadata": {}, "source": [ "## XYZ versus IVM coordinate systems\n", "\n", "Let's agree that how we relate IVM and XYZ coordinates is somewhat by convention. I would argue that if our purpose is to stay within Synergetics, then some conventions make more sense than others.\n", "\n", "Here's what I've come to:\n", "\n", "Consider the [8 octants of XYZ](https://mathworld.wolfram.com/Octant.html), i.e. we can label them by which XYZ basis vectors i,j,k are positive and which negative, to reach points deep inside each of them. " ] }, { "cell_type": "markdown", "id": "0e899002-08e5-4e5c-947e-df5e18c232e7", "metadata": {}, "source": [ "We have (+, +, +) (+, +, -)(+, -, +)(-, +, +), (+, -, -), (-, +, -), (-, -, +), (-, -, -), i.e. eight combos in total. $2^{3}$. That's XYZ. \n", "\n", "In the case of Quadrays, we speak of four quadrants and distinguish them in terms of which basis vector is not needed i.e. at least one vector is 0 -- the vector pointing away from the quadrant we're in, when addressing some arbitrary point in space.\n", "\n", "The tetrahedron's four quadrays splay apart from one another at the origin (0,0,0,0) at an angle of about 109.47 degrees. We may think of any two of them as forming a pair of \"rabbit ears\"." ] }, { "cell_type": "markdown", "id": "9e5d8863-88f7-4805-9044-a7d2af33ae71", "metadata": {}, "source": [ "\"rabbit_ears\"/" ] }, { "cell_type": "markdown", "id": "67cd8938-a27f-4d53-b07f-d77d6ee85d27", "metadata": {}, "source": [ "\"Quadray" ] }, { "cell_type": "code", "execution_count": 1, "id": "45ef9520-3fde-4cb6-ac14-06fbeee7e129", "metadata": {}, "outputs": [], "source": [ "import qrays, itertools\n", "from qrays import Qvector, Vector\n", "perm = itertools.permutations" ] }, { "cell_type": "code", "execution_count": 2, "id": "6c20c8c5-b0b3-4ff5-b186-1d5a468b48b4", "metadata": {}, "outputs": [], "source": [ "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))" ] }, { "cell_type": "code", "execution_count": 3, "id": "e1a769f5-f84d-44d8-9914-1f09b21ca10e", "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle 109.471220634491$" ], "text/plain": [ "109.471220634491" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a.angle(b)" ] }, { "cell_type": "code", "execution_count": 4, "id": "c7bccd1f-1baf-4d6b-8b4c-8efec414cbb4", "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle 109.471220634491$" ], "text/plain": [ "109.471220634491" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b.angle(c)" ] }, { "cell_type": "markdown", "id": "49dcd9e9-8983-42f5-a93c-5f3b0fc38e29", "metadata": {}, "source": [ "My focus is on the cube's six face diagonals. The cube has one corner in each octant of XYZ and I'm making sure my (1,0,0,0) corresponds to a corner in the all-positive octant. I want the edges of my tetrahedron (cube face diagonals) to be 1, so the cube edges are sqrt(2)/2.\n", "\n" ] }, { "cell_type": "code", "execution_count": 5, "id": "ef75646c-a179-4984-b460-84ac30dcac0a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "xyz_vector(x=0.25*sqrt(2), y=0.25*sqrt(2), z=0.25*sqrt(2))" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a.xyz" ] }, { "cell_type": "code", "execution_count": 6, "id": "9137b4c1-37ab-41d5-84c3-a1303b47963d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "xyz_vector(x=-0.25*sqrt(2), y=-0.25*sqrt(2), z=0.25*sqrt(2))" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b.xyz" ] }, { "cell_type": "markdown", "id": "461b1c57-dca1-4033-9e6c-ea3e6720c8e5", "metadata": {}, "source": [ "The XYZ coordinates of quadray (1,0,0,0):" ] }, { "cell_type": "code", "execution_count": 7, "id": "b65c08a5-a15b-4b45-a873-417e62d4d363", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.353553390593274, 0.353553390593274, 0.353553390593274)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a.xyz.x.evalf(), a.xyz.y.evalf(), a.xyz.z.evalf()" ] }, { "cell_type": "markdown", "id": "c42d5582-dc6e-4650-8e63-e7e0085a11e7", "metadata": {}, "source": [ "\"quadrays\"/" ] }, { "cell_type": "markdown", "id": "9904cdd8-25b6-4312-919a-97aef667a83c", "metadata": {}, "source": [ "To connect back to the topic of cube's 12 mid-edges, per the four mutually intersecting hexagons we've been playing with, that's where I'm defining \"the 12 sphere centers around a central sphere\" as linear combinations of the four quadrays in question. " ] }, { "cell_type": "code", "execution_count": 8, "id": "ed2c0f10-43ea-44a9-bf6a-e0a50f2bbabd", "metadata": {}, "outputs": [], "source": [ "perm = itertools.permutations" ] }, { "cell_type": "code", "execution_count": 9, "id": "a5b9c4e6-d141-4f3d-9760-7f3ef24bce7c", "metadata": {}, "outputs": [], "source": [ "midpoints = {p for p in perm([2,1,1,0],4)}" ] }, { "cell_type": "code", "execution_count": 10, "id": "c1fea909-3b96-4605-a9fd-f67fe74fedb3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{(0, 1, 1, 2),\n", " (0, 1, 2, 1),\n", " (0, 2, 1, 1),\n", " (1, 0, 1, 2),\n", " (1, 0, 2, 1),\n", " (1, 1, 0, 2),\n", " (1, 1, 2, 0),\n", " (1, 2, 0, 1),\n", " (1, 2, 1, 0),\n", " (2, 0, 1, 1),\n", " (2, 1, 0, 1),\n", " (2, 1, 1, 0)}" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "midpoints" ] }, { "cell_type": "code", "execution_count": 11, "id": "6c7e5006-6448-458c-bd12-73fb71646ff9", "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle 0.25 \\sqrt{2}$" ], "text/plain": [ "0.25*sqrt(2)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a.xyz.x" ] }, { "cell_type": "code", "execution_count": 12, "id": "cfa1adf1-db1c-4628-a23c-df3ce2befcc3", "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle 0.353553390593274$" ], "text/plain": [ "0.353553390593274" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a.xyz.x.evalf()" ] }, { "cell_type": "code", "execution_count": 13, "id": "8d747753-74f5-4fc9-ba3f-5e5c0b0c2dcf", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "( 0.7071, 0.0000, -0.7071)\n", "( 0.0000, 0.7071, 0.7071)\n", "(-0.7071, 0.7071, 0.0000)\n", "(-0.7071, 0.0000, -0.7071)\n", "( 0.0000, 0.7071, -0.7071)\n", "( 0.0000, -0.7071, 0.7071)\n", "( 0.7071, 0.0000, 0.7071)\n", "( 0.7071, 0.7071, 0.0000)\n", "( 0.7071, -0.7071, 0.0000)\n", "(-0.7071, 0.0000, 0.7071)\n", "(-0.7071, -0.7071, 0.0000)\n", "( 0.0000, -0.7071, -0.7071)\n" ] } ], "source": [ "for v in midpoints:\n", " vec=Qvector(v)\n", " print(f\"({float(vec.xyz.x.evalf()):7.4f}, \"\n", " f\"{float(vec.xyz.y.evalf()):7.4f}, \"\n", " f\"{float(vec.xyz.z.evalf()):7.4f})\")" ] }, { "cell_type": "markdown", "id": "40144f1b-d154-4bd7-8868-cba206a384ff", "metadata": {}, "source": [ "So now we're ready to make hops in any of those 12 directions, from sphere to sphere, and stay with whole number non-negative coordinates. This is the CCP ocean, with 12 spheres around 1.\n", "\n", "Give me any four points in space and I can return its tetra-volume using a variant of the Caley-Menger determinant formula. The six edges of the tetrahedron are lowercase a..f while those same lengths to the 2nd power will be A... F.\n", "\n", "
\n", "\n", "\n", "$$\n", "V_{ivm} = (1/16) \n", "\\begin{vmatrix}\n", "0&1&1&1&1\\\\\n", "1&0&A&B&C\\\\\n", "1&A&0&D&F\\\\\n", "1&B&D&0&E\\\\\n", "1&C&F&E&0\\\\\n", "\\end{vmatrix}^{(1/2)}\n", "$$\n", "\n", "
" ] }, { "cell_type": "code", "execution_count": 14, "id": "9078742f-8cf4-46b6-bbf0-de5d1d8f2f86", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import math\n", "\n", "def CM_ivm(a, b, c, d, e, f):\n", " # double and 2nd power us\n", " A,B,C,D,E,F = [(2*x)**2 for x in (a,b,c,d,e,f)]\n", " \n", " # Construct a 5x5 matrix per Caley-Menger\n", " M = np.ones((5,5))\n", " M[0,0:5] = 0, 1, 1, 1, 1\n", " M[1,0:5] = 1, 0, A, B, C\n", " M[2,0:5] = 1, A, 0, D, F\n", " M[3,0:5] = 1, B, D, 0, E\n", " M[4,0:5] = 1, C, F, E, 0\n", " print(M) # comment out?\n", " return round(math.sqrt(np.linalg.det(M))/16, 4) # Syn3 factored in " ] }, { "cell_type": "code", "execution_count": 15, "id": "bdfc198a-9e74-4da7-9fcd-c3b0b300a7df", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0. 1. 1. 1. 1.]\n", " [1. 0. 4. 4. 4.]\n", " [1. 4. 0. 4. 4.]\n", " [1. 4. 4. 0. 4.]\n", " [1. 4. 4. 4. 0.]]\n" ] }, { "data": { "text/plain": [ "1.0" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "CM_ivm(1,1,1,1,1,1)" ] }, { "cell_type": "markdown", "id": "e46e428f-add4-4b12-9c45-fbac809c8d58", "metadata": {}, "source": [ "\n", "There's another algorithm that makes more sense to share at this juncture, since we're talking about Quadrays in particular.\n", "\n", "Here it is:\n", "\n", "$$\n", "V_{ivm} = (1/4) \n", "\\begin{vmatrix}\n", "a0&a1&a2&a3&1\\\\\n", "b0&b1&b2&b3&1\\\\\n", "c0&c1&c2&c3&1\\\\\n", "d0&d1&d2&d3&1\\\\\n", "1&1&1&1&0\\\\\n", "\\end{vmatrix}\n", "$$\n", "
\n", "\n", "\n", "In this one, which I credit to Tom Ace, one of the designers behind Quadrays, the 4-tuple coordinates of the Quadrays themselves serve as inputs, to a determinant. This would not be Caley-Menger." ] }, { "cell_type": "code", "execution_count": 16, "id": "517e8890-d168-484d-9595-d327058307d3", "metadata": {}, "outputs": [], "source": [ "def volume(q0, q1, q2, q3):\n", " \"\"\"\n", " Construct a 5x5 matrix per Tom Ace\n", " \"\"\"\n", " A = np.ones((5,5)) # shape, all 1s except..\n", " A[4,4] = 0 # zero in lower right corner\n", " A[0,0:4] = q0.coords\n", " A[1,0:4] = q1.coords\n", " A[2,0:4] = q2.coords\n", " A[3,0:4] = q3.coords\n", " print(A) # comment out?\n", " return abs(np.linalg.det(A))/4 # that's it!" ] }, { "cell_type": "code", "execution_count": 17, "id": "2fb15eab-62ee-4328-9ba4-cf16abf31710", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1. 0. 0. 0. 1.]\n", " [0. 1. 0. 0. 1.]\n", " [0. 0. 1. 0. 1.]\n", " [0. 0. 0. 1. 1.]\n", " [1. 1. 1. 1. 0.]]\n" ] }, { "data": { "text/plain": [ "1.0" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "volume(a,b,c,d)" ] }, { "cell_type": "code", "execution_count": 18, "id": "a2365988-33cc-40a4-a5e1-5d59ea70a7a2", "metadata": {}, "outputs": [ { "data": { "image/jpeg": "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\n", "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import YouTubeVideo\n", "YouTubeVideo(\"kJYFleyQiGo\")" ] }, { "cell_type": "markdown", "id": "d2e6593a-58c3-4885-af7c-049c087d5cd7", "metadata": {}, "source": [ "## Retro Rockets Demo\n", "\n", "Suppose we're sharing the concept of \"vector addition\". We use \"retro rockets\" that shoot mass exclusively away from the origin. \n", "\n", "In the assembly below we have six thrusters oriented towards the corners of a regular octahedron or, same thing, to the face centers of a surrounding cube (origin at the center).\n", "\n", "The \"amount of thrust\" is the magnitude of a thrust vector, i.e. its length. When it comes to orientation, we have only these six to choose from. But by firing more than one at the same time, we beget a \"vector sum\" that puts one vector tail at the tip of the other.\n", "\n", "Vector addition is commutative:\n", "\n", "$$\n", "\\vec{z} + \\vec{x} + \\vec{y} = \\vec{y} + \\vec{x} + \\vec{z}\n", "$$" ] }, { "cell_type": "markdown", "id": "8b61d785-584f-4789-89fc-959c257c698a", "metadata": {}, "source": [ "\"XYZ" ] }, { "cell_type": "markdown", "id": "9b1b9195-93ce-404d-adf5-ca7554d5d8bc", "metadata": {}, "source": [ "Here's the six rocket assembly on the launch pad, ready to shoot upward vertically when its three downward-aimed thrusters all fire simultaneously." ] }, { "cell_type": "markdown", "id": "1f1576ba-6c52-4c4f-9676-80964a447bd5", "metadata": {}, "source": [ "\"Six" ] }, { "cell_type": "markdown", "id": "59fd38c4-eb57-4037-8977-abb8338f3265", "metadata": {}, "source": [ "In the alternative retro rocket assembly, depicted below, we only have four thrusters, aimed from the origin to the vertices of a regular tetrahedron, or, same thing, to a regular tetrahedron's face centers.\n", "\n", "As above, the \"amount of thrust\" is the magnitude of a thrust vector, i.e. its length. When it comes to orientation, we have only these four to choose from. But by firing more than one at the same time, we beget a \"vector sum\" that puts one vector tail at the tip of the other.\n", "\n", "The order in which vectors are added makes no difference:\n", "\n", "$$\n", "\\vec{d} + \\vec{a} + \\vec{b} + \\vec{c} = \\vec{d} + \\vec{b} + \\vec{a} + \\vec{c}\n", "$$" ] }, { "cell_type": "markdown", "id": "aa3e7e70-5e1a-41c9-97d1-07d5c65f87d2", "metadata": { "tags": [] }, "source": [ "\"IVM" ] }, { "cell_type": "markdown", "id": "0bb7b128-edbe-4c2d-9d4a-0dd0cdcf6bbd", "metadata": {}, "source": [ "Realistically speaking, these retro rockets have finite power, so the magnitude of the vectors is finite also. Within a certain radius, limited by thruster power, a combination of thrusts should, in theory, be able to sum to any point. \n", "\n", "The ship itself (or pod) is then imagined to move precisely opposite the sum total thrust vector, at 180 degrees thereto. In practice, rotation would enter the picture. However this is a thought experiment and we only allow translation, with no change in orientation, in either assembly.\n", "\n", "Both \"ships\" are capable of moving in any linear direction based on their \"thrust pattern\" i.e. based on a linear tip-to-tail addition of six or four rockets respectively. Not all rockets need to fire. Indeed, rockets at 180 degrees to one another need not work against each other." ] }, { "cell_type": "code", "execution_count": 19, "id": "b8756234-692c-467d-b3a3-85b0c43731c1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "xyz_vector(x=0.25*sqrt(2), y=0.25*sqrt(2), z=0.25*sqrt(2))" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a.xyz" ] }, { "cell_type": "code", "execution_count": 20, "id": "776f46f2-03c9-42c4-b279-e9dd0fc4bd4b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "xyz_vector(x=-0.25*sqrt(2), y=-0.25*sqrt(2), z=0.25*sqrt(2))" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b.xyz" ] }, { "cell_type": "code", "execution_count": 21, "id": "9d54588a-a92c-4b68-8e97-d09c8a80d03d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.0" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(a-b).length()" ] }, { "cell_type": "code", "execution_count": 22, "id": "a2a92eee-d3d3-4328-b36a-0f7d8c424d3e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "xyz_vector(x=-0.25*sqrt(2), y=0.25*sqrt(2), z=-0.25*sqrt(2))" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c.xyz" ] }, { "cell_type": "code", "execution_count": 23, "id": "70b9c4f7-b386-4f82-a7cc-49d59ad1cc31", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "xyz_vector(x=0.25*sqrt(2), y=-0.25*sqrt(2), z=-0.25*sqrt(2))" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d.xyz" ] }, { "cell_type": "code", "execution_count": 24, "id": "ec20fa75-ceee-48d3-b5df-495d97059073", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.0 1.0 1.0 1.0 1.0 1.0\n" ] } ], "source": [ "print((a - b).length(),\n", "(a - c).length(),\n", "(a - d).length(),\n", "(b - c).length(),\n", "(c - d).length(),\n", "(d - b).length())" ] }, { "cell_type": "code", "execution_count": 25, "id": "2c52d504-0c14-4979-93a5-9e711816167d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.0\n", "1.0\n", "1.0\n", "1.0\n", "1.0\n", "1.0\n", "1.0\n", "1.0\n", "1.0\n", "1.0\n", "1.0\n", "1.0\n" ] } ], "source": [ "for v in midpoints:\n", " print(Qvector(v).length())" ] }, { "cell_type": "code", "execution_count": 26, "id": "53e8a5a3-05b1-4595-ab1f-75a6c8e28012", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "ivm_vector(a=1, b=0, c=0, d=0)" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a" ] }, { "cell_type": "code", "execution_count": 27, "id": "411a0209-9dd9-4fa3-bcca-38bc5c9c2cda", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "ivm_vector(a=0, b=1, c=1, d=1)" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "-a" ] }, { "cell_type": "code", "execution_count": 28, "id": "84c2698a-a76a-4b17-a33a-530b85a00f85", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "ivm_vector(a=2, b=1, c=1, d=0)" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "q = Qvector((1,0,0,-1))\n", "q" ] }, { "cell_type": "code", "execution_count": 29, "id": "82091a6f-55ca-4813-8e0a-09cf9e8a8b6e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "ivm_vector(a=0, b=1, c=1, d=2)" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "-q" ] }, { "cell_type": "markdown", "id": "1f8173e4-a181-4efc-bc18-57d9912973d1", "metadata": { "tags": [] }, "source": [ "![](https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExYjRlNzNhNzFiODdkOTM4MjE4Y2RjMWQ5ZDk2NDdhODhlN2E0YzRkMyZjdD1n/c9KRe5M6eYiL3zFtrh/giphy.gif)" ] }, { "cell_type": "markdown", "id": "26a6cf53-1ab8-4b82-9465-0fd4f7ba54c1", "metadata": {}, "source": [ "### Synergetics Constant\n", "\n", "Lets stack four balls, with diameter = $1$, radius = $1/2$, in the SCP (simple cubic) arrangement, giving a cube of edges D. The face diagonals of said cube are $\\sqrt{2}$.\n", "\n", "The tetravolume of a tet, with edges $\\sqrt{2}$, is $\\sqrt{2}^{3}$. The corresponding cube would have three times that volume.\n", "\n", "Per convention, the XYZ unit cube has edges R, half the length of the IVM prime vector. The cube we're building therefore consists of 8 such unit cubes for a total volume of 8." ] }, { "cell_type": "markdown", "id": "93665efd-c51b-4100-b09d-fc566e7262d7", "metadata": {}, "source": [ "\n", "If we start with XYZ coordinates $(1/2, 1/2, 1/2)$ for the ball in the 1st octant (+, +, +), with identically sized spheres in the other octants, such that cube edges = 1 = D, then we have the corresponding quadray coordinates.\n" ] }, { "cell_type": "code", "execution_count": 30, "id": "eb25ed3e-ad4d-40cf-a952-16936e2de531", "metadata": {}, "outputs": [], "source": [ "i = j = k = 1/2 # XYZ vectors scaled to 1/2 D = R\n", "\n", "# 8 SCP ball centers = 8 unit cubes centered around the origin\n", "A = Vector(( i, j, k))\n", "B = Vector(( i, j, -k))\n", "C = Vector(( i, -j, k))\n", "D = Vector((-i, j, k))\n", "E = Vector(( i, -j, -k))\n", "F = Vector((-i, j, -k))\n", "G = Vector((-i, -j, k))\n", "H = Vector((-i, -j, -k))" ] }, { "cell_type": "code", "execution_count": 31, "id": "8f8b9305-353c-4966-b7a0-612161605041", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1.414, 0.000, 0.000, 0.000), Length = 0.86602540\n", "(1.414, 0.000, 1.414, 1.414), Length = 0.86602540\n", "(1.414, 1.414, 0.000, 1.414), Length = 0.86602540\n", "(1.414, 1.414, 1.414, 0.000), Length = 0.86602540\n", "(0.000, 0.000, 0.000, 1.414), Length = 0.86602540\n", "(0.000, 0.000, 1.414, 0.000), Length = 0.86602540\n", "(0.000, 1.414, 0.000, 0.000), Length = 0.86602540\n", "(0.000, 1.414, 1.414, 1.414), Length = 0.86602540\n" ] } ], "source": [ "for v in A,B,C,D,E,F,G,H:\n", " qv = v.quadray()\n", " a, b, c, d = [float(x.evalf(4)) for x in [qv.a, qv.b, qv.c, qv.d]]\n", " print(f\"({a:5.3f}, {b:5.3f}, {c:5.3f}, {d:5.3f}), Length = {qv.length():10.8f}\")" ] }, { "cell_type": "markdown", "id": "4487f0ca-6823-4420-861f-dc0e8738cc0b", "metadata": {}, "source": [ "Such a cube has all edges $1$, face diagonals $\\sqrt{2}$ and a body diagonal of $\\sqrt{3}$." ] }, { "cell_type": "markdown", "id": "f3316f6b-598d-44ce-aec1-13e084a9edff", "metadata": {}, "source": [ "The inscribed tetrahedron has edges $\\sqrt{2}$ instead of $1$, the length we would have with a CCP packing. \n", "\n", "Its tetravolume would be $\\sqrt{2}^{3}$." ] }, { "cell_type": "code", "execution_count": 32, "id": "248d54f9-9318-4438-9319-d84d4b60c3c0", "metadata": {}, "outputs": [], "source": [ "big_tetra = pow(2, 1/2) ** 3" ] }, { "cell_type": "markdown", "id": "97d99eee-339c-434b-a8e2-7ecd3e765d41", "metadata": {}, "source": [ "The corresponding cube tetravolume, in which `big_tetra` is inscribed would be three times that." ] }, { "cell_type": "code", "execution_count": 33, "id": "8dc49a96-5e88-4a2c-ba1c-85b1615a1101", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "8.485281374238571" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ivm_big_cube = big_tetra * 3\n", "ivm_big_cube" ] }, { "cell_type": "markdown", "id": "2bb5c1d7-37cc-406a-b252-d67e8d3dfeed", "metadata": {}, "source": [ "The cube's XYZ volume is 8, because we have an R-edged cube in each octant." ] }, { "cell_type": "code", "execution_count": 34, "id": "d6aa1b34-6405-4232-93d2-7b9c5306463b", "metadata": {}, "outputs": [], "source": [ "xyz_big_cube = 8.0" ] }, { "cell_type": "markdown", "id": "9def1597-a1fb-47c2-85ff-0ac61bc7d863", "metadata": {}, "source": [ "The constant S3 is therefore the IVM:XYZ ratio between the two measures." ] }, { "cell_type": "code", "execution_count": 35, "id": "f83eff2e-97d3-4f2a-83a5-11b95cfb54b7", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.0606601717798214" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S3 = ivm_big_cube / xyz_big_cube\n", "S3 # the Synergetics Constant for converting XYZ <--> IVM volume" ] }, { "cell_type": "markdown", "id": "2985832e-cd57-4bc5-b07b-7ec7e17712f3", "metadata": { "tags": [] }, "source": [ "**Related readings:**\n", "\n", "* [M4W Freelists, March, 2023](https://www.freelists.org/archive/math4wisdom/03-2023)\n", "* [The Fano Plane](FanoPlane.ipynb)\n", "* [Generating the Flextegrity Lattice](Flextegrity_Lattice.ipynb)\n", "* [Quadpod](https://controlroom.blogspot.com/2009/03/quadpod.html)\n", "* [Tetravolumes with Quadrays](https://nbviewer.org/github/4dsolutions/School_of_Tomorrow/blob/master/Qvolume.ipynb)\n", "* [The Tetrahedron: Volume from Edges Formulae](https://nbviewer.org/github/4dsolutions/School_of_Tomorrow/blob/master/VolumeTalk.ipynb)\n", "* [Hop's Gallery](http://clowder.net/hop/)\n", "* [Quadray Coordinates on Wikipedia](https://en.wikipedia.org/wiki/Quadray_coordinates)\n", "* [Lie Theory for the Roboticist (1)](https://youtu.be/nHOcoIyJj2o)\n", "* [Lie Theory for the Roboticist (2)](https://youtu.be/csolG83gCV8)\n", "* [OOP Meets Algebra, Suggested \"New Ways of Looking\"](http://4dsolutions.net/ocn/oopalgebra.html)\n", "* [An Uphill Battle Lost](https://controlroom.blogspot.com/2023/03/an-uphill-battle-lost.html)" ] } ], "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.15" } }, "nbformat": 4, "nbformat_minor": 5 }