Synergetics Projection of Globe to Tetrahedron

Reference

Written by Clifford J. Nelson,  Nov 9, 1995. Revised June 12, 1997. And Dec 27, 1997, and May 17, 1998 and May 18, 1998 and May 20, 1998 and May 30, 1998.

Copyright  Clifford J. Nelson

Based on books:

Synergetics: explorations in the geometry of thinking. 1975 by R. Buckminster Fuller.
ISBN 0-02-065320-4
Macmillan Publishing Company
866 Third Avenue, New York, N. Y. 10022
Collier Macmillan Canada, Inc.

Synergetics 2, 1979 by R. Buckminster Fuller.
ISBN 0-02-541870-X (v. 1)
ISBN 0-02-541880-7 (v. 2)
Macmillan Publishing Co., Inc.
806 Third Avenue, New York, N. Y. 10022
Collier Macmillan Canada, Ltd.

Discussion

Buckminster Fuller did not make his omni-triangulated 60 degree Synergetics coordinate system explicit in his books Synergetics and Synergetics 2. I did it by ruling a paper with equiangular triangles and it was surprising how it all fit together. When you add another dimension to the triangle you get a tetrahedron (triangular based pyramid). Going from two dimensions to three does not change the way to compute the distance from the origin in terms of unit vectors or straight lines. It also does not change the way to compute the edge length of the triangle or tetrahedron. See the notebook SynergeticsCoordinates.nb for an explanation of Synergetics Coordinates.

Bucky was right. Transforming Synergetics coordinates to 90 degree perpendicular coordinates and back again can be done, but it is involved. Mathematica makes it painless though.

This is one application of Synergetics coordinates. The surface of the globe is normalized to the surface of a tetrahedron. (the tetrahedrons vertices are "the four corners of the earth"). It does not make any difference what size the tetrahedron is, as long as it is centered at the origin. This notebook uses a tetrahedron of edge length four. The tetrahedron is unfolded into a triangle with its base at the top.

Implementation

<< SynCoordinates.m

Four Synergetics coordinates represent the perpendicular movement of the four planes of a regular tetrahedron. Whether you move them toward the center (negative), or away from the center (positive), you always get another regular tetrahedron. The edge length in terms of unit vectors or Euclid distance is the sum of the coordinates. If the sum is negative, the tetrahedron will be upside down and inside out. If the sum is zero it represents a "fix", location, or point.

SynCoordinates.m transforms Synergetics coordinates which sum to zero, to perpendicular 90 degree coordination. The actual perpendicular displacement distance referred to by the four numbers is in terms of the altitude of a regular tetrahedron of edge length one. All movements of the four planes are kept with reference to a volume zero tetrahedron at {0,0,0,0}. The edge length of the resulting tetrahedron found by adding the four coordinates is both the StraightLineDistance and the VectorDistance from vertex to vertex.

Four integer Synergetics coordinates that sum to zero give the centers of close packed like diameter spheres. Buckminster Fuller wrote that the unit vector length should be 2, because the radius of each close packed sphere should be 1, but here the unit vector length is 1 and the radius of each sphere is 1/2.

<< RBFields.m

VectorDistance[{a, b, c, d}]

The VectorDistance is from center of sphere to center of sphere going only by way of adjacent spheres. It is the sum of the absolute values of the coordinates divided by 2 if the coordinates are real numbers.

StraightLineDistance[{a, b, c, d}]

Notice the difference between StraightLineDistance and VectorDistance.

?VertexesOf

VertexesOf[x_]  :=  Table[VertexesOf[x, i], {i, 1, Length[x]}]

TetraVertexes  =  VertexesOf[{1, 1, 1, 1}]

Vertexes is an alternate spelling of vertices. VertexesOf will give the vertices (corner points) of a simplex such as a triangle of edge length 3, {1,1,1}, or a tetrahedron of edge length 4, {1,1,1,1}, or a regular simplex positioned anywhere in n dimensional space, where n is one less than the length of the input to VertexesOf. The edge length of the simplex is the sum of the coordinates.

trit[2]  =  {{1, 1, -2}, {1, -2, 1}, {-2, 1, 1}}

trit[1]  =  {{-2, -2, 4}, {1, -2, 1}, {-2, 1, 1}}

trit[4]  = 
       {{1, 1, -2}, {1, 1, -2} + {3, -3, 0}, {1, -2, 1}}

trit[3]  = 
       {{1, 1, -2}, {1, 1, -2} + {-3, 3, 0}, {-2, 1, 1}}

UnfoldedTriangles =   (trit /@ Range[4])

The upside down triangle is divided into four triangles each having three vertices, These will be the unfolded triangles of the tetrahedron onto which the surface of the globe will be projected.

