显然,您需要根据更大多边形的约束生成 Voronoi 图。尽管您将其称为多边形,但我注意到您的示例图具有基于样条的边。让我们暂时忘记这一点。
您要做的是确保从包含多边形(无论是由您生成还是从其他来源生成)开始时具有相当等长的边;方差因子会使这看起来更自然。我可能会选择 10-20% 的差异。
既然您的包含多边形由大约相等长度的线段界定,您就有了开始生成 Voronoi 图的基础。对于容器上的每个边缘:
- 确定边缘法线(从该段中心向内突出的直线)。
- 使用边缘法线作为放置新 Voronoi 节点中心的滑动比例。与边缘本身的距离将由您希望平均 Voronoi 单元“直径”决定,如果它们都被视为圆形。在您的示例中,它看起来可能是 30 像素(或者您的世界单位中的任何等值像素)。同样,您应该对此应用方差因子,以便并非每个单元中心都与其源边缘等距放置。
- 为新放置的中心生成 Voronoi 单元。
- 将您的 Voronoi 单元源点存储在列表中。
随着您逐步生成每个点,您应该开始看到该算法以径向方式细分了凹容器的每个凸“成分区域”。
您可能想知道该列表的用途。好吧,显然,您还没有完成,您只生成了您想要的全部 Voronoi 细分的一小部分。一旦你创建了凹空间的这些“边界”单元,你不希望新单元生成比边界单元更靠近边界,你只希望它们在那个区域内。通过维护边界单元源点的列表,您可以确保您创建的任何其他点都在该区域内。这有点像采用内部 Minkowski 和来确保您有一个缓冲区。现在,您可以在这个派生的凹形空间中随机化其余的单元格,直到完成。
(注意事项:您必须小心上一步。如果任何“通道”区域太窄,则此派生空间的边界将重叠,您将拥有一个非简单多边形,您可能会发现自己放置尽管您很努力,但仍指向错误的位置。解决方案是确保您与边缘的最大放置距离永远不会超过最小通道宽度的一半......或使用其他一些几何方法,包括 Minkowski 求和作为一种可能性, 以确保您不会以退化的派生多边形结束。很有可能您将以多多边形结束,即片段。)
我自己还没有应用这种方法,但是虽然肯定会有错误需要解决,但我认为总体思路会让你朝着正确的方向开始。