# 39 의 경우 찾을 수 있는 효율적인 방법으로 what& 거짓한 볼록해집니다 점 점 클라우드? 헐

I have a point 에서 구름이 위치좌표 누마피. I want to 알아보기 위해 더 많은 점, 점 점 놓여 볼록해집니다 헐 클라우드.

하지만 나는 점이 있는지 확인하는 방법을 찾았다 피훌라 알아낼 수 없습니다. "의 컨베스하울":

hull = ConvexHull(np.array([(1, 2), (3, 4), (3, 6)]))
for s in hull.simplices:
    s.in_simplex(np.array([2, 3]))

레이날거로 제기한다. 어레이입니다 반드시 있다.

이것은 쉬운 솔루션이 필요한 국한됨 스키피:

def in_hull(p, hull):
    """
    Test if points in `p` are in `hull`

    `p` should be a `NxK` coordinates of `N` points in `K` dimensions
    `hull` is either a scipy.spatial.Delaunay object or the `MxK` array of the 
    coordinates of `M` points in `K`dimensions for which Delaunay triangulation
    will be computed
    """
    from scipy.spatial import Delaunay
    if not isinstance(hull,Delaunay):
        hull = Delaunay(hull)

    return hull.find_simplex(p)>=0

여기서 'True' 값을 돌려준다 부울입니다 어레이입니다 나탸내도록 놓인 점을 감안할 때 볼록해집니다 보였다. 이렇게 사용할 수 있습니다.

tested = np.random.rand(20,3)
cloud  = np.random.rand(50,3)

print in_hull(tested,cloud)

매플로리브 설치되어 있는 경우, 다음과 같은 결과를 플롯합니다 첫 번째 및 호출하는 함수를 사용할 수도 있습니다. 2d 의 데이터 전용 ',' 어레이에는 Nx2 주어진다.

def plot_in_hull(p, hull):
    """
    plot relative to `in_hull` for 2d data
    """
    import matplotlib.pyplot as plt
    from matplotlib.collections import PolyCollection, LineCollection

    from scipy.spatial import Delaunay
    if not isinstance(hull,Delaunay):
        hull = Delaunay(hull)

    # plot triangulation
    poly = PolyCollection(hull.points[hull.vertices], facecolors='w', edgecolors='b')
    plt.clf()
    plt.title('in hull')
    plt.gca().add_collection(poly)
    plt.plot(hull.points[:,0], hull.points[:,1], 'o', hold=1)

    # plot the convex hull
    edges = set()
    edge_points = []

    def add_edge(i, j):
        """Add a line between the i-th and j-th points, if not in the list already"""
        if (i, j) in edges or (j, i) in edges:
            # already added
            return
        edges.add( (i, j) )
        edge_points.append(hull.points[ [i, j] ])

    for ia, ib in hull.convex_hull:
        add_edge(ia, ib)

    lines = LineCollection(edge_points, color='g')
    plt.gca().add_collection(lines)
    plt.show()    

    # plot tested points `p` - black are inside hull, red outside
    inside = in_hull(p,hull)
    plt.plot(p[ inside,0],p[ inside,1],'.k')
    plt.plot(p[-inside,0],p[-inside,1],'.r')
해설 (7)

이를 위해서는 해당 프로그램 라이브러리를 사용하는 방법에 대한 아아아안녀어엉 실로나는 확실하지 않다. 그러나 이를 위해서는 단순한 알고리즘입니다 설명됨 뜻이다.

  1. 생성하시겠습니까 외부의 말해둘꼐요 점을 보였다. Call it Y
  2. 깔의 연결하는 선분이 시점으로든지 질문 (X) 를 새 지점임 확인하였습니다.
  3. 주위로 루프를 통해 모든 모서리 세그먼트만 볼록해집니다 보였다. 이들 각각의 확인할지 경우 함께 교차시킵니다 세그먼트마다 XY.
  4. 이 경우, X 는 숫자 (0) 등) 은 물론이고 교차 너회가 카운트한 위부의 보였다. 그렇지 않으면 내부의 X 는 보였다.
  5. 헐, 또는 정점 중 하나에 대한 직접 통과할 경우 테스트타사의 XY 중첩됩니다 hull& # 39 의 면쪽, 이동 중 하나에 있는 Y 조금.
  6. 위의 방법은 오목 헐 잘 알려져 있다. 아래에 있는 그림으로의 볼 수 있습니다 (Green dot 은 X 지점임 파악하기 위해 노력하고 있습니다. 노란색 자국이야 교차 지점은. 그림!
해설 (4)

꼭 이래야겠어요 사용하지 않는 볼록해집니다 헐 알고리즘입니다 계산할 필요가 없기 때문에, 헐, 볼록해집니다 있는지 여부를 확인하고 싶은 요점은 다음과 같이 표현될 수 있다.) 의 한 세트의 방향점 볼록해집니다 조합으로의 방황케 서브세트 eventtest 라는 볼록해집니다 보였다. 헐, 특히 높은 치수에는 귀의하매 찾을 볼록해집니다 비싸다구요 계산이 있다.

