def orthogonalize3_cross(mats_n33): "turns each matrix into a rotation" x_n3 = mats_n33[:,:,0] y_n3 = mats_n33[:,:,1] # z_n3 = mats_n33[:,:,2] xnew_n3 = math_utils.normr(x_n3) znew_n3 = math_utils.normr(np.cross(xnew_n3, y_n3)) ynew_n3 = math_utils.normr(np.cross(znew_n3, xnew_n3)) return np.concatenate([xnew_n3[:,:,None], ynew_n3[:,:,None], znew_n3[:,:,None]],2)
def orthogonalize3_cross(mats_n33): "turns each matrix into a rotation" x_n3 = mats_n33[:, :, 0] y_n3 = mats_n33[:, :, 1] # z_n3 = mats_n33[:,:,2] xnew_n3 = math_utils.normr(x_n3) znew_n3 = math_utils.normr(np.cross(xnew_n3, y_n3)) ynew_n3 = math_utils.normr(np.cross(znew_n3, xnew_n3)) return np.concatenate( [xnew_n3[:, :, None], ynew_n3[:, :, None], znew_n3[:, :, None]], 2)
def get_sphere_points(n_subdivisions): phi = (1+np.sqrt(5))/2 verts = [] verts.extend(r_[0,y,z] for y in [-1,1] for z in [-phi,phi]) verts.extend(r_[x,y,0] for x in [-1,1] for y in [-phi,phi]) verts.extend(r_[x,0,z] for x in [-phi,phi] for z in [-1,1]) dists = ssd.cdist(verts, verts) triangles = [] edge_length = dists[dists>0].min() for (i,j,k) in itertools.combinations(xrange(len(verts)), 3): if dists[i,j] == edge_length and dists[j,k] == edge_length and dists[k,i] == edge_length: triangles.append((i,j,k)) faces = [(verts[i], verts[j], verts[k]) for (i,j,k) in triangles] for _i_sub in xrange(n_subdivisions): new_faces = [] for (v0, v1, v2) in faces: new_faces.extend([ (v0, (v0 + v1)/2, (v0 + v2)/2), (v1, (v1 + v0)/2, (v1 + v2)/2), (v2, (v2 + v0)/2, (v2 + v1)/2), ((v0 + v1)/2, (v1 + v2)/2, (v2 + v0)/2)]) faces = new_faces all_verts = np.array(faces).reshape(-1,3) all_verts = remove_duplicate_rows(all_verts[np.lexsort(all_verts.T)]) all_verts = math_utils.normr(all_verts) return all_verts
def get_sphere_points(n_subdivisions): phi = (1 + np.sqrt(5)) / 2 verts = [] verts.extend(r_[0, y, z] for y in [-1, 1] for z in [-phi, phi]) verts.extend(r_[x, y, 0] for x in [-1, 1] for y in [-phi, phi]) verts.extend(r_[x, 0, z] for x in [-phi, phi] for z in [-1, 1]) dists = ssd.cdist(verts, verts) triangles = [] edge_length = dists[dists > 0].min() for (i, j, k) in itertools.combinations(xrange(len(verts)), 3): if dists[i, j] == edge_length and dists[j, k] == edge_length and dists[ k, i] == edge_length: triangles.append((i, j, k)) faces = [(verts[i], verts[j], verts[k]) for (i, j, k) in triangles] for _i_sub in xrange(n_subdivisions): new_faces = [] for (v0, v1, v2) in faces: new_faces.extend([(v0, (v0 + v1) / 2, (v0 + v2) / 2), (v1, (v1 + v0) / 2, (v1 + v2) / 2), (v2, (v2 + v0) / 2, (v2 + v1) / 2), ((v0 + v1) / 2, (v1 + v2) / 2, (v2 + v0) / 2)]) faces = new_faces all_verts = np.array(faces).reshape(-1, 3) all_verts = remove_duplicate_rows(all_verts[np.lexsort(all_verts.T)]) all_verts = math_utils.normr(all_verts) return all_verts