My work is currently to do with functions and properties of the unit Octahedron. While it is not central to the question here, it may help with the context. A unit octahedron has side lengths of √2, and it's six vertices are at (±1,0,0),(0,±1,0),(0,0,±1) As I am using this to consider geographic projections, I am labelling these NS in the z-axis, EW in the y-axis, and AP in the x-axis. vertices = { # ... of the unit octahedron 'N': (0, 0, 1), 'S': (0, 0, -1), 'E': (0, 1, 0), 'W': (0, -1, 0), 'A': (1, 0, 0), 'P': (-1, 0, 0) } Each of the eight sides of the octahedron (just as their spherical counterparts) are called octants, and they are their composite vertices, so I am naming them accordingly. For example, NEA consists of the vertices N, E, A. For reasons to do with geographic naming conventions, each name is the format (regex) [NS][WE][AP] (Eg NEA: "North East Atlantic"). Here I am calling them sides. Every point [u,v,w] on the surface of the unit octahedron meets the constraint |u|+|v|+|w|=1. I am using something like the following for such validation. np.allclose(1, np.abs(uvw).sum(axis=-1), rtol=1e-8, atol=1e-8) The side it belongs to can be also determined by the signs of its coordinates. For example, [0.363 0.52 0.117] is on NEA while [-0.363 0.52 -0.117] is on SEP. np.sign() is useful for this, I am currently generating the signs as follows: s = [-1, 1] signs = np.stack(np.meshgrid(s, s, s), axis=-1,).reshape((-1, 3)) But this doesn't automatically correlate with the sides NEA, NWA, etc. Again, a function essential to my purpose is to rotate surface points on any given side of the octahedron onto the plane, for the purpose of being able to draw nets, etc. The rotation matrices themselves again correlate very strongly to the nature of the octahedron (no surprise there, right?) I am defining these matrices as follows: z_rotate = ( ((-1, 0, 1), ( 1, -2, 1), ( 1, 1, 1)), # NEA (( 0, -1, -1), (-2, 1, -1), ( 1, 1, -1)), # SEA (( 0, -1, 1), ( 2, 1, 1), (-1, 1, 1)), # NEP (( 1, 0, -1), (-1, -2, -1), (-1, 1, -1)), # SEP (( 0, 1, 1), (-2, -1, 1), ( 1, -1, 1)), # NWA ((-1, 0, -1), ( 1, 2, -1), ( 1, -1, -1)), # SWA (( 1, 0, 1), (-1, 2, 1), (-1, -1, 1)), # NWP (( 0, 1, -1), ( 2, -1, -1), (-1, -1, -1)) # SWP )/np.sqrt((2, 6, 3))[:, np.newaxis] The question I am looking for a solution to the conundrum of deriving the acronymic names (NEA, etc) from their vertices (remembering that they are 'reversed' order; eg NS govern the Z plane - the 3rd axis of a coordinate); and likewise being able to derive/identify each of the various properties of each side from the the vertices that compose them, such as derive the coordinate signs of each side into a {sign_tuple:name} dict. The rotation matrices actually hold the coordinate signs (in the final row of each corresponding matrix, so being able to derive and/or correlate those with each vertex would allow us skip the coordinate sign task by using something like (but with the correlating key). signs = z_rotate[:, -1] There are interesting patterns to the the first and second lines of the rotation matrices - something I have wondered about - the sign of Z coordinate always directly corresponds to N/S various flips happen between the X,Y coordinates. It would be amazing to see the rotation arrays being derived from a single prototype following the intrinsic relations of the octahedron (rather than being derived analytically via the normals - which is of no interest to me), but that is beyond my expectations. Continue reading...