사실 여부를 확인 문제를 단순한 점 한 점 설정되었습니다 볼록해집니다 조합으로의 다음과 같이 표현될 수 있다 다른 선형 계획법 문제를 마련했습니까 수 있다.

import numpy as np
from scipy.optimize import linprog

def in_hull(points, x):
    n_points = len(points)
    n_dim = len(x)
    c = np.zeros(n_points)
    A = np.r_[points.T,np.ones((1,n_points))]
    b = np.r_[x, np.ones(1)]
    lp = linprog(c, A_eq=A, b_eq=b)
    return lp.success

n_points = 10000
n_dim = 10
Z = np.random.rand(n_points,n_dim)
x = np.random.rand(n_dim)
print(in_hull(Z, x))

예를 들어, 내가 10 득점을 치수에는 10000mb 대한 문제를 해결했다. 실행 시간 () 은 마이크로소프트 (ms) 의 범위. 이 얼마나 걸릴지 알 수 있는 크하우얼 않는 것이 좋습니다.

해설 (14)

첫째, 입수합니다 볼록해집니다 헐 단축시킵니다 점구름.

헐 시계 반대 방향으로 가장자리에 있는 모든 어졌다면 루프를 통해 볼록해집니다 오더할. 각각에 대해, 목표 지점을 &quot left&quot 가장자리들을 여부를 확인할 수 있다;; iqn 면쪽. 이렇게 할 때 주위를 시계 반대 방향으로 처리하는 가장자리들을 포인팅 벡터로 볼록해집니다 보였다. 타겟이 점) 은 &quot left"; 다각형 에 포함된 모든 벡터 것입니다. 그렇지 않으면 위부의 거짓한 일컫는다.

[루프 여부를 확인하고, 이 점은 항상 &quot left&quot,], 1

스택 오버플로 () 이 포함되어 있는 다른 해법을 찾기 항목를 &quot side"; 줄의 점 켜있을: 사항결정 점 거짓한 면을 한 줄

hr /&gt <; 이 복잡한 런타임용으로 개발하십시오 외곽진입 (후에는 이미 볼록해집니다 헐) 는 O (n) 여기서 n 은 가장자리들을 작업자쪽에서 볼록해집니다 헐 수 있다.

참고로 이 볼록해집니다 다각형 대해서만 작동합니다. 하지만, re you& # 39 를 다루는 볼록해집니다 헐 도왔으매 필요에 따라 합니다.

마치 이미 보유하고 있는 방법은 볼록해집니다 헐 단축시킵니다 점구름. 하지만, 자신만의 위키백과 는 구현하십시오 할 찾을 수 있다면 좋은 알고리즘을 목록니다 볼록해집니다 헐 수 있습니다. 볼록해집니다 헐 알고리즘을

해설 (1)

39 의, 이것은 단지 콤프레트니스 poor& man 솔루션:

<! - 언어: 파이썬 - &gt.

import pylab
import numpy
from scipy.spatial import ConvexHull

def is_p_inside_points_hull(points, p):
    global hull, new_points # Remove this line! Just for plotting!
    hull = ConvexHull(points)
    new_points = numpy.append(points, p, axis=0)
    new_hull = ConvexHull(new_points)
    if list(hull.vertices) == list(new_hull.vertices):
        return True
    else:
        return False

# Test:
points = numpy.random.rand(10, 2)   # 30 random points in 2-D
# Note: the number of points must be greater than the dimention.
p = numpy.random.rand(1, 2) # 1 random point in 2-D
print is_p_inside_points_hull(points, p)

# Plot:
pylab.plot(points[:,0], points[:,1], 'o')
for simplex in hull.simplices:
    pylab.plot(points[simplex,0], points[simplex,1], 'k-')
pylab.plot(p[:,0], p[:,1], '^r')
pylab.show()

이 아이디어는 단순합니다. 헐 일련의 방향점 'P' 의 정점을 볼록해집니다 won& # 39 점을 추가할 경우, 'p' t change 속하는 inside&quot "; 선체. 헐 볼록해집니다 의 정점을 위해 ' [P1, P2., Pn]' 와 ' [P1, P2., Pn, p]' 같습니다. 'P' 폭포,, 그 정점을 신앙이니라 &quot outside&quot 바꿔야 한다. 이 방법은 n 차원 계산을 할 수 있지만, '컨베스하울 주택복권에 당첨되셨다고요?'

