Merge pull request #908 from MeshGeometry/master
Added optional weights to Dijkstra's algorithm + some template definitions
This commit is contained in:
@@ -165,4 +165,5 @@ template void igl::adjacency_list<Eigen::Matrix<int, -1, 2, 0, -1, 2>, int>(Eige
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::adjacency_list<Eigen::Matrix<int, -1, -1, 0, -1, -1>, int>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&, bool);
|
||||
template void igl::adjacency_list<Eigen::Matrix<int, -1, 3, 0, -1, 3>, int>(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&, bool);
|
||||
template void igl::adjacency_list<class Eigen::Matrix<int, -1, -1, 0, -1, -1>, unsigned int>(class Eigen::PlainObjectBase<class Eigen::Matrix<int, -1, -1, 0, -1, -1> > const &, class std::vector<class std::vector<unsigned int, class std::allocator<unsigned int> >, class std::allocator<class std::vector<unsigned int, class std::allocator<unsigned int> > > > &, bool);
|
||||
#endif
|
||||
|
||||
@@ -64,4 +64,5 @@ IGL_INLINE void igl::centroid(
|
||||
// generated by autoexplicit.sh
|
||||
template void igl::centroid<Eigen::Matrix<float, -1, 3, 1, -1, 3>, Eigen::Matrix<int, -1, 3, 1, -1, 3>, Eigen::Matrix<float, 1, 3, 1, 1, 3> >(Eigen::MatrixBase<Eigen::Matrix<float, -1, 3, 1, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<float, 1, 3, 1, 1, 3> >&);
|
||||
template void igl::centroid<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, 3, 1, 0, 3, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> >&);
|
||||
template void igl::centroid<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, 1, 3, 1, 1, 3> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, 1, 3, 1, 1, 3> >&);
|
||||
#endif
|
||||
|
||||
+27
-12
@@ -5,14 +5,16 @@
|
||||
// This Source Code Form is subject to the terms of the Mozilla Public License
|
||||
// v. 2.0. If a copy of the MPL was not distributed with this file, You can
|
||||
// obtain one at http://mozilla.org/MPL/2.0/.
|
||||
#include <igl/dijkstra.h>
|
||||
#include "dijkstra.h"
|
||||
|
||||
template <typename IndexType, typename DerivedD, typename DerivedP>
|
||||
IGL_INLINE int igl::dijkstra_compute_paths(const IndexType &source,
|
||||
const std::set<IndexType> &targets,
|
||||
const std::vector<std::vector<IndexType> >& VV,
|
||||
Eigen::PlainObjectBase<DerivedD> &min_distance,
|
||||
Eigen::PlainObjectBase<DerivedP> &previous)
|
||||
IGL_INLINE int igl::dijkstra(
|
||||
const IndexType &source,
|
||||
const std::set<IndexType> &targets,
|
||||
const std::vector<std::vector<IndexType> >& VV,
|
||||
const std::vector<double>& weights,
|
||||
Eigen::PlainObjectBase<DerivedD> &min_distance,
|
||||
Eigen::PlainObjectBase<DerivedP> &previous)
|
||||
{
|
||||
int numV = VV.size();
|
||||
min_distance.setConstant(numV, 1, std::numeric_limits<typename DerivedD::Scalar>::infinity());
|
||||
@@ -37,7 +39,7 @@ IGL_INLINE int igl::dijkstra_compute_paths(const IndexType &source,
|
||||
neighbor_iter++)
|
||||
{
|
||||
IndexType v = *neighbor_iter;
|
||||
typename DerivedD::Scalar distance_through_u = dist + 1.;
|
||||
typename DerivedD::Scalar distance_through_u = dist + weights[u];
|
||||
if (distance_through_u < min_distance[v]) {
|
||||
vertex_queue.erase(std::make_pair(min_distance[v], v));
|
||||
|
||||
@@ -53,10 +55,23 @@ IGL_INLINE int igl::dijkstra_compute_paths(const IndexType &source,
|
||||
return -1;
|
||||
}
|
||||
|
||||
template <typename IndexType, typename DerivedD, typename DerivedP>
|
||||
IGL_INLINE int igl::dijkstra(
|
||||
const IndexType &source,
|
||||
const std::set<IndexType> &targets,
|
||||
const std::vector<std::vector<IndexType> >& VV,
|
||||
Eigen::PlainObjectBase<DerivedD> &min_distance,
|
||||
Eigen::PlainObjectBase<DerivedP> &previous)
|
||||
{
|
||||
std::vector<double> weights(VV.size(), 1.0);
|
||||
return dijkstra(source, targets, VV, weights, min_distance, previous);
|
||||
}
|
||||
|
||||
template <typename IndexType, typename DerivedP>
|
||||
IGL_INLINE void igl::dijkstra_get_shortest_path_to(const IndexType &vertex,
|
||||
const Eigen::PlainObjectBase<DerivedP> &previous,
|
||||
std::vector<IndexType> &path)
|
||||
IGL_INLINE void igl::dijkstra(
|
||||
const IndexType &vertex,
|
||||
const Eigen::MatrixBase<DerivedP> &previous,
|
||||
std::vector<IndexType> &path)
|
||||
{
|
||||
IndexType source = vertex;
|
||||
path.clear();
|
||||
@@ -66,6 +81,6 @@ IGL_INLINE void igl::dijkstra_get_shortest_path_to(const IndexType &vertex,
|
||||
|
||||
#ifdef IGL_STATIC_LIBRARY
|
||||
// Explicit template instantiation
|
||||
template int igl::dijkstra_compute_paths<int, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(int const&, std::set<int, std::less<int>, std::allocator<int> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
|
||||
template void igl::dijkstra_get_shortest_path_to<int, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(int const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, std::vector<int, std::allocator<int> >&);
|
||||
template int igl::dijkstra<int, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(int const&, std::set<int, std::less<int>, std::allocator<int> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
|
||||
template void igl::dijkstra<int, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(int const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, std::vector<int, std::allocator<int> >&);
|
||||
#endif
|
||||
|
||||
+35
-10
@@ -16,7 +16,30 @@
|
||||
|
||||
namespace igl {
|
||||
|
||||
// Dijstra's algorithm for shortest paths, with multiple targets.
|
||||
// Dijkstra's algorithm for vertex-weighted shortest paths, with multiple targets.
|
||||
// Adapted from http://rosettacode.org/wiki/Dijkstra%27s_algorithm .
|
||||
//
|
||||
// Inputs:
|
||||
// source index of source vertex
|
||||
// targets target vector set
|
||||
// VV #V list of lists of incident vertices (adjacency list), e.g.
|
||||
// as returned by igl::adjacency_list
|
||||
// weights #V list of scalar vertex weights
|
||||
//
|
||||
// Output:
|
||||
// min_distance #V by 1 list of the minimum distances from source to all vertices
|
||||
// previous #V by 1 list of the previous visited vertices (for each vertex) - used for backtracking
|
||||
//
|
||||
template <typename IndexType, typename DerivedD, typename DerivedP>
|
||||
IGL_INLINE int dijkstra(
|
||||
const IndexType &source,
|
||||
const std::set<IndexType> &targets,
|
||||
const std::vector<std::vector<IndexType> >& VV,
|
||||
const std::vector<double>& weights,
|
||||
Eigen::PlainObjectBase<DerivedD> &min_distance,
|
||||
Eigen::PlainObjectBase<DerivedP> &previous);
|
||||
|
||||
// Dijkstra's algorithm for shortest paths, with multiple targets.
|
||||
// Adapted from http://rosettacode.org/wiki/Dijkstra%27s_algorithm .
|
||||
//
|
||||
// Inputs:
|
||||
@@ -30,13 +53,14 @@ namespace igl {
|
||||
// previous #V by 1 list of the previous visited vertices (for each vertex) - used for backtracking
|
||||
//
|
||||
template <typename IndexType, typename DerivedD, typename DerivedP>
|
||||
IGL_INLINE int dijkstra_compute_paths(const IndexType &source,
|
||||
const std::set<IndexType> &targets,
|
||||
const std::vector<std::vector<IndexType> >& VV,
|
||||
Eigen::PlainObjectBase<DerivedD> &min_distance,
|
||||
Eigen::PlainObjectBase<DerivedP> &previous);
|
||||
IGL_INLINE int dijkstra(
|
||||
const IndexType &source,
|
||||
const std::set<IndexType> &targets,
|
||||
const std::vector<std::vector<IndexType> >& VV,
|
||||
Eigen::PlainObjectBase<DerivedD> &min_distance,
|
||||
Eigen::PlainObjectBase<DerivedP> &previous);
|
||||
|
||||
// Backtracking after Dijstra's algorithm, to find shortest path.
|
||||
// Backtracking after Dijkstra's algorithm, to find shortest path.
|
||||
//
|
||||
// Inputs:
|
||||
// vertex vertex to which we want the shortest path (from same source as above)
|
||||
@@ -46,9 +70,10 @@ namespace igl {
|
||||
// path #P by 1 list of vertex indices in the shortest path from source to vertex
|
||||
//
|
||||
template <typename IndexType, typename DerivedP>
|
||||
IGL_INLINE void dijkstra_get_shortest_path_to(const IndexType &vertex,
|
||||
const Eigen::PlainObjectBase<DerivedP> &previous,
|
||||
std::vector<IndexType> &path);
|
||||
IGL_INLINE void dijkstra(
|
||||
const IndexType &vertex,
|
||||
const Eigen::MatrixBase<DerivedP> &previous,
|
||||
std::vector<IndexType> &path);
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -102,4 +102,7 @@ namespace igl {
|
||||
|
||||
|
||||
|
||||
#ifdef IGL_STATIC_LIBRARY
|
||||
template void igl::knn<Eigen::Matrix<double, -1, -1, 0, -1, -1>, int, int, Eigen::Matrix<int, -1, 8, 0, -1, 8>, Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, int const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 8, 0, -1, 8> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);
|
||||
#endif
|
||||
|
||||
|
||||
@@ -73,4 +73,5 @@ template void igl::polygon_mesh_to_triangle_mesh<int, Eigen::Matrix<unsigned int
|
||||
template void igl::polygon_mesh_to_triangle_mesh<int, Eigen::Matrix<int, -1, 3, 0, -1, 3> >(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> >&);
|
||||
template void igl::polygon_mesh_to_triangle_mesh<int, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);
|
||||
template void igl::polygon_mesh_to_triangle_mesh<int, Eigen::Matrix<int, -1, 3, 1, -1, 3> >(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 3, 1, -1, 3> >&);
|
||||
template void igl::polygon_mesh_to_triangle_mesh<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);
|
||||
#endif
|
||||
|
||||
@@ -119,4 +119,5 @@ template void igl::remove_unreferenced<Eigen::Matrix<double, -1, 3, 0, -1, 3>, E
|
||||
template void igl::remove_unreferenced<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, 3, 0, -1, 3>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
|
||||
template void igl::remove_unreferenced<Eigen::Matrix<double, -1, 3, 0, -1, 3>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 3, 0, -1, 3> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
|
||||
template void igl::remove_unreferenced<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> >&);
|
||||
template void igl::remove_unreferenced<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user