2012-11-09 3 views
3

저는 파이썬에서 볼록 레이어를 생성하려고 시도하고있는 포인트 목록을 가지고 있습니다.점 집합으로부터 볼록 레이어를 생성하기위한 효율적인 알고리즘

현재 단순히 다음 사용하고 있습니다 : 볼록은 한 번에 하나의 선체 만들 그냥

def convex_layers(points): 
    points = sorted(set(points)) 
    layers = [] 
    while points: 
     #Create the next convex hull 
     hull = convex_hull(points) 

     #Create the new list of points 
     for point in hull: 
     points.remove(point) 

     #Update the list of layers 
     layers.append(hull) 
    return layers 

합니다. 작동하는 동안 반복되는 추가로 간단히 번식하려고하는 것처럼 보입니다. 그래서 내가 바라는 점은 점 집합에서 볼록 레이어를 생성하기위한보다 효율적인 알고리즘이있는 경우입니다.

답변

3

monotone chain algorithm을 사용하는 경우 사전 식 정렬을 한 번만 수행해야합니다. 그러면 각각의 연속적인 계층은 O (n) 시간에 발견 될 수 있습니다. 이것은 각 레이어를 정렬하는 것보다 빠릅니다.

+0

약 10 분 전에 생각한만큼 흥미로운 점이 많습니다. 그래서 당신이 말하는 것은 현재 행해지고있는 일입니다. 아마 이미 가능한 한 잘 돌아 다니고있을 것입니다. 게시물은 이것을 반영하여 업데이트되었습니다. – Nuclearman

+0

그렇다면 내 대답을 수락하는 것이 적절할 수 있습니다. 감사. – Gene

+0

사실입니다. 여전히 생각하고 있지만 각 레이어의 나머지 모든 점을 계속 따라 가야하므로 효율성을 높일 수있는 방법이 있어야합니다. 그래도 큰 개선은 아닐 것입니다. – Nuclearman

0

scipy spatial.convexHull으로 시도 할 수 있습니다.

또는 code on GitHub 게시했습니다.

+0

두 가지 모두 볼록한 선체 만 생산합니다. 이는 무차별 포어 볼록 층의 한 단계입니다. 실제로 [이 pdf] (http://www.cs.princeton.edu/~chazelle/pubs/ConvexLayers.pdf)에 설명 된 알고리즘을 찾고있었습니다. 위의 답변을 수락 한 후에 해당 기사를 찾았지만 그 당시에는 구현하려하지 않았기 때문에 결국 위의 대답이 여전히 받아 들여지고 있습니다. – Nuclearman

관련 문제