加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 在包含点的网格内找到三角形的快速方法

发布时间:2020-12-16 09:58:54 所属栏目:百科 来源:网络整理
导读:我遇到了一个我需要完成的任务的性能问题.目前的一个瓶颈是从非结构化网格获取插值字段值. 在给定2D点和非结构化2D网格的情况下,慢速部分找到紧邻该点的网格点.只要找到它落入的三角形就好了. 现在我正在使用CGAL,但它太慢了.在当前的实现中,整个任务需要数
我遇到了一个我需要完成的任务的性能问题.目前的一个瓶颈是从非结构化网格获取插值字段值.

在给定2D点和非结构化2D网格的情况下,慢速部分找到紧邻该点的网格点.只要找到它落入的三角形就好了.

现在我正在使用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,Kernel::Less_xy_2 > m_vY;
    std::map< MeshType,Kernel::Less_xy_2 > m_vZ;

    typedef CGAL::Data_access< std::map< MeshType,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(),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(),ValueAccess( m_vY )
        );

        FieldType resZ =
            CGAL::linear_interpolation(
                coords.begin(),ValueAccess( m_vZ )
        );

        return TN::Vec3( resX,resY,resZ );
    }
};

#endif

任何人都可以指向一个可接受的更高性能解决方案,无论是不同的库还是算法?

解决方法

CGAL包含一个实现
Triangulation Hierarchy哪个

implements a triangulation augmented with a data structure to efficiently answer point location queries. […] the data structure remains small and achieves fast point location queries on real data.

它的性能是Delaunay三角测量的最佳选择.

Triangulation

图36.8

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读