让我给你举个例子:
有人知道如何解决这个问题吗?是否已经有一些算法可以实现或接近我想要实现的内容?
感谢任何帮助!
显然,您需要根据更大多边形的限制生成您的沃罗诺伊图。尽管您将其称为多边形,但我注意到您的示例图具有基于样条的边缘。现在让我们暂时忘记它。
您想要做的是确保您从包含多边形(无论是由您生成还是来自其他来源)开始具有相当长度的边缘;方差因子会使其看起来更自然。我可能会选择10-20%的方差。
现在,您的包含多边形由大约相等长度的线段界定,您有了一个基础,可以从中开始生成您的沃罗诺伊图。对于容器上的每个边缘:
当您逐步生成每个点时,您应该开始看到该算法以径向方式将凸“成分区域”细分为您的凹容器。
你可能会想知道这个列表是用来干什么的。显然,你还没有完成,你只生成了你想要的Voronoi图案的一小部分。一旦你创建了这些凹空间的“边界”单元,你不希望新的单元比边界单元更靠近边界,你只希望它们在那个区域内。通过维护一个边界单元源点的列表,你可以确保任何进一步创建的点都在那个区域内。这有点像进行内部Minkowski求和以确保你有一个缓冲区。现在你可以在这个派生的凹形空间中随机生成其余的单元,直到完成。
(买家须知:你必须小心处理上一个步骤。如果任何“通道”区域太窄,那么这个派生空间的边界将重叠,你将得到一个非简单多边形,并且你可能会发现自己尽管努力但仍然把点放在错误的位置。解决方案是确保你从边缘的最大放置距离永远不超过你的最小通道宽度的一半...或者使用其他几何手段,包括Minkowski求和作为一种可能性,以确保你不会得到一个退化的派生多边形。你最终可能会得到一个多多边形,即碎片。)
我自己还没有应用过这种方法,但是虽然肯定会有一些需要解决的错误,但我认为这个总体思路可以让你朝着正确的方向开始。
请查找一篇名为:
《高效计算连续骨架》的论文,作者是David G Kirkpatrick,发表于1979年。
以下是摘要:
提出了一种O(n lgn)算法,用于构建任意n线多边形图形的骨架。该算法基于一种O(n lgn)算法,用于构建广义Voronoi图(我们的泛化将点集替换为仅在端点处相交的线段集)。广义Voronoi图算法采用线性时间算法合并两个任意(标准)Voronoi图。
“仅在端点处相交的线段集”是您描述的凹多边形。