@@ -131,3 +131,91 @@ def test_no_modify():
131131 tri = mtri .Triangulation (points [:,0 ], points [:,1 ], triangles )
132132 edges = tri .edges
133133 assert_array_equal (old_triangles , triangles )
134+
135+ def test_trifinder ():
136+ # Test points within triangles of masked triangulation.
137+ x ,y = np .meshgrid (np .arange (4 ), np .arange (4 ))
138+ x = x .ravel ()
139+ y = y .ravel ()
140+ triangles = [[0 ,1 ,4 ], [1 ,5 ,4 ], [1 ,2 ,5 ], [2 ,6 ,5 ], [2 ,3 ,6 ], [3 ,7 ,6 ], [4 ,5 ,8 ],
141+ [5 ,9 ,8 ], [5 ,6 ,9 ], [6 ,10 ,9 ], [6 ,7 ,10 ], [7 ,11 ,10 ], [8 ,9 ,12 ],
142+ [9 ,13 ,12 ], [9 ,10 ,13 ], [10 ,14 ,13 ], [10 ,11 ,14 ], [11 ,15 ,14 ]]
143+ mask = np .zeros (len (triangles ))
144+ mask [8 :10 ] = 1
145+ triang = mtri .Triangulation (x , y , triangles , mask )
146+ trifinder = triang .get_trifinder ()
147+
148+ xs = [0.25 , 1.25 , 2.25 , 3.25 ]
149+ ys = [0.25 , 1.25 , 2.25 , 3.25 ]
150+ xs ,ys = np .meshgrid (xs ,ys )
151+ xs = xs .ravel ()
152+ ys = ys .ravel ()
153+ tris = trifinder (xs , ys )
154+ assert_array_equal (tris , [0 ,2 ,4 ,- 1 ,6 ,- 1 ,10 ,- 1 ,12 ,14 ,16 ,- 1 ,- 1 ,- 1 ,- 1 ,- 1 ])
155+ tris = trifinder (xs - 0.5 , ys - 0.5 )
156+ assert_array_equal (tris , [- 1 ,- 1 ,- 1 ,- 1 ,- 1 ,1 ,3 ,5 ,- 1 ,7 ,- 1 ,11 ,- 1 ,13 ,15 ,17 ])
157+
158+ # Test points exactly on boundary edges of masked triangulation.
159+ xs = [0.5 , 1.5 , 2.5 , 0.5 , 1.5 , 2.5 , 1.5 , 1.5 , 0.0 , 1.0 , 2.0 , 3.0 ]
160+ ys = [0.0 , 0.0 , 0.0 , 3.0 , 3.0 , 3.0 , 1.0 , 2.0 , 1.5 , 1.5 , 1.5 , 1.5 ]
161+ tris = trifinder (xs , ys )
162+ assert_array_equal (tris , [0 ,2 ,4 ,13 ,15 ,17 ,3 ,14 ,6 ,7 ,10 ,11 ])
163+
164+ # Test points exactly on boundary corners of masked triangulation.
165+ xs = [0.0 , 3.0 ]
166+ ys = [0.0 , 3.0 ]
167+ tris = trifinder (xs , ys )
168+ assert_array_equal (tris , [0 ,17 ])
169+
170+ # Test triangles with horizontal colinear points. These are not valid
171+ # triangulations, but we try to deal with the simplest violations.
172+ delta = 0.0 # If +ve, triangulation is OK, if -ve triangulation invalid,
173+ # if zero have colinear points but should pass tests anyway.
174+ x = [1.5 , 0 , 1 , 2 , 3 , 1.5 , 1.5 ]
175+ y = [- 1 , 0 , 0 , 0 , 0 , delta , 1 ]
176+ triangles = [[0 ,2 ,1 ], [0 ,3 ,2 ], [0 ,4 ,3 ], [1 ,2 ,5 ], [2 ,3 ,5 ], [3 ,4 ,5 ], [1 ,5 ,6 ],
177+ [4 ,6 ,5 ]]
178+ triang = mtri .Triangulation (x , y , triangles )
179+ trifinder = triang .get_trifinder ()
180+
181+ xs = [- 0.1 , 0.4 , 0.9 , 1.4 , 1.9 , 2.4 , 2.9 ]
182+ ys = [- 0.1 ,0.1 ]
183+ xs ,ys = np .meshgrid (xs , ys )
184+ tris = trifinder (xs , ys )
185+ assert_array_equal (tris , [[- 1 ,0 ,0 ,1 ,1 ,2 ,- 1 ],[- 1 ,6 ,6 ,6 ,7 ,7 ,- 1 ]])
186+
187+ # Test triangles with vertical colinear points. These are not valid
188+ # triangulations, but we try to deal with the simplest violations.
189+ delta = 0.0 # If +ve, triangulation is OK, if -ve triangulation invalid,
190+ # if zero have colinear points but should pass tests anyway.
191+ x = [- 1 , - delta , 0 , 0 , 0 , 0 , 1 ]
192+ y = [1.5 , 1.5 , 0 , 1 , 2 , 3 , 1.5 ]
193+ triangles = [[0 ,1 ,2 ], [0 ,1 ,5 ], [1 ,2 ,3 ], [1 ,3 ,4 ], [1 ,4 ,5 ], [2 ,6 ,3 ], [3 ,6 ,4 ],
194+ [4 ,6 ,5 ]]
195+ triang = mtri .Triangulation (x , y , triangles )
196+ trifinder = triang .get_trifinder ()
197+
198+ xs = [- 0.1 ,0.1 ]
199+ ys = [- 0.1 , 0.4 , 0.9 , 1.4 , 1.9 , 2.4 , 2.9 ]
200+ xs ,ys = np .meshgrid (xs , ys )
201+ tris = trifinder (xs , ys )
202+ assert_array_equal (tris , [[- 1 ,- 1 ], [0 ,5 ], [0 ,5 ], [0 ,6 ], [1 ,6 ], [1 ,7 ],
203+ [- 1 ,- 1 ]])
204+
205+ # Test that changing triangulation by setting a mask causes the trifinder
206+ # to be reinitialised.
207+ x = [0 , 1 , 0 , 1 ]
208+ y = [0 , 0 , 1 , 1 ]
209+ triangles = [[0 ,1 ,2 ], [1 ,3 ,2 ]]
210+ triang = mtri .Triangulation (x , y , triangles )
211+ trifinder = triang .get_trifinder ()
212+
213+ xs = [- 0.2 , 0.2 , 0.8 , 1.2 ]
214+ ys = [0.5 , 0.5 , 0.5 , 0.5 ]
215+ tris = trifinder (xs , ys )
216+ assert_array_equal (tris , [- 1 , 0 , 1 , - 1 ])
217+
218+ triang .set_mask ([1 , 0 ])
219+ assert_equal (trifinder , triang .get_trifinder ())
220+ tris = trifinder (xs , ys )
221+ assert_array_equal (tris , [- 1 , - 1 , 1 , - 1 ])
0 commit comments