| 9 | import pymesh |
| 10 | |
| 11 | def tet_to_hex(mesh): |
| 12 | in_vertices = mesh.vertices; |
| 13 | in_voxels = mesh.voxels; |
| 14 | out_vertices = []; |
| 15 | out_voxels = []; |
| 16 | |
| 17 | hexes = np.array([ |
| 18 | [0, 6, 12, 4, 5, 11, 14, 13], |
| 19 | [4, 12, 8, 1, 13, 14, 10, 7], |
| 20 | [6, 3, 8, 12, 11, 9, 10, 14], |
| 21 | [5, 2, 9, 11, 13, 7, 10, 14] |
| 22 | ]); |
| 23 | for i,tet in enumerate(in_voxels): |
| 24 | corners = in_vertices[tet]; |
| 25 | e01 = (corners[0] + corners[1]) / 2.0; |
| 26 | e02 = (corners[0] + corners[2]) / 2.0; |
| 27 | e03 = (corners[0] + corners[3]) / 2.0; |
| 28 | e12 = (corners[1] + corners[2]) / 2.0; |
| 29 | e13 = (corners[3] + corners[1]) / 2.0; |
| 30 | e23 = (corners[2] + corners[3]) / 2.0; |
| 31 | f0 = (corners[1] + corners[2] + corners[3]) / 3.0; |
| 32 | f1 = (corners[0] + corners[2] + corners[3]) / 3.0; |
| 33 | f2 = (corners[0] + corners[1] + corners[3]) / 3.0; |
| 34 | f3 = (corners[0] + corners[1] + corners[2]) / 3.0; |
| 35 | center = np.mean(corners, axis=0).reshape((1, -1)); |
| 36 | out_vertices += [corners, |
| 37 | e01, e02, e03, e12, e13, e23, |
| 38 | f0, f1, f2, f3, |
| 39 | center]; |
| 40 | |
| 41 | out_voxels.append(hexes + i*15); |
| 42 | |
| 43 | out_vertices = np.vstack(out_vertices); |
| 44 | out_voxels = np.vstack(out_voxels); |
| 45 | out_vertices, out_voxels, __ = pymesh.remove_duplicated_vertices_raw( |
| 46 | out_vertices, out_voxels); |
| 47 | mesh = pymesh.form_mesh(out_vertices, None, out_voxels); |
| 48 | return mesh; |
| 49 | |
| 50 | def parse_args(): |
| 51 | parser = argparse.ArgumentParser(description=__doc__); |