假设我们希望Voronoi分割具有N个点的矩形表面。 Voronoi曲面细分导致N个区域对应于N个点。 对于每个区域,我们计算其面积并将其除以整个表面的总面积 - 将这些数字称为a1,...,aN。他们的总和等于一致。
假设现在我们有一个N个数字的预设列表,b1,...,bN,它们的总和等于一。
如何找到Voronoi分区的N个点坐标的选择(任意),例如a1 == b1,a2 == b2,...,aN == bN?
编辑:
经过一番思考后,可能Voronoi分区不是最好的解决方案,整个方面是提出表面的随机不规则划分,使得N个区域具有合适的尺寸。 Voronoi在我看来似乎是合乎逻辑的选择,但我可能会弄错。
答案 0 :(得分:3)
我会选择遗传算法。
以下是基本流程:
1)创建100组属于矩形的随机点。
2)对于每一组,计算voronoï图和区域
3)对于每一组,评估它与预设重量的比较(称之为分数)
4)按分数对点集进行排序
5)转储50个最差集
6)通过mixins积分在剩余的50个集合中创建50个新集合并添加一些随机集合。
7)跳到第2步,直到达到条件(分数高于阈值,发生次数,花费的时间等等)
你最终(希望)会得到一个“有点合适”的结果。
答案 1 :(得分:2)
如果你要找的东西不一定是Voronoi镶嵌,并且可能是Power图,那么下面的文章中描述了一个很好的算法:
F。 Aurenhammer,F。Hoffmann和B. Aronov,“Minkowski型定理和最小二乘聚类”, Algorithmica, 20 :61-76(1998)。
他们的问题版本如下:给定多边形P中的N个点(p_i),以及一组与P的区域相加的非负实数(a_i),找到权重(w_i),这样Power Cell Pow_w(p_i)与P的交点区域正好是a_i。在论文的第5部分中,他们证明了这个问题可以写成凸优化问题。要实现此方法,您需要:
我在my webpage上有一些代码正是这样做的,名称为“二次最优传输”。但是,这段代码不是很干净,也没有很好的文档记录,所以实现自己的算法版本可能会快得多。您还可以查看关于此主题的SGP2011论文,该论文可在同一页面上找到,以简要描述Aurenhammer,Hoffman和Aronov算法的实现。
答案 2 :(得分:1)
假设矩形轴对齐的坐标,其中x = 0处的左边缘和x = 1处的右边缘以及y = 0处的水平平分线。设B(0)= 0且B(i)= b1 + ... + bi。把点放在((B(i-1)+ B(i))/ 2,0)。这是不对的。我们将x坐标设为xi,使得bi =(x(i + 1) - x(i-1))/ 2,将x(0)替换为0,将x(n + 1)替换为1.这是三对角线应该有一个简单的解决方案,但也许你不想要这样一个无聊的Voronoi图;它将是一堆垂直分裂。
对于更随机的图表,可能是物理学的启发:随机丢弃点,计算Voronoi图,计算每个细胞的面积,使超重细胞对其邻居的点有吸引力,使体重不足的细胞排斥并计算小每个点的delta,重复直到达到平衡。
答案 3 :(得分:0)
当您计算最小生成树并移除最长边时,可以计算voronoi tesselation。然后,mst的子树的每个中心都是voronoi图的一个点。因此,voronoi图是最小生成树的子集。