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')
이를 위해서는 해당 프로그램 라이브러리를 사용하는 방법에 대한 아아아안녀어엉 실로나는 확실하지 않다. 그러나 이를 위해서는 단순한 알고리즘입니다 설명됨 뜻이다.
꼭 이래야겠어요 사용하지 않는 볼록해집니다 헐 알고리즘입니다 계산할 필요가 없기 때문에, 헐, 볼록해집니다 있는지 여부를 확인하고 싶은 요점은 다음과 같이 표현될 수 있다.) 의 한 세트의 방향점 볼록해집니다 조합으로의 방황케 서브세트 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) 의 범위. 이 얼마나 걸릴지 알 수 있는 크하우얼 않는 것이 좋습니다.
첫째, 입수합니다 볼록해집니다 헐 단축시킵니다 점구름.
헐 시계 반대 방향으로 가장자리에 있는 모든 어졌다면 루프를 통해 볼록해집니다 오더할. 각각에 대해, 목표 지점을 " left" 가장자리들을 여부를 확인할 수 있다;; iqn 면쪽. 이렇게 할 때 주위를 시계 반대 방향으로 처리하는 가장자리들을 포인팅 벡터로 볼록해집니다 보였다. 타겟이 점) 은 " left"; 다각형 에 포함된 모든 벡터 것입니다. 그렇지 않으면 위부의 거짓한 일컫는다.
[루프 여부를 확인하고, 이 점은 항상 " left",], 1
스택 오버플로 () 이 포함되어 있는 다른 해법을 찾기 항목를 " side"; 줄의 점 켜있을: 사항결정 점 거짓한 면을 한 줄
hr /> <; 이 복잡한 런타임용으로 개발하십시오 외곽진입 (후에는 이미 볼록해집니다 헐) 는 O (n) 여기서 n 은 가장자리들을 작업자쪽에서 볼록해집니다 헐 수 있다.
참고로 이 볼록해집니다 다각형 대해서만 작동합니다. 하지만, re you& # 39 를 다루는 볼록해집니다 헐 도왔으매 필요에 따라 합니다.
마치 이미 보유하고 있는 방법은 볼록해집니다 헐 단축시킵니다 점구름. 하지만, 자신만의 위키백과 는 구현하십시오 할 찾을 수 있다면 좋은 알고리즘을 목록니다 볼록해집니다 헐 수 있습니다. 볼록해집니다 헐 알고리즘을
<! - 언어: 파이썬 - >.
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" "; 선체. 헐 볼록해집니다 의 정점을 위해 ' [P1, P2., Pn]' 와 ' [P1, P2., Pn, p]' 같습니다. 'P' 폭포,, 그 정점을 신앙이니라 " outside" 바꿔야 한다. 이 방법은 n 차원 계산을 할 수 있지만, '컨베스하울 주택복권에 당첨되셨다고요?'
2d 의 플롯합니다 예:
거짓값:
! 새로운 포인트 (빨강) 폭포 위부의 볼록해집니다 헐
진실:
'' 속성 'list. 방정식입니다 컨베스하울':
def point_in_hull(point, hull, tolerance=1e-12):
return all(
(np.dot(eq[:-1], point) + eq[-1] <= tolerance)
for eq in hull.equations)
헐 나치도요 있는 점이 있는 경우에만 joyon. 요점이지 및 제품 사이의 모든 방정식입니다 (설명하는 facets) 이 수직 벡터 ('eq 1') 와 오프셋된 ('eq [- 1]') 는 작거나 같은 제로. 아주 적은 양의 상수 비교해야 할 수 있습니다 ',' 보다는 '제로' 로 허용치로 = 1e 12 문제 때문에 숫자 precisiontm (그렇지 않으면 찾을 수 있는 이 볼록해집니다 교점까지의 볼록해집니다 헐 헐 있지 않습니다).
데모:
import matplotlib.pyplot as plt
import numpy as np
from scipy.spatial import ConvexHull
points = np.array([(1, 2), (3, 4), (3, 6), (2, 4.5), (2.5, 5)])
hull = ConvexHull(points)
np.random.seed(1)
random_points = np.random.uniform(0, 6, (100, 2))
for simplex in hull.simplices:
plt.plot(points[simplex, 0], points[simplex, 1])
plt.scatter(*points.T, alpha=.5, color='k', s=200, marker='v')
for p in random_points:
point_is_in_hull = point_in_hull(p, hull)
marker = 'x' if point_is_in_hull else 'd'
color = 'g' if point_is_in_hull else 'm'
plt.scatter(p[0], p[1], marker=marker, color=color)
마치 사용하고 있는 2D 점 등 때문에 그분이시라 I&; d # 39 의 포함인지 테스트 의 테스트 가르켜 시점으로든지 다각형 볼록해집니다 다각형.
이 시간 성능을 외곽진입 가 그 뒤를 따랐다.
여기서 N 은 있는 점 수를 요점이지 클라우드, h 는 구름이 있는 점 수를 요점이지 볼록해집니다 보였다.
헐 볼록해집니다 유지하려면 스키피 함께 할 수 있습니다 (재발했지 그러하매)
>>> 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 개 면을 슬라이드에서는 빠른 및 더러운 솔루션으로 볼록해집니다 (늘입니다 보다 쉽게 할 수 있습니다)
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.')