我遇到了一个性能问题,需要完成一项任务。目前其中一个瓶颈是从非结构化网格中获取插值字段值。慢的部分是给定一个二维点和一个非结构化的二维网格,找到立即环绕该点的网格点。最好只需找到它所在的三角形。
目前我正在使用CGAL,但速度太慢了。使用当前实现,整个任务将在高端CPU上并行运行数天才能完成。
我认为慢的部分是CGAL::natural_neighbor_coordinates_2函数。
目前我正在使用CGAL,但速度太慢了。使用当前实现,整个任务将在高端CPU上并行运行数天才能完成。
我认为慢的部分是CGAL::natural_neighbor_coordinates_2函数。
#ifndef FIELD_INTERPOLATOR_H
#define FIELD_INTERPOLATOR_H
#include "Vec.h"
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Delaunay_triangulation_2.h>
#include <CGAL/Interpolation_traits_2.h>
#include <CGAL/natural_neighbor_coordinates_2.h>
#include <CGAL/interpolation_functions.h>
#include <map>
#include <vector>
typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef CGAL::Delaunay_triangulation_2< Kernel > Delaunay_triangulation;
typedef Kernel::FT FieldType;
typedef Kernel::Point_2 MeshType;
struct FieldInterpolator23 {
Delaunay_triangulation m_triangulation;
std::map< MeshType, FieldType, Kernel::Less_xy_2 > m_vX;
std::map< MeshType, FieldType, Kernel::Less_xy_2 > m_vY;
std::map< MeshType, FieldType, Kernel::Less_xy_2 > m_vZ;
typedef CGAL::Data_access< std::map< MeshType, FieldType, Kernel::Less_xy_2 > > ValueAccess;
FieldInterpolator23() {}
FieldInterpolator23( const std::vector< TN::Vec2 > & mesh, const std::vector< TN::Vec3 > & field )
{
const int N = mesh.size();
for ( int i = 0; i < N; ++i ) {
MeshType p( mesh[i].x(), mesh[i].y() );
m_triangulation.insert( p );
m_vX.insert( std::make_pair( p, field[i].x() ) );
m_vY.insert( std::make_pair( p, field[i].y() ) );
m_vZ.insert( std::make_pair( p, field[i].z() ) );
}
}
void set( const std::vector< TN::Vec2 > & mesh, const std::vector< TN::Vec3 > & field ) {
m_triangulation.clear();
m_vX.clear();
m_vY.clear();
m_vZ.clear();
const int N = mesh.size();
for ( int i = 0; i < N; ++i ) {
MeshType p( mesh[i].x(), mesh[i].y() );
m_triangulation.insert( p );
m_vX.insert( std::make_pair( p, field[i].x() ) );
m_vY.insert( std::make_pair( p, field[i].y() ) );
m_vZ.insert( std::make_pair( p, field[i].z() ) );
}
}
TN::Vec3 operator() ( TN::Vec2 p ) {
MeshType pos( p.x(), p.y() );
std::vector< std::pair< MeshType, FieldType > > coords;
FieldType norm =
CGAL::natural_neighbor_coordinates_2( m_triangulation, pos, std::back_inserter( coords ) ).second;
FieldType resX =
CGAL::linear_interpolation(
coords.begin(),
coords.end(),
norm,
ValueAccess( m_vX )
);
FieldType resY =
CGAL::linear_interpolation(
coords.begin(),
coords.end(),
norm,
ValueAccess( m_vY )
);
FieldType resZ =
CGAL::linear_interpolation(
coords.begin(),
coords.end(),
norm,
ValueAccess( m_vZ )
);
return TN::Vec3( resX, resY, resZ );
}
};
#endif
有没有人能够指导我一个更高效的解决方案,无论是不同的库还是算法?