2013-03-06 8 views
0

предполагают, чтобы иметь два многоугольников p1 и p2, где p2 полностью находится внутри p1объединить две петли в питона

p1 = [(0, 10), (10, 10), (10, 0), (0, 0)] 
p2 = [(2, 6), (6, 6), (6, 2), (2, 2)] 

degree_of_contact = 0 

xyarrays = [p1,p2] 
p1_degree_of_contact = 0 
for x,y in xyarrays[0]: 
     if point_inside_polygon(x,y,xyarrays[1]): 
      p1_degree_of_contact += 1 

p2_degree_of_contact = 0 
for x,y in xyarrays[1]: 
     if point_inside_polygon(x,y,xyarrays[0]): 
      p2_degree_of_contact += 1 

degree_of_contact = p1_degree_of_contact + p2_degree_of_contact 

где point_inside_polygon должен принимать решение, если точка находится внутри (True, False в противном случае) многоугольник, где poly - список пар (x, y), содержащий координаты вершин многоугольника. Алгоритм называется «Ray Casting метод

я хотел бы объединить в элегантный способ (линия кодирования сохранить) обе петли в одном

+0

С Я думаю, что ваша работа уместна, взгляните на numpy, который встроил поддержку векторов и матриц. Есть хорошие трюки, которые вы можете сделать там (например, векторизованные циклы), которые написаны на C и очень быстрые. для скорости: есть тонны встроенных математических методов, которые должны облегчить вашу жизнь для таких проблемы. http://www.scipy.org/Tentative_NumPy_Tutorial – entropiece

ответ

3

должно работать:.

degree_of_contact = 0 
for tmp1, tmp2 in [(p1, p2), (p2, p1)]: 
    for x,y in tmp1: 
     if point_inside_polygon(x, y, tmp2): 
      degree_of_contact += 1 
1
degree_of_contact = sum(point_inside_polygon(x, y, i) for i, j in ((p1, p2), (p2, p1)) for x, y in j)