|
| 1 | +import numpy as np |
| 2 | + |
| 3 | + |
| 4 | +def _maybe_flatten(vertices, faces, ret_unique_vertices_and_faces): |
| 5 | + if ret_unique_vertices_and_faces: |
| 6 | + return vertices, faces |
| 7 | + else: |
| 8 | + return vertices[faces] |
| 9 | + |
| 10 | + |
| 11 | +def create_rectangular_prism(origin, size, ret_unique_vertices_and_faces=False): |
| 12 | + ''' |
| 13 | + Return vertices (or unique verties and faces) of an axis-aligned |
| 14 | + rectangular prism. One vertex is `origin`; the diametrically opposite |
| 15 | + vertex is `origin + size`. |
| 16 | +
|
| 17 | + size: 3x1 array. |
| 18 | +
|
| 19 | + ''' |
| 20 | + from lace.topology import quads_to_tris |
| 21 | + |
| 22 | + lower_base_plane = np.array([ |
| 23 | + # Lower base plane |
| 24 | + origin, |
| 25 | + origin + np.array([size[0], 0, 0]), |
| 26 | + origin + np.array([size[0], 0, size[2]]), |
| 27 | + origin + np.array([0, 0, size[2]]), |
| 28 | + ]) |
| 29 | + upper_base_plane = lower_base_plane + np.array([0, size[1], 0]) |
| 30 | + |
| 31 | + vertices = np.vstack([lower_base_plane, upper_base_plane]) |
| 32 | + |
| 33 | + faces = quads_to_tris(np.array([ |
| 34 | + [0, 1, 2, 3], # lower base (-y) |
| 35 | + [7, 6, 5, 4], # upper base (+y) |
| 36 | + [4, 5, 1, 0], # +z face |
| 37 | + [5, 6, 2, 1], # +x face |
| 38 | + [6, 7, 3, 2], # -z face |
| 39 | + [3, 7, 4, 0], # -x face |
| 40 | + ])) |
| 41 | + |
| 42 | + return _maybe_flatten(vertices, faces, ret_unique_vertices_and_faces) |
| 43 | + |
| 44 | + |
| 45 | +def create_cube(origin, size, ret_unique_vertices_and_faces=False): |
| 46 | + ''' |
| 47 | + Return vertices (or unique verties and faces) with an axis-aligned cube. |
| 48 | + One vertex is `origin`; the diametrically opposite vertex is `size` units |
| 49 | + along +x, +y, and +z. |
| 50 | +
|
| 51 | + size: int or float. |
| 52 | +
|
| 53 | + ''' |
| 54 | + return create_rectangular_prism( |
| 55 | + origin, |
| 56 | + np.repeat(size, 3), |
| 57 | + ret_unique_vertices_and_faces=ret_unique_vertices_and_faces) |
| 58 | + |
| 59 | + |
| 60 | +def create_triangular_prism(p1, p2, p3, height, ret_unique_vertices_and_faces=False): |
| 61 | + """ |
| 62 | + Return vertices (or unique verties and faces) of a triangular prism whose |
| 63 | + base is the triangle p1, p2, p3. If the vertices are oriented in a |
| 64 | + counterclockwise direction, the prism extends from behind them. |
| 65 | +
|
| 66 | + Imported from lace. |
| 67 | + """ |
| 68 | + from . import Plane |
| 69 | + |
| 70 | + base_plane = Plane.from_points(p1, p2, p3) |
| 71 | + lower_base_to_upper_base = height * -base_plane.normal # pylint: disable=invalid-unary-operand-type |
| 72 | + vertices = np.vstack(([p1, p2, p3], [p1, p2, p3] + lower_base_to_upper_base)) |
| 73 | + |
| 74 | + faces = np.array([ |
| 75 | + [0, 1, 2], # base |
| 76 | + [0, 3, 4], [0, 4, 1], # side 0, 3, 4, 1 |
| 77 | + [1, 4, 5], [1, 5, 2], # side 1, 4, 5, 2 |
| 78 | + [2, 5, 3], [2, 3, 0], # side 2, 5, 3, 0 |
| 79 | + [5, 4, 3], # base |
| 80 | + ]) |
| 81 | + |
| 82 | + return _maybe_flatten(vertices, faces, ret_unique_vertices_and_faces) |
| 83 | + |
| 84 | + |
| 85 | +def create_horizontal_plane(ret_unique_vertices_and_faces=False): |
| 86 | + ''' |
| 87 | + Creates a horizontal plane. |
| 88 | + ''' |
| 89 | + vertices = np.array([ |
| 90 | + [1., 0., 0.], |
| 91 | + [-1., 0., 0.], |
| 92 | + [0., 0., 1.], |
| 93 | + [0., 0., -1.] |
| 94 | + ]) |
| 95 | + faces = [[0, 1, 2], [3, 1, 0]] |
| 96 | + return _maybe_flatten(vertices, faces, ret_unique_vertices_and_faces) |
0 commit comments