我为GRASS GIS编写了一个模块,使用CGAL提供自然邻域插值。我测量了向量points
中保存的点数。此外,我还为这些点设置了一个向量function_values
:function_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
有没有选择如何以不同方式填充网格?
提前致谢 亚当
答案 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 ...) {
}
}