📜  DAA |福特富尔克森算法(1)

📅  最后修改于: 2023-12-03 15:00:19.648000             🧑  作者: Mango

DAA |福特富尔克森算法

简介

DAA,全称为Divide and Conquer Algorithm(分治算法),是一种将问题分成若干个小问题,分别解决,最后将结果合并起来的算法思想。而福特富尔克森算法(Fortune's algorithm)则是一种使用DAA求解Voronoj图的算法。

算法流程

福特富尔克森算法的具体流程如下:

1.生成原始点集,并构建超级三角形。 2.对于每个点,计算其对应的Voronoi区域,并且计算此点到其他点的距离并插入事件队列。 3.从事件队列中取出下一个事件,分为点或边两种类型。 4.当事件为点时,将此点插入Delaunay三角形并且更新对应的Voronoi图。如果此点对应的超球被某个事件点所包含,则将该超球从顶点处剪掉,将相邻点连成新的边,并在此边上创建一个新的事件。 5.当事件为边时,将该边从Delaunay图上移除,并将其对应的Voronoi图中剩余部分合并成新的区域。如果新的区域对应的超球被包含在某个事件点中,则以此超球为顶点创建新的边,并将其插入事件队列。 6.重复执行步骤3-5直至事件队列为空。最后将与超级三角形相交的部分删除,即得到Voronoi图。

实现

福特富尔克森算法的实现需要用到三角剖分、平衡树等数据结构以及基本的计算几何知识。实现代码可以使用C++、Java等语言进行编写,其中还需要使用第三方库如Boost Geometry等。以下是C++版代码片段:

#include <boost/polygon/voronoi.hpp>
using namespace boost::polygon;
typedef long long coordinate_type;
typedef point_data<coordinate_type> point_type;
typedef voronoi_diagram<double> VoronojDiagram;

int main() {
  std::vector<point_type> points;
  //将点集插入vector并且生成超级三角形
  VoronojDiagram vd;
  construct_voronoi(points.begin(), points.end(), &vd);
  //获取Voronoj图的边
  VoronojDiagram::edge_iterator edge_it = vd.edges().begin();
  for (; edge_it != vd.edges().end(); ++edge_it) {
    //处理每条边
  }
  return 0;
}