(box_min, box_max, num_samples, keep_symmetry,
subdiv_order, using_simplex)
| 49 | return mesh |
| 50 | |
| 51 | def generate_2D_box_mesh(box_min, box_max, num_samples, keep_symmetry, |
| 52 | subdiv_order, using_simplex): |
| 53 | if isinstance(num_samples, int): |
| 54 | num_samples = [num_samples, num_samples] |
| 55 | step_size = np.divide((box_max - box_min), num_samples) |
| 56 | |
| 57 | num_vertices = 0 |
| 58 | vertices = [] |
| 59 | faces = [] |
| 60 | quad_indices = [] |
| 61 | quad_index = 0 |
| 62 | for i in range(num_samples[0]): |
| 63 | for j in range(num_samples[1]): |
| 64 | p = np.multiply([i, j], step_size) + box_min |
| 65 | corners = np.array([ |
| 66 | [p[0] , p[1] ], |
| 67 | [p[0]+step_size[0], p[1] ], |
| 68 | [p[0]+step_size[0], p[1]+step_size[1]], |
| 69 | [p[0] , p[1]+step_size[1]] ]) |
| 70 | subcell_corners = subdivide_quad(corners, subdiv_order) |
| 71 | for corners in subcell_corners: |
| 72 | if using_simplex: |
| 73 | if keep_symmetry: |
| 74 | cell_vertices, cell_faces =\ |
| 75 | split_quad_into_tris_symmetrically(corners) |
| 76 | else: |
| 77 | cell_vertices, cell_faces =\ |
| 78 | split_quad_into_tris(corners) |
| 79 | else: |
| 80 | cell_vertices = corners |
| 81 | cell_faces = np.array([[0, 1, 2, 3]]) |
| 82 | vertices.append(cell_vertices) |
| 83 | faces.append(cell_faces + num_vertices) |
| 84 | num_vertices += len(cell_vertices) |
| 85 | quad_indices.append(np.ones(len(cell_faces)) * quad_index) |
| 86 | |
| 87 | quad_index +=1 |
| 88 | |
| 89 | vertices = np.vstack(vertices) |
| 90 | faces = np.vstack(faces) |
| 91 | quad_indices = np.vstack(quad_indices).ravel(order="C") |
| 92 | |
| 93 | vertices, faces, __ = remove_duplicated_vertices_raw(vertices, faces) |
| 94 | vertices, faces, __ = remove_isolated_vertices_raw(vertices, faces) |
| 95 | |
| 96 | tets = np.array([], dtype=int) |
| 97 | mesh = form_mesh(vertices, faces, tets) |
| 98 | return mesh, quad_indices |
| 99 | |
| 100 | def subdivide_quad(corners, subdiv_order): |
| 101 | """ |
no test coverage detected