Any point on an equilateral triangle can be thought of as representing a mixture of the three vertices of the triangle. For instance, the midpoint is {1/3,1/3,1/3}. Any point in a regular tetrahedron represents a mixture of the four vertexes of the tetrahedron. The midpoint is  {1/4,1/4,1/4,1/4}. The perportion function calculates the mixture values for the vertices of a point in a simplex.

perportion[x,vertexes,1] is the true mixture. perportion[x,vertexes,2] distorts the mixture by normalizing  it to the 1.25 power of the values.

?distance

adj4[x_]  :=    x/(Plus @@ x)

DistancesFrom[x_, y_] := distance[N[x], N[#1]]&/@y

Clear[perportion]

perportion[x_, vertexes_, 1] := 
      pers[DistancesFrom[x, N[vertexes]], 
        VectorDistance[
          N[vertexes[[1]] - 
              vertexes[[2]]]]]

perportion[x_, vertexes_, 2] := 
      adj4[Re[pers[DistancesFrom[x, N[vertexes]], 
              VectorDistance[
                N[vertexes[[1]] - 
                    vertexes[[2
                      ]]]]]^1.25]]

?pers

totri[x_] := 
      makepoint[x, First[Flatten[Position[N[x], Min[N[x]]]]]]

totri will get a perportion list of a point on a sphere after it has been normalized to the surface of a tetrahedron, so at least one of the values of the perportion should be zero.  The First Min value is marked for deletion.

?fromperportion

makepoint[x_, n_] := 
      fromperportion[Delete[x, n], 
        UnfoldedTriangles[[n]]]

A zero perportion is deleted and the other three multiply the appropriate triangle vertices in makepoint.

toradians[x_] := N[((Degree x)/60)]

to3d[tude1_, tude2_] := {Cos[tude1] Cos[tude2], 
        Cos[tude1] Sin[tude2], Sin[tude1]}

ToTetraSurface[x_] := ((x )/Max)[N[x]]

ToTetraSurface is a simple way to project a point to the surface of a {1,1,1,1} regular tetrahedron. After this, at least one of the values in the list returned by perportion[x,vertices,1] will be zero because the point will be on the surface of the tetrahedron, so, the vertex opposite the face will have a zero percentage of the mixture (perportion list).

ToUnfoldedTriangles[x_, n_] := 
      N[StoP[totri[N[perportion[ToTetraSurface[N[x]], N[TetraVertexes], n]]]]]

?StoP

The function StoP converts Synergetics coordinates to perpendicular coordinates. The Synergetics coordinates must sum to zero so that they are a regular simplex of edge length zero ( a point).

project[longitude_, latitude_, n_] := 
      ToUnfoldedTriangles[
        PtoS[to3d[toradians[longitude], toradians[latitude]]], n]

?PtoS

?Tri

PtoS converts perpendicular coordinates to Synergetics coordinates. It undoes StoP.

Tetra = project[#1, #2, 1]&

Tetra2  =  project[#1, #2, 2]&

Tetra is a pure function to be used in the option to WorldPlot. WorldProjection -> Tetra. It will be fed latitude, longitude instead of longitude, latitude. Longitudes and latitudes are in the database for the world in minutes. Tetra2 distorts the perportion lists to change the relative sizes of the countries to be more realistic.

Demo

Tetra-Plot of World Demo

The lines of latitude and longitude can be shown to get an idea of what the map will look like.

g  =  
      Table[Tetra[i, j], {i, -90 60, 90 60, 180 60/10}, {j, 
          -180 60, 180 60, 360 60/10}];

tl[x_]  :=  {Line /@ x,  Line /@ Transpose[x]}

Show[Graphics[tl[g]], AspectRatio  ->  Automatic]

g  =  
      Table[Tetra2[i, j], {i, -90 60, 90 60, 180 60/10}, {j, 
          -180 60, 180 60, 360 60/10}];

Show[Graphics[tl[g]], AspectRatio  ->  Automatic]

Needs["Miscellaneous`WorldPlot`"]

A plot of the world with random colors.

WorldPlot[{World, RandomColors}, WorldProjection -> Tetra]

The same plot with Tetra2.

WorldPlot[{World, RandomColors}, WorldProjection -> Tetra2]

?WorldRotation

WorldPlot[{World, RandomColors}, WorldRotation -> {0, -90, 0}, 
      WorldProjection -> Tetra2]

WorldPlot[{World, RandomColors}, 
      WorldRotation -> { 90, -90, 0}, WorldProjection -> Tetra]

WorldPlot[{World, RandomColors}, WorldRotation -> {90, 90, 0}, 
      WorldProjection -> Tetra2]