雅各布,
嘿,您发现了一种有趣的方式来生成这个 Voronoi 图,尽管它不是那么有效。
首先是不太重要的问题:你得到的不同厚度的边界,那些蝴蝶形状,实际上是双曲线的两个分支之间的区域。正是方程 |da - db| 给出的双曲线 = 4. 要获得一条粗线,您必须修改此标准并将其替换为到两个最近邻居的平分线的距离,让 A 和 B;使用向量微积分,| PA.AB/||AB|| - ||AB||/2 | < 4。
更重要的问题:构建一组点的 Voronoi 图有两种众所周知的有效解决方案:Fortune 的扫描算法(如 templatetypedef 所述)和 Preparata & Shamos 的分治解决方案。两者都在 N 个点的最佳时间 O(N.Lg(N)) 中运行,但实现起来并不容易。
这些算法将 Voronoi 图构建为一组线段和半线。检查http://en.wikipedia.org/wiki/Voronoi_diagram。
这篇论文“Primitives for the operation of general subdivisions and the computing of Voronoi”描述了这两种算法,使用了一个有点高级的框架,关心所有的实现细节;这篇文章很难,但算法是可以实现的。
您还可以查看我从未尝试过的“平面 Voronoi 图的简单迭代算法”。
一种完全不同的方法是直接从给定点构建距离图,例如通过 Dijkstra 算法:从给定点开始,在距每个点的给定距离内增长区域的边界,当两个边界时停止增长遇见。[需要更多解释。] 请参阅http://1.bp.blogspot.com/-O6rXggLa9fE/TnAwz4f9hXI/AAAAAAAAAPk/0vrqEKRPVIw/s1600/distmap-20-seed4-fin.jpg
另一个好的起点(用于有效计算距离图)可以是“用于计算线性时间距离变换的通用算法”。