2d 의 플롯합니다 예:

거짓값:

! 새로운 포인트 (빨강) 폭포 위부의 볼록해집니다 헐

진실:

! 새로운 포인트 (빨간색) 의 볼록해집니다 선체 내부를

해설 (1)

'' 속성 'list. 방정식입니다 컨베스하울':


def point_in_hull(point, hull, tolerance=1e-12):
    return all(
        (np.dot(eq[:-1], point) + eq[-1] 
해설 (0)

마치 사용하고 있는 2D 점 등 때문에 그분이시라 I&; d # 39 의 포함인지 테스트 의 테스트 가르켜 시점으로든지 다각형 볼록해집니다 다각형.

39 의 볼록해집니다 헐 scipy& 찾는 것보다 더 복잡한 알고리즘을 이용하여 2 개 이상의 치수에는 볼록해집니다 선체 원하는거요 사용해야 하는지 kingdome. seattle. 2D 점구름. 그래서 이 번호요 와 같은 다른 알고리즘입니다 사용하는 것이 좋습니다. 이것은 정말로 필요한 시점으로든지 다각형 않기 위해 테스트하는 볼록해집니다 헐 목록은 볼록해집니다 헐 점, 그리고 시계 내부에 주문하십시오 점을 일컫는다.

이 시간 성능을 외곽진입 가 그 뒤를 따랐다.

  • O (N log N) chunghwa 는 볼록해집니다 헐
  • O (h) 에서 전처리 (및 저장할 수 있는 내부 점 쐐기 ᄀ형강 계산하십시오
  • O (log h) 의 시점으로든지 다각형 질의입니다.

여기서 N 은 있는 점 수를 요점이지 클라우드, h 는 구름이 있는 점 수를 요점이지 볼록해집니다 보였다.

해설 (0)

헐 볼록해집니다 유지하려면 스키피 함께 할 수 있습니다 (재발했지 그러하매)

>>> from scipy.spatial import ConvexHull
>>> points = np.random.rand(30, 2)   # 30 random points in 2-D
>>> hull = ConvexHull(points)

다음 목록은 구축하십시오 점을 보였다. 다음은 코드 (doc 플롯하려면 선체

>>> import matplotlib.pyplot as plt
>>> plt.plot(points[:,0], points[:,1], 'o')
>>> for simplex in hull.simplices:
>>>     plt.plot(points[simplex,0], points[simplex,1], 'k-')

그래서 꼭 이래야겠어요 청혼이요 계산하는 것을 시작으로, 선체 방향점 목록

pts_hull = [(points[simplex,0], points[simplex,1]) 
                            for simplex in hull.simplices] 

(단, 내가 범하지 종료기)

또한 자신의 이름으로 따라오렴 계산하기 위한 반환 코드를 헐, x, y 점.

  • 궁금해할까봐 point) 경우 기존 데이터세트를 켜있을 windows*용 수행됨 선체 것입니다.

  • I 그리웠댔지 다운로드되었는지 것이 모든 점은 선체 내부 또는 외부 * 조금 더 많은 일을 해야 합니다. 어떻게 해야 할 수 있을 것입니다.

  • 2 에 대한 모든 가장자리들을 심플리치스 헐: 요점은 여부를 결정할 위 또는 아래에

  • 이 점은 아래의 모든 것이 무엇보다 줄을 선 또는 위부의 헐

이에 따라 그동안 한 줄, 아래 점 이상의 속도 향상, 즉시 채널이어야 선체 내부에 있다.

해설 (4)

를 기반으로 한 지역 내 4 개 면을 슬라이드에서는 빠른 및 더러운 솔루션으로 볼록해집니다 (늘입니다 보다 쉽게 할 수 있습니다)

def same_sign(arr): return np.all(arr > 0) if arr[0] > 0 else np.all(arr < 0)

def inside_quad(pts, pt):
    a =  pts - pt
    d = np.zeros((4,2))
    d[0,:] = pts[1,:]-pts[0,:]
    d[1,:] = pts[2,:]-pts[1,:]
    d[2,:] = pts[3,:]-pts[2,:]
    d[3,:] = pts[0,:]-pts[3,:]
    res = np.cross(a,d)
    return same_sign(res), res

points = np.array([(1, 2), (3, 4), (3, 6), (2.5, 5)])

np.random.seed(1)
random_points = np.random.uniform(0, 6, (1000, 2))

print wlk1.inside_quad(points, random_points[0])
res = np.array([inside_quad(points, p)[0] for p in random_points])
print res[:4]
plt.plot(random_points[:,0], random_points[:,1], 'b.')
plt.plot(random_points[res][:,0], random_points[res][:,1], 'r.')

! [입력하십시오. 이미지 여기에 설명을] [2]

해설 (0)