【问题标题】:Sweep Line Polygon triangulation: How to find edge left to current vertex?扫描线多边形三角剖分:如何找到当前顶点左侧的边?
【发布时间】:2021-03-02 15:23:55
【问题描述】:

我目前正在编写一个 y 单调扫描线算法来对非凸多边形进行三角剖分。 实现这一点的第一步是使多边形 y 单调。

MakeMonotone 的伪代码来自“Mark de Berg 的计算几何”一书 (https://archive.org/details/computationalgeo00berg):

现在我的问题:

在那本书和我找到的所有其他网站中,没有解释如何对提到的“二叉搜索树 T”中的边缘进行精确排序。参考书中唯一提到的是“T的叶子的从左到右的顺序对应于边的从左到右的顺序”。但是通过什么属性/属性在该树中对边缘进行排序? 我也不清楚,二叉树中的边应该如何表示(起点?终点?两者的结合?)。

我最幼稚的方法是找出 T 中的所有边与扫描和线的交点,并计算它们中的哪一个最接近当前顶点。但是鉴于在每本书/大学幻灯片中,T 的内部工作都没有进一步解释,它一定更容易。

二叉搜索树应该支持以下操作:

  • 插入新边
  • 找到当前扫描线上顶点左侧的边
  • 删除边

【问题讨论】:

  • 书上说:对顶点的y进行排序..
  • @YvesDaoust 这是为了扫荡,而不是状态。

标签: geometry polygon computational-geometry triangulation non-convex


【解决方案1】:

T 用于直接找到查询点左侧的边。所以T中的边需要水平排序。

T 上的关键查询是找到紧靠点左侧的边。对于树中的任意一条边,找到该点的 y 坐标对应的边的 x 位置,并将其与该点的 x 坐标进行比较。 (或者,由于树中只存储了左边界边,您可以直接在点的坐标上计算边的隐式方程,看看结果是负还是正。)

在该算法中,通过执行这样的查询然后在查询返回的边之后直接插入新边来完成对 T 的插入。

与二叉树的大多数其他用法相比,没有办法将数字“键”与每个节点相关联并按键排序。如果你想要一个可以用来排序的不可变函数,你可以这样做:

def less(e1, e2):
    yMin = max(e1.begin.y, e2.begin.y)
    yMax = min(e1.end.y, e2.end.y)
    y = (yMin + yMax) / 2
    return e1.xAtY(y) < e2.xAtY(y)

这取决于该算法中的边已知为不相交的事实,以及仅在两条边都处于活动状态时才使用比较的事实; 不是对所有边的排序,仅对在特定 y 处活动的所有边进行排序。

不过,这是一个 hack。此处有效且正确的方法是不对边进行排序函数,而只是将顶点与边进行比较的函数。

【讨论】:

  • 对于任何对我的结果感兴趣的人,我在这里上传了我的结果:github.com/Sixtisam/polygon_triangulation 它能够对具有任意数量的非交叉孔的非凸多边形进行三角剖分。
猜你喜欢
  • 1970-01-01
  • 2017-04-09
  • 2012-09-28
  • 2015-03-19
  • 1970-01-01
  • 2011-01-14
  • 2011-10-05
  • 1970-01-01
  • 2011-01-24
相关资源
最近更新 更多