重新排列单线以形成封闭的多边形?

Posted

技术标签:

【中文标题】重新排列单线以形成封闭的多边形?【英文标题】:Rearrange single lines to form closed polygon? 【发布时间】:2020-07-02 06:58:15 【问题描述】:

假设我有一个矩形:

A------B
|      |
|      |
D------C

通常这个矩形是由一组坐标 A-B-C-D-A 组成的,这些坐标描述了一个封闭的多边形。

现在我没有这样的数组,而是一堆单独的行 B-A、D-A、B-C-D。绘制两者时,结果始终是相同的矩形,但在第二种情况下,会使用更多数据。所以我想重新排列和优化第二种情况,以便像第一种情况一样获得一个坐标数组。

我的问题:这是否可以通过 boost::geometry 或 boost::polygon 以某种方式实现?如果是,如何做到这一点?如果不是:还有其他可能吗?

谢谢!

【问题讨论】:

线条的端点是相同的还是近似的? @AlanBirtles 他们是一样的 应该相当简单,然后在一条线的末尾找到与另一条末尾的点匹配的点并将它们组合在一起? @AlanBirtles 是的,当然,我可以再次发明***——但是既然已经有图书馆在做这项工作,我为什么还要这样做呢? Btw:没那么简单,不仅仅是简单的排序和重新排列,有些行需要颠倒(我上面的例子中是B-A) 行数会一直是4吗?期望的结果总是一个凸多边形,还是也可以是一个凹多边形?或者它永远是一个矩形? 【参考方案1】:

不,Boost.Geometry 中没有这方面的算法。

但是有些事情可能会帮助您编写自己的:

boost::geometry::equals() - 检查一个点是否等于另一个点,这是由 WRT 机器 epsilon 完成的,因此您可以考虑使用自己的版本严格比较坐标 boost::geometry::intersects() - 检查线串是否与其他线串相交 boost::geometry::index::rtree<> - 加快搜索过程 用线串的 id 存储端点并搜索相等的点 存储线串的边界框并搜索相应的线串 boost::geometry::envelope() - 计算线串的边界框 boost::geometry::correct() - 检查多边形/环的方向并反转以匹配类型定义 boost::geometry::is_valid() - 验证多边形/环是否有效(例如边缘不与其他边缘交叉)

【讨论】:

以上是关于重新排列单线以形成封闭的多边形?的主要内容,如果未能解决你的问题,请参考以下文章

使用shapefile在Python中查找点的封闭多边形[重复]

如何确定封闭的凹面多边形是否在里面? [关闭]

多段线切割多边形

计算几何多边形点集排序

网格:“排序/重新排序”数组引用另一个共享条目以提高缓存效率

带有排列国家多边形的图表