3__all__ = [
'Dodecahedron']
10 """A dodecahedron with positions of faces and associated vertices.
14 withFacesOnPoles : `bool`
15 If
True center a face on each pole,
else put a vertex on each pole.
26 g = (1.0 + math.sqrt(5.0)) / 2.0
43 self.
vertexVecList = [numpy.dot(rotMat, unrotVertexVec)
for unrotVertexVec
in unrotVertexVecList]
44 unsortedFaceList = [numpy.dot(rotMat, unrotFaceVec)
for unrotFaceVec
in unrotFaceVecList]
48 """Return a list of face centers.
52 results : `list` of `numpy.ndarray`
53 A list of face centers (in index order); each a unit vector.
58 """Return the center of the specified face.
63 Index of the face to look up.
67 results : `numpy.ndarray`
68 Face center as a unit vector.
73 """Return the vertices for a given face.
82 sortedVertexList : `list` of `numpy.ndarray`
83 A list of vertices, each a unit vector.
89 sortedVertexList = [vertexList[0]]
90 vertexList =
list(vertexList[1:])
91 while len(vertexList) != 0:
92 nearVertexList, nearInd =
_findCloseList(vertexList, sortedVertexList[-1])
93 sortedVertexList.append(nearVertexList[0])
94 vertexList.pop(nearInd[0])
95 return sortedVertexList
98 """Return the index of the face containing the cartesian vector.
102 vec : `numpy.ndarray`
103 Cartesian vector (length is ignored).
107 results : `numpy.ndarray`
108 Index of face containing vec.
110 return numpy.argmax(numpy.dot(self.
faceVecList, vec))
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())
202 """Given a collection of basis vectors, compute all permutations with both
203 signs of all nonzero values.
207 [(0, 1, 2)] -> [(0, 1, 2), (0, -1, 2), (0, 1, -2), (0, -1, -2)]
210 for basisVec
in basisSet:
211 vecLen = math.sqrt(numpy.sum(numpy.array(basisVec)**2))
213 for basisValue
in basisVec:
215 valueList.append((0,))
217 valueList.append((basisValue, -basisValue))
218 fullSet +=
list(numpy.array((x, y, z))/vecLen
219 for z
in valueList[2]
220 for y
in valueList[1]
221 for x
in valueList[0]
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
274 """Given a list of cartesian vectors and an index, return the vector and
275 one of its closest neighbors.
279 vecList : `list` of `numpy.ndarray`
280 List of cartesian vectors.
282 Index of first vector.
285 otherVecList = vecList[0:ind] + vecList[ind+1:]
286 ind1 = numpy.argmax(numpy.dot(otherVecList, vec))
287 return vec, otherVecList[ind1]
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]
305if __name__ ==
"__main__":
306 numpy.set_printoptions(precision=2, suppress=
True, linewidth=120)
308 print(
"Dodecahedron with vertices on poles")
311 faceVec = vertexDodec.getFaceCtr(i)
312 print(
"Face %2d: %s" % (i, faceVec))
__init__(self, withFacesOnPoles=False)
getWithFacesOnPoles(self)
daf::base::PropertyList * list
daf::base::PropertySet * set
_findClosePair(vecList, ind=0)
computeRotationMatrix(angle, axis)
_computeCoordTransform(vec0, vec1, vec1NegativeX=False)
_computeDodecahedronVertices(faceVecList)
_findCloseList(vecList, vec)
_sortedVectorList(vecList)
_findCloseIndexSet(vecList, ind)
_computeFullVecList(basisSet)