到所有网格点的最短路径

时间:2016-03-15 10:53:01

标签: c++ boost cgal

我正在研究水密网格,我正在尝试的是从网格中的每个顶点到网格中的每个其他顶点获取网格表面上的最短路径。

E.g。当网格中有100个顶点时,我会得到100X100距离,我想将它们存储在100x100距离矩阵中。

我使用CGAL(因此也是BOOST),我几乎没有经验。

这是我到目前为止所做的:

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <iterator>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Random.h>
#include <CGAL/Polyhedron_3.h>
#include <CGAL/Polyhedron_items_with_id_3.h>
#include <CGAL/IO/Polyhedron_iostream.h>
#include <CGAL/Surface_mesh_shortest_path.h>
#include <CGAL/boost/graph/graph_traits_Polyhedron_3.h>
#include <CGAL/boost/graph/iterator.h>
#include "boost/multi_array.hpp"

typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef CGAL::Polyhedron_3<Kernel, CGAL::Polyhedron_items_with_id_3> Polyhedron_3;
typedef CGAL::Surface_mesh_shortest_path_traits<Kernel, Polyhedron_3> Traits;
typedef CGAL::Surface_mesh_shortest_path<Traits> Surface_mesh_shortest_path;
typedef Surface_mesh_shortest_path::Shortest_path_result Shortest_path_result;

typedef boost::graph_traits<Polyhedron_3> Graph_traits;
typedef Graph_traits::vertex_iterator vertex_iterator;
typedef Graph_traits::vertex_descriptor vertex_desc;
typedef Graph_traits::face_iterator face_iterator;

typedef boost::multi_array<double, 2> distArray;
typedef distArray::index distArrayIndex;

class DistanceMeasure {
public:
    static distArray getDistances(Polyhedron_3 p);
};

作为我的头文件并且:

#include "DistanceMeasure.h"

distArray DistanceMeasure::getDistances(Polyhedron_3 p) {
    distArray dists(boost::extents[p.size_of_vertices()][p.size_of_vertices()]);
    // pick up a random face
    CGAL::set_halfedgeds_items_id(p);

    vertex_iterator pit = vertices(p).first;

    // construct a shortest path query object and add a source point
    Surface_mesh_shortest_path shortest_paths(p);

    //add all points from p to the source points
    for ( pit = vertices(p).first; pit != vertices(p).end(); pit++)
        shortest_paths.add_source_point(*pit);

    //for all points in p get distance to all the other points
    vertex_iterator vit, vit_end;
    for ( boost::tie(vit, vit_end) = vertices(p);
    vit != vit_end; ++vit)
    {
        //get distances
        Shortest_path_result res = shortest_paths.shortest_distance_to_source_points(*vit);

        //iterate over all query results
        Surface_mesh_shortest_path::Source_point_iterator spit;
        int count = 0;
        for(spit = res.second; spit != shortest_paths.source_points_end(); spit++) {
            count++;
        }
    }
    return dists;
}

我的源文件。

在我不知情的情况下,我将获得与res中所有其他点的距离,并可以在

中迭代它们
for(spit = res.second; spit != shortest_paths.source_points_end(); spit++) {
            count++;
}

因此我有两个问题: 第一: 我说得对吗?我在res中有所有距离吗? 第二个: 如何在我的结果(以及吐出)中获取顶点和距离的id,以便能够识别它们并将它们的距离存储在dists数组中。

到目前为止我的想法是,顺序可能是我将点放入源点的顺序。

当我用例如100个顶点并使用count来计算res中的顶点数量。

100 99 98 97 96 95 .. 2 1

我认为这可能是因为CGAL没有计算两次距离。 我仍然不确定索引。

感谢您的回答 斯特芬

1 个答案:

答案 0 :(得分:-1)

对于遇到类似问题的每个人: 我无法为我提出的第一个问题提供解决方案,但交叉问题可能会在CGAL中计算出来,如下所示: http://doc.cgal.org/latest/AABB_tree/index.html