Changeset 2200
- Timestamp:
- Jan 11, 2006, 5:31:49 PM (19 years ago)
- Location:
- inundation
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
inundation/pmesh/mesh.py
r2144 r2200 28 28 import load_mesh 29 29 from coordinate_transforms.geo_reference import Geo_reference,DEFAULT_ZONE 30 from utilities.polygon import point_in_polygon 30 31 31 32 SET_COLOUR='red' … … 185 186 Defined by a point in the hole enclosed by segments. 186 187 """ 188 187 189 HOLECORNERLENGTH = 6 190 188 191 def draw(self, canvas, tags, colour = 'purple',scale = 1, xoffset = 0, yoffset =0, ): 189 192 x = scale*(self.x + xoffset) … … 396 399 Null represents no neighbor 397 400 """ 398 self.attribute = attribute 401 self.attribute = attribute #this is a string 399 402 400 403 def __repr__(self): … … 501 504 self.meshVertices=[] 502 505 503 #Peters stuff504 # FIXME (DSG) Sets of what?505 506 self.setID={} 506 507 #a dictionary of names. … … 667 668 self.regions.append(h) 668 669 return h 669 670 671 #FIXME(DSG-DSG) remove EN, have a relative flag. 670 672 def addRegionEN(self, x,y): 671 673 h=Region(x-self.geo_reference.xllcorner, … … 673 675 self.regions.append(h) 674 676 return h 675 677 def addRegionFromPolygon(self, polygon, tags=None, 678 maxArea=None, Geo_ref=None): 679 #take into account georef 680 #create points, segs and tags 681 region_dict = {} 682 region_dict['points'] = polygon 683 684 #Create segments 685 #E.g. [[0,1], [1,2], [2,3], [3,0]] 686 segments = [] 687 N = len(polygon) 688 for i in range(N): 689 lo = i 690 hi = (lo + 1) % N 691 segments.append( [lo, hi] ) 692 region_dict['segments'] = segments 693 694 695 #Create tags 696 #E.g. ['wall', 'wall', 'ocean', 'wall'] 697 698 segment_tags = ['']*N 699 if tags is not None: 700 for key in tags: 701 indices = tags[key] 702 for i in indices: 703 segment_tags[i] = key 704 region_dict['segment_tags'] = segment_tags 705 706 self.addVertsSegs(region_dict) #this is assuming absolute geos 707 708 #get inner point 709 inner_point = point_in_polygon(polygon) 710 inner = self.addRegionEN(inner_point[0], inner_point[1]) 711 712 if maxArea is not None: 713 inner.setMaxArea(maxArea) 714 676 715 def getUserVertices(self): 677 716 return self.userVertices … … 1312 1351 segs2delete = self.alphaUserSegments 1313 1352 #FIXME(DSG-DSG) this algorithm needs comments 1314 #FIXME(DSG-DSG) can it be sped up? It's slow1315 1353 new_segs = {} 1316 1354 #alpha_segs = [] … … 1603 1641 yoffset = HEIGHT - b 1604 1642 return [SCALE, xoffset, yoffset] 1605 1606 def plotMeshTriangle(self,tag = 0,WIDTH = 400,HEIGHT = 400): 1607 """ 1608 Plots all node connections. 1609 tag = 0 (no node numbers), tag = 1 (node numbers) 1610 """ 1611 1612 try: 1613 from Tkinter import Tk, Frame, Button, Canvas, BOTTOM, Label 1614 1615 [SCALE, xoffset, yoffset] = self.scaleoffset( WIDTH, HEIGHT) 1616 1617 root = Tk() 1618 frame = Frame(root) 1619 frame.pack() 1620 button = Button(frame, text="OK", fg="red", command=frame.quit) 1621 button.pack(side=BOTTOM) 1622 canvas = Canvas(frame,bg="white", width=WIDTH, height=HEIGHT) 1623 canvas.pack() 1624 text = Label(frame, width=20, height=10, text='triangle mesh') 1625 text.pack() 1626 1627 #print self.meshTriangles 1628 for triangle in self.meshTriangles: 1629 triangle.draw(canvas,1, 1630 scale = SCALE, 1631 xoffset = xoffset, 1632 yoffset = yoffset ) 1633 1634 root.mainloop() 1635 1636 except: 1637 print "Unexpected error:", sys.exc_info()[0] 1638 raise 1639 1640 #print """ 1641 #node::plot Failed. 1642 #Most probably, the Tkinter module is not available. 1643 #""" 1644 1645 def plotUserSegments(self,tag = 0,WIDTH = 400,HEIGHT = 400): 1646 """ 1647 Plots all node connections. 1648 tag = 0 (no node numbers), tag = 1 (node numbers) 1649 """ 1650 1651 try: 1652 from Tkinter import Tk, Frame, Button, Canvas, BOTTOM, Label 1653 1654 [SCALE, xoffset, yoffset] = self.scaleoffset( WIDTH, HEIGHT) 1655 1656 root = Tk() 1657 frame = Frame(root) 1658 frame.pack() 1659 button = Button(frame, text="OK", fg="red", command=frame.quit) 1660 button.pack(side=BOTTOM) 1661 canvas = Canvas(frame, bg="white", width=WIDTH, height=HEIGHT) 1662 canvas.pack() 1663 text = Label(frame, width=20, height=10, text='user segments') 1664 text.pack() 1665 1666 for segment in self.getUserSegments(): 1667 segment.draw(canvas,SCALE, xoffset, yoffset ) 1668 1669 root.mainloop() 1670 1671 except: 1672 print "Unexpected error:", sys.exc_info()[0] 1673 raise 1674 1675 #print """ 1676 #node::plot Failed. 1677 #Most probably, the Tkinter module is not available. 1678 #""" 1679 1680 1643 1644 1681 1645 def exportASCIIobj(self,ofile): 1682 1646 """ -
inundation/pmesh/test_mesh.py
r2145 r2200 1198 1198 'Wrong segment tag.') 1199 1199 1200 def test_addVertsSegs2(self): 1201 geo = Geo_reference(56,5,10) 1202 m = Mesh(geo_reference=geo) 1203 dict = {} 1204 dict['points'] = [[2.0, 1.0], [3.0, 1.0], [2.0, 2.0]] 1205 dict['segments'] = [[0, 1], [1, 2], [2,0]] 1206 dict['segment_tags'] = ['','do-op',''] 1207 m.addVertsSegs(dict) 1208 1200 1209 def test_exportASCIImeshfile(self): 1201 1210 … … 1490 1499 1491 1500 1492 #___________begin ing of Peters tests1501 #___________beginning of Peters tests 1493 1502 1494 1503 def test_set_stuff(self): … … 1644 1653 assert not range(17) in a 1645 1654 1655 #___________end of Peters tests 1656 1657 def test_addRegionFromPolygon(self): 1658 m=Mesh() 1659 m.addRegionFromPolygon([[0,0],[1,0],[0,1]]) 1660 self.failUnless(len(m.regions)==1, 1661 'FAILED!') 1662 self.failUnless(len(m.getUserSegments())==3, 1663 'FAILED!') 1664 self.failUnless(len(m.userVertices)==3, 1665 'FAILED!') 1666 1667 def test_addRegionFromPolygon2(self): 1668 m=Mesh() 1669 m.addRegionFromPolygon([[0,0],[1,0],[1,1],[0,1]], 1670 {'tagin':[0,1],'bom':[2]}) 1671 self.failUnless(len(m.regions)==1, 1672 'FAILED!') 1673 segs = m.getUserSegments() 1674 self.failUnless(len(segs)==4, 1675 'FAILED!') 1676 self.failUnless(len(m.userVertices)==4, 1677 'FAILED!') 1678 self.failUnless(segs[0].tag=='tagin', 1679 'FAILED!') 1680 self.failUnless(segs[1].tag=='tagin', 1681 'FAILED!') 1682 1683 self.failUnless(segs[2].tag=='bom', 1684 'FAILED!') 1685 self.failUnless(segs[3].tag=='', 1686 'FAILED!') 1687 1688 1646 1689 1647 1690 def list_comp(A,B): -
inundation/pyvolution/coordinate_transforms/geo_reference.py
r1662 r2200 115 115 """ 116 116 Change the reference of a list or Numeric array of points. 117 If the points do not have a geo ref, assume 'absolute' values117 If the points do not have a geo ref, assume 'absolute' values 118 118 """ 119 119 is_list = False -
inundation/utilities/polygon.py
r2062 r2200 461 461 return points 462 462 463 463 def point_in_polygon(polygon, delta=1e-8): 464 """Return a point inside a given polygon which will be close to the 465 polygon edge. 466 467 Input: 468 polygon - list of vertices of polygon 469 delta - the square root of 2 * delta is the maximum distance from the 470 polygon points and the returned point. 471 Output: 472 points - a point inside polygon 473 474 searches in all diagonals and up and down (not left and right) 475 """ 476 import exceptions 477 class Found(exceptions.Exception): pass 478 479 point_in = False 480 while not point_in: 481 try: 482 for poly_point in polygon: #[1:]: 483 for x_mult in range (-1,2): 484 for y_mult in range (-1,2): 485 x = poly_point[0] 486 y = poly_point[1] 487 if x == 0: 488 x_delta = x_mult*delta 489 else: 490 x_delta = x+x_mult*x*delta 491 492 if y == 0: 493 y_delta = y_mult*delta 494 else: 495 y_delta = y+y_mult*y*delta 496 497 point = [x_delta, y_delta] 498 #print "point",point 499 if inside_polygon( point, polygon, closed = False ): 500 raise Found 501 except Found: 502 point_in = True 503 else: 504 delta = delta*0.1 505 return point 464 506 465 507 -
inundation/utilities/test_polygon.py
r2062 r2200 379 379 assert not inside_polygon(point, ex_poly), '%s' %str(point) 380 380 381 381 def test_point_in_polygon(self): 382 polygon = [[0,0], [1,0], [1,1], [0,1]] 383 point = point_in_polygon(polygon) 384 assert inside_polygon(point, polygon) 385 386 #this get's into a vicious loop 387 polygon = [[1e32,1e54], [1,0], [1,1], [0,1]] 388 point = point_in_polygon(polygon) 389 assert inside_polygon(point, polygon) 390 391 392 polygon = [[0,0], [1,0], [1,1], [1e8,1e8]] 393 point = point_in_polygon(polygon) 394 assert inside_polygon(point, polygon) 395 396 polygon = [[1e32,1e54], [-1e32,1e54],[1e32,-1e54]] 397 point = point_in_polygon(polygon) 398 assert inside_polygon(point, polygon) 399 400 polygon = [[1e32,1e54], [1,0], [0,1]] 401 point = point_in_polygon(polygon) 402 assert inside_polygon(point, polygon) 382 403 383 404 #-------------------------------------------------------------
Note: See TracChangeset
for help on using the changeset viewer.