【问题标题】:Algorithm to compute the remaining polygon after subtraction计算减法后剩余多边形的算法
【发布时间】:2010-12-16 08:00:50
【问题描述】:

我有一个大多边形 (Pa)。多边形内部有很多小“洞”,如图:

以下是孔的几个条件:

  1. 孔不能相互重叠
  2. 孔不能超出外部多边形
  3. 但是,孔可以接触多边形的外边缘

如何高效获取剩余多边形(或多边形列表)?最简单的方法(蛮力方法)是采用Pa,并通过减去孔逐渐计算剩余的多边形。虽然这个想法是可行的,但我怀疑还有更高效的算法。

编辑:我不是在问如何执行多边形裁剪(或减法)算法!事实上,这是我会用蛮力做的事情。请问除了多边形剪裁方法(取主多边形,然后逐渐将洞剪掉),还有其他更有效的方法吗?

【问题讨论】:

  • 你看过System.Drawing中的老Region类吗?也许GraphicsPath 也有帮助。
  • @leppie,问题是我不会使用System.Drawing 中的类来绘制我的多边形——我正在其他地方绘制它。
  • Soon Hui:我确实意识到它有点特定于 GDI,但这并没有阻止我在 Web 应用程序等中使用它。
  • @leppie,我认为Region 背后的算法——当然,减去 GDI 代码——将是我所需要的。我不确定如何在 Web 应用程序或 OpenGL 环境中使用它。
  • Soon Hui:您可以从Bitmap 获取Graphics 实例。只需创建一个。作为奖励,您可以将输出转储为普通图像文件:)

标签: c# algorithm


【解决方案1】:

一般来说,这很难做到。您可以在此处找到解决方案的源代码:

General Polygon Clipper (GPC)

【讨论】:

  • 这就是我所说的多边形减法——我将使用 gpc 库
【解决方案2】:

好吧,如果你为你的多边形使用正确的表示,你就不需要做任何事情。只需将孔的边缘列表附加到Pa 的边缘列表即可。

你唯一应该考虑的是,如果某个孔的顶点或边缘可以接触到 Pa 边缘,你将不得不在那里进行一些简化。

另一个问题是将该多边形渲染为位图!

【讨论】:

    【解决方案3】:

    你可以这样做。

    1. 在位图中用颜色绘制主多边形。
    2. 在同一个位图中用另一种颜色绘制孔。
    3. 然后通过以主要多边形颜色为阈值运行行进正方形算法提取多边形。
    4. 输出将包含属于该多边形的所有点。
    5. 如果您希望将点作为连续的闭合多边形,您可以对其进行排序。

    【讨论】:

      【解决方案4】:

      我同意萨尔瓦,但我的帖子将涉及绘图部分。基本上,您可以将主多边形和孔多边形的所有线相加,从而得到一个复杂的多边形。

      算法本身并不是很复杂,在Polygon Fill Teaching Tool 中有很好的解释。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-12
        • 1970-01-01
        • 2014-05-15
        • 1970-01-01
        • 2014-06-11
        • 1970-01-01
        • 1970-01-01
        • 2011-12-19
        相关资源
        最近更新 更多