2015-01-02 3 views
0

라이브러리를 사용하지 않고 두 폴리 라인이 교차하는지 테스트 할 간단한 솔루션이 있습니까?폴리 라인을 파이썬을 사용하여 교차하는지 테스트하십시오.

같은

PL1 = ((-1, -1), (1, -1), (1, 2)), PL2 = ((0, 1), (2, 1)) 

PL1.intersect(PL2) 

나는 단지 2 점 라인에 대한 해결책을 찾을 수 있어요.

+1

라이브러리를 사용하지 않고 있습니다!? 왜 바퀴를 재발견합니까? – tnknepp

+0

@tnkneppp에 동의합니다. 'PL1'과'PL2'에서 정확히 비슷한 튜플이 있다면 비교할 것이기 때문에 코드가 작동하지 않습니다. 또한'intersect' 메소드에'set'이 필요합니다. – Sebastian

+0

폴리선은 두 개의 점이있는 여러 줄의 연속입니다. 두 개의 점선에 대해 사용하는 것과 동일한 기술을 사용하여 모든 세그먼트의 교차점을 확인하는 것이 가장 좋은 이유는 무엇입니까? 폴리 라인이 실제로 곡선이 아닌 한. –

답변

0

주석에서 언급했듯이 폴리곤의 모든 구성 요소 선 사이에 선 교차점 (this for example)의 전통적인 알고리즘을 적용 할 수 있습니다. 예 :

def line_intersection(line1, line2): 
    xdiff = (line1[0][0] - line1[1][0], line2[0][0] - line2[1][0]) 
    ydiff = (line1[0][1] - line1[1][1], line2[0][1] - line2[1][1]) 

    def det(a, b): 
     return a[0] * b[1] - a[1] * b[0] 

    div = det(xdiff, ydiff) 
    if div == 0: 
     return None 

    d = (det(*line1), det(*line2)) 
    x = det(d, xdiff)/div 
    y = det(d, ydiff)/div 
    return x, y 

def poly_intersection(poly1, poly2): 

    for i, p1_first_point in enumerate(poly1[:-1]): 
     p1_second_point = poly1[i + 1] 

     for j, p2_first_point in enumerate(poly2[:-1]): 
      p2_second_point = poly2[j + 1] 

      if line_intersection((p1_first_point, p1_second_point), (p2_first_point, p2_second_point)): 
       return True 

    return False 

PL1 = ((-1, -1), (1, -1), (1, 2)) 
PL2 = ((0, 1), (2, 1)) 

print poly_intersection(PL1, PL2) 
+0

감사합니다. 나는 코드의 아주 단순하고 마지막 부분을 확신하지 못했다. 방금 루프를 반복해야했습니다. –