【问题标题】:Trapezoidal decomposition of polygon in C++C++中多边形的梯形分解
【发布时间】:2022-01-15 19:22:14
【问题描述】:

我正在处理一个多边形“断裂”问题,即将带(或不带)孔的多边形分解为梯形。

我在这里找到了用 Python 实现的类似功能: https://deparkes.co.uk/2015/02/05/trapezoidal-decomposition-polygons-python/.

有没有办法在 C++ 中做到这一点?

给定一个点(x,y)列表(std::vector),然后返回一个梯形(点)列表。

【问题讨论】:

  • 是否需要梯形而不是triangles
  • “有没有办法在 C++ 中做到这一点?”是的。
  • @G.M.是的,应该是。

标签: c++ polygon partition manhattan


【解决方案1】:

我不知道有什么库可以做到这一点,但这里有一个算法的粗略轮廓,它是扫描线或线扫描算法的一个实例。

这个想法是,您可以想象一条平行于切片方向的线扫过您的数据。发生这种情况时,您会维护一组活动边。每次您的线碰到一个顶点时,您都​​会发出适当的梯形并移除已变为非活动的边并引入任何新的活动边。

  1. 将所有边转换为有向边(它们需要有方向才能正确处理孔)
  2. 通过增加最小 x 坐标对边缘进行排序(您也可以通过 y 进行排序,但假设 x 在图表中从左到右增加,这是适合您情况的正确选择)。对于具有相同最小 x 坐标的边,使用 y 坐标对它们进行排序。例如,在您展示的图表中,它们看起来像是从上到下排序的。是增加还是减少 y 取决于您的坐标系。
  3. 将扫描线设置为第一个顶点并引入与扫描线接触的边
  4. 将扫描线推进到下一个顶点。保持前一个扫描线的值可用通常很有帮助。
  5. 发射任何梯形。发射的梯形都将在前一个扫描线和当前扫描线之间。顶点将是当前或上一个扫描线与边缘相交的位置。
  6. 移除现在位于扫描线左侧的所有边缘。 (例如,在图中,当扫描线在顶点 2 时,您将删除 0-2 的边)
  7. 合并任何新边。
  8. 如果还有剩余边,请转到第 4 步。

我在这里掩盖了一些尴尬的细节。您可能需要根据您的应用程序对输出梯形进行“网格化”,并且您必须非常小心计算的浮点部分。

如果您可以找到执行多边形光栅化的代码,则通常可以对其进行调整。在这种情况下,您将用于计算每个 x 或 y 坐标处的边缘交叉点的代码更改为仅在顶点处的交叉点。另一个值得关注的地方是开源 EDA 包。这个算法是为掩膜准备准备芯片设计数据所需要的,但是由于您使用了“断裂”一词,所以您可能已经知道了;-)

【讨论】:

  • 感谢您的分享,@idz。我想在第3步中,我们应该如何设置扫描线的方向,你能更具体吗?
  • @SzuLi 如果我们按照图表,扫描线从左到右按x递增顺序(与顶点排序方向相同)移动。
猜你喜欢
  • 2021-08-06
  • 2017-06-20
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 2018-04-10
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多