Changeset 7719
- Timestamp:
- May 11, 2010, 10:42:57 PM (15 years ago)
- Location:
- anuga_core/source/anuga/geometry
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
anuga_core/source/anuga/geometry/mesh_quadtree.py
r7718 r7719 25 25 26 26 import numpy as num 27 27 28 28 29 LAST_TRIANGLE = [[-10, -10, 30 (num.array([[max_float, max_float], 29 LAST_TRIANGLE = [[[-1, num.array([[max_float, max_float], 31 30 [max_float, max_float], 32 31 [max_float, max_float]]), 33 (num.array([1.,1.]),34 num.array([0.,0.]),35 num.array([-1.1,-1.1])))]]32 num.array([[max_float, max_float], 33 [max_float, max_float], 34 [max_float, max_float]])], -10]] 36 35 37 36 … … 60 59 V = mesh.get_vertex_coordinates(absolute=True) 61 60 61 normals = mesh.get_normals() 62 62 63 # Check each triangle 63 64 for i in range(N): 64 x0, y0 = V[3*i, :] 65 x1, y1 = V[3*i+1, :] 66 x2, y2 = V[3*i+2, :] 65 i3 = 3*i 66 x0, y0 = V[i3, :] 67 x1, y1 = V[i3+1, :] 68 x2, y2 = V[i3+2, :] 69 70 node_data = [i, V[i3:i3+3,:], normals[i,:]] 67 71 68 72 # insert a tuple with an AABB, and the triangle index as data 69 73 self._insert((AABB(min([x0, x1, x2]), max([x0, x1, x2]), \ 70 74 min([y0, y1, y2]), max([y0, y1, y2])), \ 71 i))75 node_data)) 72 76 73 77 def search_fast(self, x): … … 92 96 x = ensure_numeric(x, num.float) 93 97 94 if self.last_triangle[0][1] != -10: 95 # check the last triangle found first 96 element_found, sigma0, sigma1, sigma2, k = \ 97 self._search_triangles_of_vertices(self.last_triangle, x) 98 if element_found: 99 return True, sigma0, sigma1, sigma2, k 98 # check the last triangle found first 99 element_found, sigma0, sigma1, sigma2, k = \ 100 self._search_triangles_of_vertices(self.last_triangle, x) 101 if element_found: 102 return True, sigma0, sigma1, sigma2, k 100 103 101 104 branch = self.last_triangle[0][1] 102 105 103 106 # test neighbouring tris 104 tri_data = branch.test_leaves(x) 105 triangles = self._trilist_from_data(tri_data) 107 tri_data = branch.test_leaves(x) 106 108 element_found, sigma0, sigma1, sigma2, k = \ 107 self._search_triangles_of_vertices(tri angles, x)109 self._search_triangles_of_vertices(tri_data, x) 108 110 if element_found: 109 111 return True, sigma0, sigma1, sigma2, k … … 114 116 while branch: 115 117 for sibling in next_search: 116 tri_data = sibling.search(x) 117 triangles = self._trilist_from_data(tri_data) 118 tri_data = sibling.search(x) 118 119 element_found, sigma0, sigma1, sigma2, k = \ 119 self._search_triangles_of_vertices(tri angles, x)120 self._search_triangles_of_vertices(tri_data, x) 120 121 if element_found: 121 122 return True, sigma0, sigma1, sigma2, k … … 124 125 branch = branch.parent 125 126 if branch: 126 tri_data = branch.test_leaves(x) 127 triangles = self._trilist_from_data(tri_data) 127 tri_data = branch.test_leaves(x) 128 128 element_found, sigma0, sigma1, sigma2, k = \ 129 self._search_triangles_of_vertices(tri angles, x)129 self._search_triangles_of_vertices(tri_data, x) 130 130 if element_found: 131 131 return True, sigma0, sigma1, sigma2, k … … 140 140 has been found from the quad tree. 141 141 142 143 This function is responsible for most of the compute time in 144 fit and interpolate. 142 x is the triangle index 143 Input check disabled to speed things up. 145 144 """ 146 145 147 for k, node, tri_verts_norms in triangles: 148 tri = tri_verts_norms[0] 149 tri = ensure_numeric(tri) 150 # k is the triangle index 151 # tri is a list of verts (x, y), representing a triangle 152 # Find triangle that contains x (if any) and interpolate 153 154 # Input check disabled to speed things up. 155 if bool(_is_inside_triangle(x, tri, int(True), 1.0e-12, 1.0e-12)): 156 n0, n1, n2 = tri_verts_norms[1] 157 xi0, xi1, xi2 = tri 146 for node_data in triangles: 147 if bool(_is_inside_triangle(x, node_data[0][1], int(True), 1.0e-12, 1.0e-12)): 148 normals = node_data[0][2] 149 n0 = normals[0:2] 150 n1 = normals[2:4] 151 n2 = normals[4:6] 152 xi0, xi1, xi2 = node_data[0][1] 158 153 159 154 sigma0 = num.dot((x-xi1), n0)/num.dot((xi0-xi1), n0) … … 162 157 163 158 # Don't look for any other triangles in the triangle list 164 self.last_triangle = [ [k, node, tri_verts_norms]]165 return True, sigma0, sigma1, sigma2, k159 self.last_triangle = [node_data] 160 return True, sigma0, sigma1, sigma2, node_data[0][0] # tri index 166 161 return False, -1, -1, -1, -10 167 162 168 169 def _trilist_from_data(self, indices): 170 ret_list = [] 171 for i, node in indices: 172 vertices = self.mesh.get_vertex_coordinates(triangle_id=i, absolute=True) 173 n0 = self.mesh.get_normal(i, 0) 174 n1 = self.mesh.get_normal(i, 1) 175 n2 = self.mesh.get_normal(i, 2) 176 ret_list.append([i, node, [vertices, (n0, n1, n2)]]) 177 return ret_list 163 178 164 179 165 def set_last_triangle(self): -
anuga_core/source/anuga/geometry/quad.py
r7718 r7719 165 165 aabb, data = leaf 166 166 if aabb.contains(x): 167 intersecting_regions.append( (data, self))167 intersecting_regions.append([data, self]) 168 168 169 169 return intersecting_regions
Note: See TracChangeset
for help on using the changeset viewer.