如何获取复杂多边形的中心线

9

给定一个多边形的坐标,我想编写一个函数来返回该多边形的中心线坐标。中心线实际上是一个折线。

这张图片更清晰地解释了我的问题


一个起点可以是围绕多边形进行迭代,并将每堵墙分类为“端墙”或不是 - 即应该在线上有红点的墙或没有。您可以基于测试的“端墙”的两侧是否都有相同的点来进行分类。 - David Montgomery
你想通过数学方法还是图像获取它?因为使用scikit-image模块中的medial-axis函数从图像中获取它非常简单。 - Francesco
只需要一个Python函数,该函数接受从Autocad文件中使用Python ezdxf库提取的多边形坐标值,并返回中心折线。 - Aditya rajora
我有一个类似的需求,我的情况是我必须连接具有中轴线的矩形。我使用了碰撞检测算法来确定矩形是否相互接触,以便我可以延伸/折叠中心线。您可以在此处查看我的算法:https://jsfiddle.net/raulbojalil/jwy674on/116/ - Raúl Bojalil
1个回答

6
你可以尝试使用centerline库。它支持多边形复杂多边形作为输入(基本上是任何Shapely支持的输入),并输出Centerline对象,这些对象是MultiLineString
根据您的描述,您应该使用给定的点作为输入,创建一个具有shapelyPolygonMultiPolygon对象,并将(multi)polygon对象作为输入传递给Centerline类。一旦您拥有了Centerline对象,您可以执行任何操作,就像在MultiLineString对象上执行的操作一样。示例可在README.md文件中找到:
>>> from shapely.geometry import Polygon
>>> from centerline.geometry import Centerline

>>> polygon = Polygon([[0, 0], [0, 4], [4, 4], [4, 0]])
>>> attributes = {"id": 1, "name": "polygon", "valid": True}

>>> centerline = Centerline(polygon, **attributes)
>>> centerline.id == 1
True
>>> centerline.name
'polygon'
>>> centerline.geoms
<shapely.geometry.base.GeometrySequence object at 0x7f7d24116210>

还有一个命令行脚本用于转换文件。如果文件受GDAL/OGR支持,该脚本应该能够将其转换。


这是使用Centerline库生成T形多边形的输出链接,但我真正想要的是问题中明确提到的图像,特别是T形。您能解释一下Centerline库的逻辑,以便我可以将其应用于我的问题吗? - Aditya rajora
centerline 库使用 Voronoi 图 来构建中心线。多边形的边界被加密,点被用作图的基线。所有完全位于多边形内部的图顶点都会被添加到中心线中。然而,如果您想要实现第一个问题中显示的精确结果,即中心线的点数是多边形点数的一半,那么 centerline 库就不适合了。在这种情况下,您需要使用不同的算法。 - Filip Todic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接