首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一组直线的Python凹壳多边形

一组直线的Python凹壳多边形
EN

Stack Overflow用户
提问于 2019-07-30 03:32:22
回答 3查看 10.3K关注 0票数 11

我正在寻找一个解决凹面船体问题的python实现。我的问题有点不同,因为我没有一组点,而是一组线,结果凹壳将大致沿着这些线绑定(如左图所示)。

我知道没有单一的“正确答案”。但是一些近似值就足够满足我的需求了。一种可能的解决方案是取每条直线,并将其插值到一个范围,比如说20个点,然后找到所有创建点的凹壳。不是很确定。

编辑:

我认为这些线条增加了一些价值,使船体更清晰,更容易找到。

一个好的python实现来解决这个问题,即使不使用线(仅仅是从点的列表中找到一个凹壳)也会很有帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-08-06 22:18:24

这是对你的子问题的回答:

解决这个问题的一个好的python实现,即使不使用线(只是从点的列表中找到一个凹面外壳)也会很有帮助

您可以使用alphashape。棘手的部分是选择一个适合您需求的alphaAlphashape附带了一个函数来查找最优的alpha值。它从凸包(= Basically 0 )开始,然后增加alpha,直到它开始失去点。从这个最佳值中,我们取95 %,当然,这是一个相当随意的解决方案,但在许多情况下,它会给你一个很好的近似值。

代码语言:javascript
运行
复制
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。

票数 21
EN

Stack Overflow用户

发布于 2019-08-03 09:06:50

这是一个使用python查找一组点的凹壳的github repo

我给你的建议如下。使用每条直线的端点创建一组点。然后使用链接到的代码为这些点生成凹面外壳,并对alpha的值进行一些猜测。一旦完成此操作,您可以检查生成的外壳是否与您的任何直线相交,以及是否修改了alpha。如果愿意,可以自动检查交点和平差。

您还可以尝试将直线的中点添加到您的点集,这可能会减少您需要尝试的alphas的数量。

票数 5
EN

Stack Overflow用户

发布于 2019-08-08 05:15:39

尽管这个问题可能已经得到了回答,但以下也是我的方法:

就像其他人说的,你首先必须将直线的端点转换为点的列表。

之后,您可能需要SciPy库中的这个整洁的函数:scipy.spatial.ConvexHull()。基本上,您只需将一个带有顶点的数值数组传递给函数(使用numpy.array()创建),它将返回一个外壳对象

Here是文档

使用.points-attribute可以获取所有点,使用.vertices-attribute可以获取构成外壳的输入列表的索引。如果你对此感兴趣,你也可以得到像Area或Volume这样的东西(对于3D形状)。

~Okaghana

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57260352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档