@@ -131,3 +131,127 @@ 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 ],
141+ [3 , 7 , 6 ], [4 , 5 , 8 ], [5 , 9 , 8 ], [5 , 6 , 9 ], [6 , 10 , 9 ],
142+ [6 , 7 , 10 ], [7 , 11 , 10 ], [8 , 9 , 12 ], [9 , 13 , 12 ], [9 , 10 , 13 ],
143+ [10 , 14 , 13 ], [10 , 11 , 14 ], [11 , 15 , 14 ]]
144+ mask = np .zeros (len (triangles ))
145+ mask [8 :10 ] = 1
146+ triang = mtri .Triangulation (x , y , triangles , mask )
147+ trifinder = triang .get_trifinder ()
148+
149+ xs = [0.25 , 1.25 , 2.25 , 3.25 ]
150+ ys = [0.25 , 1.25 , 2.25 , 3.25 ]
151+ xs , ys = np .meshgrid (xs , ys )
152+ xs = xs .ravel ()
153+ ys = ys .ravel ()
154+ tris = trifinder (xs , ys )
155+ assert_array_equal (tris , [0 , 2 , 4 , - 1 , 6 , - 1 , 10 , - 1 ,
156+ 12 , 14 , 16 , - 1 , - 1 , - 1 , - 1 , - 1 ])
157+ tris = trifinder (xs - 0.5 , ys - 0.5 )
158+ assert_array_equal (tris , [- 1 , - 1 , - 1 , - 1 , - 1 , 1 , 3 , 5 ,
159+ - 1 , 7 , - 1 , 11 , - 1 , 13 , 15 , 17 ])
160+
161+ # Test points exactly on boundary edges of masked triangulation.
162+ 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 ]
163+ 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 ]
164+ tris = trifinder (xs , ys )
165+ assert_array_equal (tris , [0 , 2 , 4 , 13 , 15 , 17 , 3 , 14 , 6 , 7 , 10 , 11 ])
166+
167+ # Test points exactly on boundary corners of masked triangulation.
168+ xs = [0.0 , 3.0 ]
169+ ys = [0.0 , 3.0 ]
170+ tris = trifinder (xs , ys )
171+ assert_array_equal (tris , [0 , 17 ])
172+
173+ # Test triangles with horizontal colinear points. These are not valid
174+ # triangulations, but we try to deal with the simplest violations.
175+ delta = 0.0 # If +ve, triangulation is OK, if -ve triangulation invalid,
176+ # if zero have colinear points but should pass tests anyway.
177+ x = [1.5 , 0 , 1 , 2 , 3 , 1.5 , 1.5 ]
178+ y = [- 1 , 0 , 0 , 0 , 0 , delta , 1 ]
179+ triangles = [[0 , 2 , 1 ], [0 , 3 , 2 ], [0 , 4 , 3 ], [1 , 2 , 5 ], [2 , 3 , 5 ],
180+ [3 , 4 , 5 ], [1 , 5 , 6 ], [4 , 6 , 5 ]]
181+ triang = mtri .Triangulation (x , y , triangles )
182+ trifinder = triang .get_trifinder ()
183+
184+ xs = [- 0.1 , 0.4 , 0.9 , 1.4 , 1.9 , 2.4 , 2.9 ]
185+ ys = [- 0.1 , 0.1 ]
186+ xs , ys = np .meshgrid (xs , ys )
187+ tris = trifinder (xs , ys )
188+ assert_array_equal (tris , [[- 1 , 0 , 0 , 1 , 1 , 2 , - 1 ],
189+ [- 1 , 6 , 6 , 6 , 7 , 7 , - 1 ]])
190+
191+ # Test triangles with vertical colinear points. These are not valid
192+ # triangulations, but we try to deal with the simplest violations.
193+ delta = 0.0 # If +ve, triangulation is OK, if -ve triangulation invalid,
194+ # if zero have colinear points but should pass tests anyway.
195+ x = [- 1 , - delta , 0 , 0 , 0 , 0 , 1 ]
196+ y = [1.5 , 1.5 , 0 , 1 , 2 , 3 , 1.5 ]
197+ triangles = [[0 , 1 , 2 ], [0 , 1 , 5 ], [1 , 2 , 3 ], [1 , 3 , 4 ], [1 , 4 , 5 ],
198+ [2 , 6 , 3 ], [3 , 6 , 4 ], [4 , 6 , 5 ]]
199+ triang = mtri .Triangulation (x , y , triangles )
200+ trifinder = triang .get_trifinder ()
201+
202+ xs = [- 0.1 , 0.1 ]
203+ ys = [- 0.1 , 0.4 , 0.9 , 1.4 , 1.9 , 2.4 , 2.9 ]
204+ xs , ys = np .meshgrid (xs , ys )
205+ tris = trifinder (xs , ys )
206+ assert_array_equal (tris , [[- 1 , - 1 ], [0 , 5 ], [0 , 5 ], [0 , 6 ], [1 , 6 ], [1 , 7 ],
207+ [- 1 , - 1 ]])
208+
209+ # Test that changing triangulation by setting a mask causes the trifinder
210+ # to be reinitialised.
211+ x = [0 , 1 , 0 , 1 ]
212+ y = [0 , 0 , 1 , 1 ]
213+ triangles = [[0 , 1 , 2 ], [1 , 3 , 2 ]]
214+ triang = mtri .Triangulation (x , y , triangles )
215+ trifinder = triang .get_trifinder ()
216+
217+ xs = [- 0.2 , 0.2 , 0.8 , 1.2 ]
218+ ys = [0.5 , 0.5 , 0.5 , 0.5 ]
219+ tris = trifinder (xs , ys )
220+ assert_array_equal (tris , [- 1 , 0 , 1 , - 1 ])
221+
222+ triang .set_mask ([1 , 0 ])
223+ assert_equal (trifinder , triang .get_trifinder ())
224+ tris = trifinder (xs , ys )
225+ assert_array_equal (tris , [- 1 , - 1 , 1 , - 1 ])
226+
227+ def test_triinterp ():
228+ # Test points within triangles of masked triangulation.
229+ x , y = np .meshgrid (np .arange (4 ), np .arange (4 ))
230+ x = x .ravel ()
231+ y = y .ravel ()
232+ z = 1.23 * x - 4.79 * y
233+ triangles = [[0 , 1 , 4 ], [1 , 5 , 4 ], [1 , 2 , 5 ], [2 , 6 , 5 ], [2 , 3 , 6 ],
234+ [3 , 7 , 6 ], [4 , 5 , 8 ], [5 , 9 , 8 ], [5 , 6 , 9 ], [6 , 10 , 9 ],
235+ [6 , 7 , 10 ], [7 , 11 , 10 ], [8 , 9 , 12 ], [9 , 13 , 12 ], [9 , 10 , 13 ],
236+ [10 , 14 , 13 ], [10 , 11 , 14 ], [11 , 15 , 14 ]]
237+ mask = np .zeros (len (triangles ))
238+ mask [8 :10 ] = 1
239+ triang = mtri .Triangulation (x , y , triangles , mask )
240+ linear_interp = mtri .LinearTriInterpolator (triang , z )
241+
242+ xs = np .linspace (0.25 , 2.75 , 6 )
243+ ys = [0.25 , 0.75 , 2.25 , 2.75 ]
244+ xs , ys = np .meshgrid (xs , ys )
245+ xs = xs .ravel ()
246+ ys = ys .ravel ()
247+ zs = linear_interp (xs , ys )
248+ assert_array_almost_equal (zs , (1.23 * xs - 4.79 * ys ))
249+
250+ # Test points outside triangulation.
251+ xs = [- 0.25 , 1.25 , 1.75 , 3.25 ]
252+ ys = xs
253+ xs , ys = np .meshgrid (xs , ys )
254+ xs = xs .ravel ()
255+ ys = ys .ravel ()
256+ zs = linear_interp (xs , ys )
257+ assert_array_equal (zs .mask , [True ]* 16 )
0 commit comments