Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2014
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.31 KB | None | 0 0
  1. class Point:
  2.     def __init__(self, x=None, y=None):
  3.         self.x = x or 0.0
  4.         self.y = y or 0.0
  5.  
  6.     def __str__(self):
  7.         return '(' + str(self.x) + ', ' + str(self.y) + ')'
  8.  
  9.     def __hash__(self):
  10.         return self.__str__().__hash__()
  11.  
  12.     def __eq__(self, other):
  13.         return self.__str__() == other.__str__()
  14.  
  15.  
  16. class Edge:
  17.     def __init__(self, a=None, b=None):
  18.         self.a = a or Point()
  19.         self.b = b or Point()
  20.  
  21.     def __str__(self):
  22.         return '[' + str(self.a) + '; ' + str(self.b) + ']'
  23.  
  24.  
  25. def _point_on_segment(edge, p):
  26.     if min(edge.a.x, edge.b.x) <= p.x <= max(edge.a.x, edge.b.x) and min(edge.a.y, edge.b.y) <= p.y <= max(edge.a.y, edge.b.y):
  27.         return True
  28.     return False
  29.  
  30. def _intersection_point(E1, E2):
  31.     P1 = E1.a
  32.     P2 = E1.b
  33.     P3 = E2.a
  34.     P4 = E2.b
  35.  
  36.     A1 = (P1.y - P2.y) / (P1.x - P2.x) if P1.x != P2.x else P1.x
  37.     A2 = (P3.y - P4.y) / (P3.x - P4.x) if P3.x != P4.x else P3.x
  38.     B1 = P1.y - A1 * P1.x
  39.     B2 = P3.y - A2 * P3.x
  40.  
  41.     # parallel segments
  42.     if A1 == A2:
  43.         return True
  44.  
  45.     Xa = (B2 - B1) / (A1 - A2)
  46.     Ya = A1 * Xa + B1
  47.  
  48.     # no intersections
  49.     if Xa < max(min(P1.x, P2.x), min(P3.x, P4.x)) or Xa > min(max(P1.x, P2.x), max(P3.x, P4.x)):
  50.         return False
  51.  
  52.     return Point(Xa, Ya)
  53.  
  54.  
  55. class Shape:
  56.     def __init__(self, edges=None, vertices=None):
  57.         self.edges = edges or []
  58.         self.vertices = vertices or []
  59.  
  60.     def area(self):
  61.         S = 0.0
  62.         for i, j in zip(self.vertices, self.vertices[1:]) + [(self.vertices[-1], self.vertices[0])]:
  63.             S += (i.x + j.x) * (i.y - j.y)
  64.         return 0.5 * abs(S)
  65.  
  66.     def point_in_polygon(self, A):
  67.         N = len(self.vertices)
  68.         inside = False
  69.  
  70.         P1 = self.vertices[0]
  71.         for i in xrange(N+1):
  72.             P2 = self.vertices[i % N]
  73.             if min(P1.y, P2.y) < A.y <= max(P1.y, P2.y):
  74.                 if A.x <= max(P1.x, P2.x):
  75.                     if P1.y != P2.y:
  76.                         xints = P1.x + (A.y - P1.y)*(P2.x - P1.x)/(P2.y - P1.y)
  77.                     if P1.x == P2.x or A.x <= xints:
  78.                         inside = not inside
  79.             P1 = P2
  80.  
  81.         return inside
  82.  
  83.     def __str__(self):
  84.         return '{ ' + ' | '.join([str(edge) for edge in self.edges]) + ' }'
  85.  
  86.  
  87. def _intersect_poly(poly1, poly2):
  88.     points = {}
  89.     res = Shape()
  90.     extra = {}
  91.  
  92.     for edge1 in poly1.edges:
  93.         points[edge1] = []
  94.  
  95.         for edge2 in poly2.edges:
  96.             new_vertex = _intersection_point(edge1, edge2)
  97.             if new_vertex not in (True, False):
  98.                 points[edge1].append(new_vertex)
  99.                 if edge2 in extra:
  100.                     extra[edge2].append(new_vertex)
  101.                 else:
  102.                     extra[edge2] = [new_vertex]
  103.  
  104.         # Edge doesn't cross
  105.         if len(points[edge1]) == 0:
  106.             continue
  107.  
  108.         elif len(points[edge1]) == 1:
  109.             a = edge1.a
  110.             b = edge1.b
  111.  
  112.             res.vertices.append(points[edge1][0])
  113.             if poly2.point_in_polygon(a):
  114.                 res.edges.append(Edge(a, points[edge1][0]))
  115.                 res.vertices.append(a)
  116.             else:
  117.                 res.edges.append(Edge(b, points[edge1][0]))
  118.                 res.vertices.append(b)
  119.  
  120.         elif len(points[edge1]) == 2:
  121.             a = points[edge1][0]
  122.             b = points[edge1][1]
  123.  
  124.             res.edges.append(Edge(a, b))
  125.             res.vertices.append(a)
  126.             res.vertices.append(b)
  127.  
  128.     for k, v in extra.iteritems():
  129.         if len(v) == 2:
  130.             res.edges.append(Edge(v[0], v[1]))
  131.  
  132.     res.vertices = list(set(res.vertices))
  133.     return res if len(res.vertices) != 0 else None
  134.  
  135.  
  136. # TRIANGLES
  137. print('Getting info from 515_flap_verh.bdf')
  138.  
  139. triangle_grid_file = open("515_flap_verh.bdf", "r")
  140. triangle_grid_strings = triangle_grid_file.readlines()
  141. triangle_grid_file.close()
  142.  
  143. # Nodes coords
  144. nodes_strings = filter(lambda s: s.startswith('GRID*'), triangle_grid_strings)
  145.  
  146. triangle_grid_nodes = {}
  147. for s in nodes_strings:
  148.     temp_str = s.split()
  149.     N = int(temp_str[1])
  150.     x = float(temp_str[3])
  151.     y = float(temp_str[4])
  152.  
  153.     triangle_grid_nodes[N] = Point(x, y)
  154.  
  155. # Triangles
  156. elems_strings = filter(lambda s: s.startswith('CTRIA3'), triangle_grid_strings)
  157.  
  158. triangle_grid_elements = {}
  159. for s in elems_strings:
  160.     temp_str = s.split()
  161.     N = int(temp_str[1])
  162.     v1 = int(temp_str[3])
  163.     v2 = int(temp_str[4])
  164.     v3 = int(temp_str[5])
  165.  
  166.     triangle_grid_elements[N] = (v1, v2, v3)
  167.  
  168.  
  169. # Pressures
  170. press_strings = filter(lambda s: s.startswith('PLOAD2*'), triangle_grid_strings)
  171.  
  172. triangle_grid_pressures = {}
  173. for s in press_strings:
  174.     temp_str = s.split()
  175.     N = int(temp_str[3])
  176.     P = float(temp_str[2])
  177.  
  178.     triangle_grid_pressures[N] = P
  179.  
  180.  
  181. # QUADS
  182. print('Getting info from 000_Flaperon.bdf')
  183.  
  184. quad_grid_file = open("000_Flaperon.bdf", "r")
  185. quad_grid_strings = quad_grid_file.readlines()
  186. quad_grid_file.close()
  187.  
  188. # Nodes
  189. nodes_strings = filter(lambda s: s.startswith('GRID'), quad_grid_strings)
  190.  
  191. quad_grid_nodes = {}
  192. for s in nodes_strings:
  193.     temp_str = s.split()
  194.     N = int(temp_str[1])
  195.     x = float(temp_str[2]) / 1000.0
  196.     y = float(temp_str[3]) / 1000.0
  197.  
  198.     quad_grid_nodes[N] = Point(x, y)
  199.  
  200.  
  201. # Elems
  202. elems_strings = filter(lambda s: s.startswith('CQUAD4'), quad_grid_strings)
  203.  
  204. quad_grid_elements = {}
  205. for s in elems_strings:
  206.     temp_str = s.split()
  207.     N = int(temp_str[1])
  208.     v1 = int(temp_str[3])
  209.     v2 = int(temp_str[4])
  210.     v3 = int(temp_str[5])
  211.     v4 = int(temp_str[6])
  212.  
  213.     quad_grid_elements[N] = (v1, v2, v3, v4)
  214.  
  215.  
  216. # BUILD SHAPES
  217. print('Building triangles...')
  218.  
  219. TRIANGLES = {}
  220. for k, v in triangle_grid_elements.iteritems():
  221.     v1 = triangle_grid_nodes[v[0]]
  222.     v2 = triangle_grid_nodes[v[1]]
  223.     v3 = triangle_grid_nodes[v[2]]
  224.  
  225.     e1 = Edge(v1, v2)
  226.     e2 = Edge(v2, v3)
  227.     e3 = Edge(v1, v3)
  228.  
  229.     S = Shape(edges=[e1,e2,e3], vertices=[v1,v2,v3])
  230.     area = S.area()
  231.     pressure = triangle_grid_pressures[k]
  232.  
  233.     TRIANGLES[k] = (S, area, pressure)
  234.  
  235. # BUILD QUADS
  236. print('Building quads...')
  237.  
  238. QUADS = {}
  239. for k, v in quad_grid_elements.iteritems():
  240.     v1 = quad_grid_nodes[v[0]]
  241.     v2 = quad_grid_nodes[v[1]]
  242.     v3 = quad_grid_nodes[v[2]]
  243.     v4 = quad_grid_nodes[v[3]]
  244.  
  245.     e1 = Edge(v1, v2)
  246.     e2 = Edge(v2, v3)
  247.     e3 = Edge(v3, v4)
  248.     e4 = Edge(v1, v4)
  249.  
  250.     S = Shape(edges=[e1,e2,e3,e4], vertices=[v1,v2,v3,v4])
  251.  
  252.     QUADS[k] = S
  253.  
  254.  
  255. # MAIN LOOP
  256. print('Calculation...')
  257.  
  258. res_pressures = {}
  259.  
  260. for triangle_n, triangle_info in TRIANGLES.iteritems():
  261.     triangle = triangle_info[0]
  262.     triangle_area = triangle_info[1]
  263.     triangle_pressure = triangle_info[2]
  264.  
  265.     for quad_n, quad in QUADS.iteritems():
  266.         intersection = _intersect_poly(triangle, quad)
  267.         if intersection:
  268.             areas_ratio = intersection.area() / triangle_area
  269.             pressure = triangle_pressure * areas_ratio
  270.             if quad_n in res_pressures:
  271.                 res_pressures[quad_n].append(pressure)
  272.             else:
  273.                 res_pressures[quad_n] = [pressure]
  274.  
  275.  
  276. print('Done!')
  277.  
  278. res_file = open('res.txt', 'w')
  279. RES = {}
  280. for k, v in res_pressures.iteritems():
  281.     RES[k] = sum(v) / len(v)
  282.     res_file.write(str(k) + ': ' + str(RES[k]) + '\n')
  283.  
  284. res_file.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement