如何确定一个点是否位于凹壳(Alpha 形状)内?
How to determine if a point lies inside a Concave Hull (Alpha Shape)?
我在 2D 平面中有一组坐标,我希望从中构建一个凹壳(Alpha 形状)。在此之后,我需要确定某个点是在形成的船体内部还是外部。
虽然我可以使用附加的代码为凸包实现这一点,但我还没有找到对凹包执行相同操作的方法。
# Detection in Convex Hulls
from scipy.spatial import Delaunay
hull = Delaunay(points)
return hull.find_simplex(test_point) >= 0
如何为凹包实现相同的效果?
Shapely 包含 point.within(多边形)和 polygon.contains(点)方法。
使用 Alpha 形状包。这是一个示例代码:
import matplotlib.pyplot as plt
from descartes import PolygonPatch
import alphashape
import random
from shapely.geometry import Point
points = [(0., 0.), (0., 1.), (1., 1.), (1., 0.),
(0.5, 0.25), (0.5, 0.75), (0.25, 0.5), (0.75, 0.5)]
alpha_shape = alphashape.alphashape(points, 2.0) # Create the alpha shape
# Plotting the alpha shape over the input data
fig, ax = plt.subplots()
ax.scatter(*zip(*points), c='green')
ax.add_patch(PolygonPatch(alpha_shape, alpha=0.2))
N = 10 # number of random points
for i in range(N):
x = round(random.uniform(0, 1), 2)
y = round(random.uniform(0, 1), 2)
point = Point(x,y) # analysis point
if alpha_shape.contains(point) == True:
plt.scatter(x,y,c='blue')
else:
plt.scatter(x,y,c='red')
图例:
- 红色,凹多边形外的点
- 在绿色中,顶点点
- 蓝色为凹多边形内的点
我在 2D 平面中有一组坐标,我希望从中构建一个凹壳(Alpha 形状)。在此之后,我需要确定某个点是在形成的船体内部还是外部。
虽然我可以使用附加的代码为凸包实现这一点,但我还没有找到对凹包执行相同操作的方法。
# Detection in Convex Hulls
from scipy.spatial import Delaunay
hull = Delaunay(points)
return hull.find_simplex(test_point) >= 0
如何为凹包实现相同的效果?
Shapely 包含 point.within(多边形)和 polygon.contains(点)方法。
使用 Alpha 形状包。这是一个示例代码:
import matplotlib.pyplot as plt
from descartes import PolygonPatch
import alphashape
import random
from shapely.geometry import Point
points = [(0., 0.), (0., 1.), (1., 1.), (1., 0.),
(0.5, 0.25), (0.5, 0.75), (0.25, 0.5), (0.75, 0.5)]
alpha_shape = alphashape.alphashape(points, 2.0) # Create the alpha shape
# Plotting the alpha shape over the input data
fig, ax = plt.subplots()
ax.scatter(*zip(*points), c='green')
ax.add_patch(PolygonPatch(alpha_shape, alpha=0.2))
N = 10 # number of random points
for i in range(N):
x = round(random.uniform(0, 1), 2)
y = round(random.uniform(0, 1), 2)
point = Point(x,y) # analysis point
if alpha_shape.contains(point) == True:
plt.scatter(x,y,c='blue')
else:
plt.scatter(x,y,c='red')
图例:
- 红色,凹多边形外的点
- 在绿色中,顶点点
- 蓝色为凹多边形内的点