117 """Return a 3D rotation matrix for rotation by a specified amount around a
123 Amount of rotation (rad).
125 Axis of rotation; one of 0, 1 or 2 for x, y or z.
127 cosAng = math.cos(angle)
128 sinAng = math.sin(angle)
129 rotMat = numpy.zeros((3, 3), dtype=float)
130 rotMat[axis, axis] = 1
131 rotMat[(axis + 1) % 3, (axis + 1) % 3] = cosAng
132 rotMat[(axis + 2) % 3, (axis + 1) % 3] = sinAng
133 rotMat[(axis + 1) % 3, (axis + 2) % 3] = -sinAng
134 rotMat[(axis + 2) % 3, (axis + 2) % 3] = cosAng
139 """Compute a rotation matrix that puts vec0 along z and vec1 along +x in
144 vec0 : `numpy.ndarray`
146 vec1 : `numpy.ndarray`
148 vec1NegativeX : `bool`
149 If True then vec1 is rotated to face negative x.
152 xAng = math.atan2(vec0[1], vec0[2])
156 vec0RotX = numpy.dot(xRotMat, vec0)
157 yAng = -math.atan2(vec0RotX[0], vec0RotX[2])
159 xyRotMat = numpy.dot(yRotMat, xRotMat)
162 vec1RotXY = numpy.dot(xyRotMat, vec1)
166 zAng = -math.atan2(vec1RotXY[1], xVal)
168 xyzRotMat = numpy.dot(zRotMat, xyRotMat)
173 """Given a vector of face positions of a Dodecahedron compute the vertices.
177 for i
in range(len(faceVecList)):
179 if len(closeIndSet) != 5:
180 raise RuntimeError(
"Found %s vertices instead of 5 near %s: %s" %
181 (len(closeIndSet), faceVecList[i], closeIndSet))
182 closeIndSetList.append(closeIndSet)
183 for i, iCloseIndSet
in enumerate(closeIndSetList):
184 for j
in iCloseIndSet:
185 jCloseIndSet = closeIndSetList[j]
186 sharedCloseIndSet = iCloseIndSet.intersection(jCloseIndSet)
187 if len(sharedCloseIndSet) != 2:
188 raise RuntimeError(
"Found %s vertices instead of 2 near %s and %s: %s" %
189 (len(sharedCloseIndSet), faceVecList[i], faceVecList[j],
191 for k
in sharedCloseIndSet:
192 key = frozenset((i, j, k))
193 if key
in vertexDict:
195 vertexVec = faceVecList[i] + faceVecList[j] + faceVecList[k]
196 vertexVec /= numpy.sqrt(numpy.sum(vertexVec**2))
197 vertexDict[key] = vertexVec
198 return list(vertexDict.values())
227 """Given a list of cartesian vectors, return a set of indices of those
228 closest to one of them.
230 This is intended for regular grids where distances are quantized.
235 List of cartesian vectors.
237 Index of vector to be nearest.
239 dotProductList = numpy.round(numpy.dot(vecList, vecList[ind]), 2)
240 dotProductList[ind] = -9e99
241 minDist = numpy.max(dotProductList)
242 indList = numpy.arange(len(dotProductList))[dotProductList == minDist]
247 """Given a list of cartesian vectors, return all those closest to a
250 This is intended for regular grids where distances are quantized
255 List of cartesian vectors.
256 vec : `iterable` of `float`
262 List of closest vectors.
264 List if indices of those vectors.
266 dotProductList = numpy.round(numpy.dot(vecList, vec), 2)
267 minDist = numpy.max(dotProductList)
268 indList = numpy.arange(len(dotProductList))[dotProductList == minDist]
269 retList = numpy.take(vecList, indList, 0)
270 return retList, indList
291 """Return a list of cartesian vectors sorted by decreasing latitude and
292 increasing longitude.
295 ang = round(math.atan2(vec[1], vec[0]), 2)
298 return (-round(vec[2], 1), ang, vec)
300 decoratedList = [vecToSort(v)
for v
in vecList]
302 return [d[2]
for d
in decoratedList]