我正在寻找一个解决凹面船体问题的python实现。我的问题有点不同,因为我没有一组点,而是一组线,结果凹壳将大致沿着这些线绑定(如左图所示)。
我知道没有单一的“正确答案”。但是一些近似值就足够满足我的需求了。一种可能的解决方案是取每条直线,并将其插值到一个范围,比如说20个点,然后找到所有创建点的凹壳。不是很确定。
编辑:
我认为这些线条增加了一些价值,使船体更清晰,更容易找到。
一个好的python实现来解决这个问题,即使不使用线(仅仅是从点的列表中找到一个凹壳)也会很有帮助。
发布于 2019-08-06 22:18:24
这是对你的子问题的回答:
解决这个问题的一个好的python实现,即使不使用线(只是从点的列表中找到一个凹面外壳)也会很有帮助
您可以使用alphashape。棘手的部分是选择一个适合您需求的alpha
。Alphashape
附带了一个函数来查找最优的alpha值。它从凸包(= Basically 0
)开始,然后增加alpha,直到它开始失去点。从这个最佳值中,我们取95 %,当然,这是一个相当随意的解决方案,但在许多情况下,它会给你一个很好的近似值。
import alphashape
import matplotlib.pyplot as plt
from descartes import PolygonPatch
points = [(17, 158),(15, 135),(38, 183),(43, 19),(93, 88),(96, 140),(149, 163),(128, 248),(216, 265),(248, 210),(223, 167),(256, 151),(331, 214),(340, 187),(316, 53),(298, 35),(182, 0),(121, 42)]
alpha = 0.95 * alphashape.optimizealpha(points)
hull = alphashape.alphashape(points, alpha)
hull_pts = hull.exterior.coords.xy
fig, ax = plt.subplots()
ax.scatter(hull_pts[0], hull_pts[1], color='red')
ax.add_patch(PolygonPatch(hull, fill=False, color='green'))
一种可能的解决方案是,取每条直线,并将其插值到一个范围内,比如说20个点,然后找到所有创建点的凹壳。,
,the,the,of,the,of,of,the,the,of,of,the,of,
这不会给你想要的输出,因为凹面外壳将跟随这些额外的(假)点,并且它变得比原始点更凹。
我认为整个问题的最佳解决方案是从从optimizealpha
获得的最佳alpha点的凹壳开始,然后减小它,直到您的外壳不与@sgillen建议的任何直线相交。这可以类似于通过使用二等分循环来测试any([polygon.crosses(line) for line in lines])
来找到最佳alpha。
发布于 2019-08-03 09:06:50
这是一个使用python查找一组点的凹壳的github repo。
我给你的建议如下。使用每条直线的端点创建一组点。然后使用链接到的代码为这些点生成凹面外壳,并对alpha的值进行一些猜测。一旦完成此操作,您可以检查生成的外壳是否与您的任何直线相交,以及是否修改了alpha。如果愿意,可以自动检查交点和平差。
您还可以尝试将直线的中点添加到您的点集,这可能会减少您需要尝试的alphas的数量。
发布于 2019-08-08 05:15:39
尽管这个问题可能已经得到了回答,但以下也是我的方法:
就像其他人说的,你首先必须将直线的端点转换为点的列表。
之后,您可能需要SciPy库中的这个整洁的函数:scipy.spatial.ConvexHull()
。基本上,您只需将一个带有顶点的数值数组传递给函数(使用numpy.array()
创建),它将返回一个外壳对象
Here是文档
使用.points
-attribute可以获取所有点,使用.vertices
-attribute可以获取构成外壳的输入列表的索引。如果你对此感兴趣,你也可以得到像Area或Volume这样的东西(对于3D形状)。
~Okaghana
https://stackoverflow.com/questions/57260352
复制相似问题