Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 计算减法后剩余多边形的算法_C#_Algorithm - Fatal编程技术网

C# 计算减法后剩余多边形的算法

C# 计算减法后剩余多边形的算法,c#,algorithm,C#,Algorithm,我有一个大多边形(Pa)。多边形内部有许多小“孔”,如图所示: 以下是孔的一些条件: 这些孔不能相互重叠 孔不能超出外部多边形 但是,孔可以接触外部多边形边 如何高效地获取剩余多边形(或多边形列表)?最简单的方法(蛮力法)是使用Pa,然后通过减去孔逐渐计算剩余多边形。虽然这个想法是可行的,但我怀疑还有一个更有效的算法 编辑:我不是问如何执行多边形剪裁(或减法)算法!事实上,我会用蛮力来做这件事。我在问,除了多边形剪裁方法(取主多边形,然后逐渐将孔剪裁出来)之外,还有其他更有效的方法吗?一般来说

我有一个大多边形(
Pa
)。多边形内部有许多小“孔”,如图所示:

以下是孔的一些条件:

  • 这些孔不能相互重叠
  • 孔不能超出外部多边形
  • 但是,孔可以接触外部多边形边
  • 如何高效地获取剩余多边形(或多边形列表)?最简单的方法(蛮力法)是使用
    Pa
    ,然后通过减去孔逐渐计算剩余多边形。虽然这个想法是可行的,但我怀疑还有一个更有效的算法


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

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

    你可以这样做

  • 在位图中使用颜色绘制主多边形
  • 在同一位图中使用其他颜色绘制孔
  • 然后以主多边形颜色为阈值,运行marchingsquare算法提取多边形
  • 输出将包含属于该多边形的所有点
  • 如果希望点作为连续闭合多边形,可以对其进行排序

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

    您应该考虑的唯一问题是,如果某个孔顶点或边可以接触Pa边,则必须在那里执行一些简化


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

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


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

    您看过
    系统中的好的
    区域
    类了吗。绘图
    ?也许
    GraphicsPath
    也会有帮助。@leppie,问题是我不会使用
    系统中的类来绘制多边形。绘制
    ——我正在其他地方绘制它。Soon Hui:我确实意识到它有点GDI专用,但这从未阻止我在web应用程序中使用它,等等。@leppie,我认为
    区域
    后面的算法——当然减去GDI代码——将是我所需要的。我不知道如何在web应用程序或OpenGL环境中使用它。Soon Hui:你可以从
    位图
    中获得
    图形
    实例。只需创建一个。作为奖励,您可以将输出转储为普通图像文件:)这就是我所说的多边形减法——我将使用gpc库