cgal自然邻域插值

时间:2015-05-20 15:37:25

标签: interpolation cgal

我为GRASS GIS编写了一个模块,使用CGAL提供自然邻域插值。我测量了向量points中保存的点数。此外,我还为这些点设置了一个向量function_valuesfunction_values.insert(std::make_pair(Point(x,y),z));

我想保存在包含这些点的区域内插入的网格值。

到目前为止,我的代码有效,但速度很慢,因为我必须按照cols和row逐步抛出网格来定义点p K::Point_2 p(coor_x,coor_y)并调用{{ 1}}每一步。

CGAL::natural_neighbor_coordinates_2

有没有选择如何以不同方式填充网格?

提前致谢 亚当

1 个答案:

答案 0 :(得分:0)

主要想法:

在自然邻居计算中,最昂贵的操作是确定哪个三角形包含查询点(locate()函数)。这个locate()函数可以通过给它一个"提示"来加速,也就是说一个三角形(Dt :: Face_handle)离包含该点的三角形不太远。由于所有查询点都是在常规网格中组织的,如果您使用包含前一个点的三角形作为提示,那么它将显着加速程序。

怎么做:

函数natural_neighbor_coordinates_2()有一个可选参数' start'指定提示。

Delaunay_triangulation::Facet_handle fh; // the variable that stores the 'hint'

for(int rows ...) {
   for (int columns ...) {
       K::Point_2 p(...)
       ...
       fh = T.locate(p,fh); // locate p using the previous triangle as a hint
        Coord_type norm = CGAL::natural_neighbor_coordinates_2(T,p,std::back_inserter(coords),fh).second;     
        // Give the hint to the function that computes natural neighbour coordinates  
        ...
   }
}

走得更快:

CGAL是线程安全的,因此您可以使用OpenMP来加速(不要忘记将fh声明为私有,以便每个线程都有自己的副本:

#pragma omp parallel for private(fh)
for(int row ...) {
   for(int columns ...) {
   }
}