C# 多边形中均匀分布点的生成算法

C# 多边形中均匀分布点的生成算法,c#,math,polygon,point,C#,Math,Polygon,Point,我正在寻找一种算法来生成多边形内均匀分布的点 以下是场景: 我有一个多边形,由每个点的角点(x,y)的坐标指定。我有在多边形内部生成的点数 例如,假设我有一个包含5个点的多边形:(1,1);(1, 2) ; (2, 3) ; (3, 2) ; 和(3,1) 我需要在多边形内生成20个距离相等的点 注意:有些多边形可能不支持均匀分布的点,但我希望以一种尽可能一致的方式分布这些点,以覆盖多边形的所有区域。(我的意思是,我不希望一个零件比另一个零件有更多的点数) 有这样做的算法吗?或者是图书馆 我正在

我正在寻找一种算法来生成多边形内均匀分布的点

以下是场景:

我有一个多边形,由每个点的角点(x,y)的坐标指定。我有在多边形内部生成的点数

例如,假设我有一个包含5个点的多边形:(1,1);(1, 2) ; (2, 3) ; (3, 2) ; 和(3,1)

我需要在多边形内生成20个距离相等的点

注意:有些多边形可能不支持均匀分布的点,但我希望以一种尽可能一致的方式分布这些点,以覆盖多边形的所有区域。(我的意思是,我不希望一个零件比另一个零件有更多的点数)

有这样做的算法吗?或者是图书馆

我正在开发一个C#应用程序,但任何语言都可以,因为我只需要算法,我可以翻译它


非常感谢您的帮助

一个简单的方法是:

  • 计算边界框
  • 在该框中生成点
  • 放弃所有不在感兴趣多边形中的点
  • 这种方法会产生一定数量的浪费点。对于三角形,它永远不会超过50%。对于任意多边形,这可能是任意高的,因此您需要查看它是否适合您

    对于任意多边形,您可以先将多边形分解为三角形,这样就可以保证浪费点的上限:50%

    对于距离相等的点,从空间填充曲线生成点(并放弃不在多边形中的所有点)

  • Genettic算法可以相当快地完成此任务
    参考

  • 您可以使用有向力图来表示…
    看看
    它可以挑衅地扔给你一根骨头

  • 我从未尝试过,
    但是我记得有一种可能性,可以为图中的一些顶点设置一个固定点

    你的算法最终会像

  • 创建一个图G=V中顶点的闭合路径
  • 将顶点固定到位
  • 向图形中添加N个垂直,并将它们与具有相等张力值1.0的边完全连接
  • 运行力图(G)
  • 将图缩放到图的有界框

    虽然它不是绝对的,因为一些凸面形状可能会产生扭曲的结果(拿一颗星来说)

    最后:没有读过,但它似乎与标题和摘要相关
    看看


    希望这有帮助…

    我使用的简单方法是:

  • 对多边形进行三角剖分。耳朵剪辑是完全足够的,因为您只需要将多边形分割成一组不重叠的三角形

  • 计算每个三角形的面积。按三角形相对于整个三角形的面积的比例从每个三角形中取样。每个样本只需要一个统一的随机数

  • 一旦确定一个点来自给定三角形,则在三角形上均匀采样。这本身比你想象的要容易

  • 所以实际上,这一切都归结于如何在三角形内取样。这很容易做到。三角形由3个顶点定义。我叫他们P1,P2,P3

  • 拾取三角形的任意边。生成沿该边均匀分布的点(P4)。因此,如果P1和P2是对应端点的坐标,则P将是沿该边的均匀采样点,如果r在区间[0,1]上具有均匀分布

    P4=(1-r)*P1+r*P2

  • 接下来,沿P3和P4之间的线段采样,但采样不均匀。如果s是区间[0,1]上的均匀随机数,则

    P5=(1-sqrt))*P3+sqrt*P4

  • r和s当然是独立的伪随机数。然后随机抽取P5,在三角形上均匀分布


    好在它不需要拒绝方案来实现,所以长而薄的多边形不是问题。对于每个样本,成本只需要在每个事件中生成三个随机数。由于削耳非常简单,而且是一项有效的任务,因此即使对于外观难看的多边形或非凸多边形,采样也会非常有效。

    简单的答案来自一个更简单的问题:如何从均匀分布中生成给定数量的随机分布点,这些点都将适合给定的多边形

    简单的答案是:找到多边形的边界框(假设它是[a,b]x[c,d]),然后继续生成实数对,一个来自U(a,b),另一个来自U(b,c),直到有n个坐标对适合多边形。这很容易编程,但是,如果您的多边形非常参差不齐,或者非常薄且倾斜,则会非常浪费和缓慢


    要获得更好的答案,请找到最小的旋转矩形边界框,并在变换后的坐标中执行上述操作。

    更好的答案来自于更好的问题。假设您想要放置一组n个望塔来覆盖一个多边形。您可以将其视为一个优化问题:找到n个点的2n坐标,这将最小化符合您目标的成本函数(或最大化价值函数)。一个可能的成本函数可以计算每个点到最近邻点或多边形边界的距离(以较小者为准),并计算该序列的方差作为“不均匀性”的度量。您可以使用如上所述获得的n个点的随机集作为初始解

    我在一些书中见过这样的“望塔问题”。算法、微积分或优化

    @优素福:很抱歉耽搁了;一个朋友来了,一个网络中断了


    @其他:要有耐心,不要太激动。

    你可以使用劳埃德算法:


    您可以尝试{spatialEco}包() 并应用函数sample.poly()

    您可以尝试以下代码:

    library(rgeos)
    library(spatialEco)
    
    mypoly = readWKT("POLYGON((1 1,5 1,5 5,1 5,1 1))")
    plot(mypoly)
    points = sample.poly(mypoly, n= 20, type = "regular")
    #points2 = sample.poly(mypoly, n= 20, type = "stratified")
    #another type which may answer your problem
    plot(points, col="red", add=T)
    
    您可能想尝试获取算法,th