def intersection(axis, coord, triangle): """ Returns the intersection (if one exists) between a *triangle* and the plane based on the *axis* and *coord*. Also returns a boolean indicating whether or not an intersection was found. """ #create an array for the coordinates triangle_verts=np.array([], ndmin=3) triangle_verts.shape =(0, 3, 3) verts = mesh.getEntAdj(triangle, iBase.Type.vertex) vert1 = mesh.getVtxCoords(verts[0]) vert2 = mesh.getVtxCoords(verts[1]) vert3 = mesh.getVtxCoords(verts[2]) temp = np.vstack( (vert1, vert2, vert3) ) #insert the coordinates into the array triangle_verts = np.append(triangle_verts, [temp], axis = 0) #check for an intersection line = triangle_plane_intersect(axis, coord, triangle_verts) #if a line is returned, indicate that we have an intersection intersect = True if line.size is not 0 else False return intersect, line
def test_perfect_element_intersection(): # This test tests mesh line annotation where a z=0 slice # perfectly intersects the top of a hexahedral element with node # z-coordinates containing both -0 and +0. Before # https://github.com/yt-project/yt/pull/1437 this test falsely # yielded three annotation lines, whereas the correct result is four # corresponding to the four edges of the top hex face. ds = small_fake_hexahedral_ds() indices = ds.index.meshes[0].connectivity_indices coords = ds.index.meshes[0].connectivity_coords tri_indices = triangulate_indices(indices) tri_coords = coords[tri_indices] lines = triangle_plane_intersect(2, 0, tri_coords) non_zero_lines = 0 for i in range(lines.shape[0]): norm = np.linalg.norm(lines[i][0] - lines[i][1]) if norm > 1e-8: non_zero_lines += 1 np.testing.assert_equal(non_zero_lines, 4)
def __call__(self, plot): plot._axes.hold(True) ax = plot.data.axis xax = plot.data.ds.coordinates.x_axis[ax] yax = plot.data.ds.coordinates.y_axis[ax] if not hasattr(self.vertices, "in_units"): vertices = plot.data.pf.arr(self.vertices, "code_length") else: vertices = self.vertices l_cy = triangle_plane_intersect(plot.data.axis, plot.data.coord, vertices)[:, :, (xax, yax)] # reformat for conversion to plot coordinates l_cy = np.rollaxis(l_cy, 0, 3) # convert all line starting points l_cy[0] = self.convert_to_plot(plot, l_cy[0]) l_cy[1] = self.convert_to_plot(plot, l_cy[1]) # convert all line ending points l_cy = np.rollaxis(l_cy, 2, 0) # create line collection and add it to the plot lc = matplotlib.collections.LineCollection(l_cy, **self.plot_args) plot._axes.add_collection(lc) plot._axes.hold(False)