mirror of https://github.com/CGAL/cgal
Add a constructor and two functions to get started
This commit is contained in:
parent
4accc67abb
commit
dd8bf1f4df
|
|
@ -1,5 +1,7 @@
|
||||||
#include <CGAL/Simple_cartesian.h>
|
#include <CGAL/Simple_cartesian.h>
|
||||||
#include <CGAL/Surface_mesh.h>
|
#include <CGAL/Surface_mesh.h>
|
||||||
|
#include <CGAL/Heat_method_3/Heat_method_3.h>
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
|
|
@ -7,11 +9,23 @@
|
||||||
typedef CGAL::Simple_cartesian<double> Kernel;
|
typedef CGAL::Simple_cartesian<double> Kernel;
|
||||||
typedef Kernel::Point_3 Point;
|
typedef Kernel::Point_3 Point;
|
||||||
typedef CGAL::Surface_mesh<Point> Mesh;
|
typedef CGAL::Surface_mesh<Point> Mesh;
|
||||||
|
typedef CGAL::Heat_method_3::Heat_method_3<Mesh,Kernel> Heat_method;
|
||||||
|
|
||||||
typedef boost::graph_traits<Mesh>::vertex_descriptor vertex_descriptor;
|
typedef boost::graph_traits<Mesh>::vertex_descriptor vertex_descriptor;
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
Mesh sm;
|
Mesh sm;
|
||||||
|
std::ifstream in(argv[1]);
|
||||||
|
in >> sm;
|
||||||
|
|
||||||
|
Heat_method hm(sm);
|
||||||
|
|
||||||
|
vertex_descriptor source = *(vertices(sm).first);
|
||||||
|
hm.add_source(source);
|
||||||
|
|
||||||
|
BOOST_FOREACH(vertex_descriptor vd , vertices(sm)){
|
||||||
|
std::cout << vd << " is at distance " << hm.distance(vd) << " from " << source << std::endl;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,21 +25,64 @@
|
||||||
#include <CGAL/license/Heat_method_3.h>
|
#include <CGAL/license/Heat_method_3.h>
|
||||||
|
|
||||||
#include <CGAL/disable_warnings.h>
|
#include <CGAL/disable_warnings.h>
|
||||||
|
#include <set>
|
||||||
|
|
||||||
|
#include <Eigen/Cholesky>
|
||||||
|
|
||||||
namespace CGAL {
|
namespace CGAL {
|
||||||
namespace Heat_method_3 {
|
namespace Heat_method_3 {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class `Heat_method_3` is a ...
|
* Class `Heat_method_3` is a ...
|
||||||
*
|
* \tparam TriangleMesh a triangulated surface mesh, model of `FaceGraph` and `HalfedgeListGraph`
|
||||||
* \tparam HMTraits must
|
* \tparam Traits a model of HeatMethodTraits_3
|
||||||
* \sa `AA`
|
* \tparam VertexPointMap a model of `ReadablePropertyMap` with
|
||||||
|
* `boost::graph_traits<TriangleMesh>::%vertex_descriptor` as key and
|
||||||
|
* `Traits::Point_3` as value type.
|
||||||
|
* The default is `typename boost::property_map< TriangleMesh, vertex_point_t>::%type`.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
template <typename HMTraits>
|
template <typename TriangleMesh,
|
||||||
|
typename Traits,
|
||||||
|
typename VertexPointMap = typename boost::property_map< TriangleMesh, vertex_point_t>::type>
|
||||||
class Heat_method_3
|
class Heat_method_3
|
||||||
{
|
{
|
||||||
|
/// Polygon_mesh typedefs
|
||||||
|
typedef typename boost::graph_traits<TriangleMesh> graph_traits;
|
||||||
|
typedef typename graph_traits::vertex_descriptor vertex_descriptor;
|
||||||
|
typedef typename graph_traits::edge_descriptor edge_descriptor;
|
||||||
|
typedef typename graph_traits::halfedge_descriptor halfedge_descriptor;
|
||||||
|
typedef typename graph_traits::face_descriptor face_descriptor;
|
||||||
|
|
||||||
|
/// Geometric typedefs
|
||||||
|
typedef typename Traits::Point_3 Point_3;
|
||||||
|
typedef typename Traits::FT FT;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
Heat_method_3(const TriangleMesh& tm)
|
||||||
|
: tm(tm)
|
||||||
|
{}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* add `vd` to the source set, returning `false` if `vd` is already in the set.
|
||||||
|
*/
|
||||||
|
bool add_source(vertex_descriptor vd)
|
||||||
|
{
|
||||||
|
return sources.insert(vd).second;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get distance from the current source set to a vertex ` vd`.
|
||||||
|
*/
|
||||||
|
double distance(vertex_descriptor vd)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
const TriangleMesh& tm;
|
||||||
|
std::set<vertex_descriptor> sources;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Heat_method_3
|
} // namespace Heat_method_3
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
class Surface_mesh_geodesic_distance
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// METHODS FOR QUERYING DISTANCE =======================
|
||||||
|
|
||||||
|
// Distance to a single source
|
||||||
|
double getDistance( Vertex y ); // get distance from the current source set to a vertex y
|
||||||
|
void getDistance( VertexSet T, VertexValuePairs dist ); // get distance from the current source set to each vertex in T
|
||||||
|
void getDistance( VertexFunction& dist ); // get distance from the current source set to all vertices
|
||||||
|
|
||||||
|
// All-pairs distance query
|
||||||
|
void allPairsDistance( VertexSet S, Matrix D ); // compute all distances between pairs of points in S
|
||||||
|
|
||||||
|
// Furthest point queries
|
||||||
|
void furthestPoint( Vertex& p, double& furthestDistance ); // find the point furthest from the current source set, and its distance; if there is not a unique furthest point, pick an arbitrary point
|
||||||
|
|
||||||
|
// Distance gradients
|
||||||
|
double getDistanceGradient( Vertex y ); // get distance gradient with respect to the current source set to a vertex y
|
||||||
|
void getDistanceGradient( VertexSet T, VertexValuePairs dist ); // get distance gradient with respect to the current source set to each vertex in T
|
||||||
|
void getDistanceGradient( VertexFunction& dist ); // get distance gradient with respect to the current source set to all vertices
|
||||||
|
|
||||||
|
// METHODS FOR SPECIFYING SOURCE SET ===================
|
||||||
|
bool addSource( Vertex s ); // add s to the source set, returning false if s is already in the set
|
||||||
|
bool removeSource( Vertex s ); // remove s to the source set, returning false if s is not in the set
|
||||||
|
void getSources( VertexSet& S ); // get the list of current sources
|
||||||
|
void clearSources(); // empty the source set
|
||||||
|
SourcePointIterator sourcesBegin(); // iterator to beginning of source list
|
||||||
|
SourcePointIterator sourcesEnd(); // iterator end end of source list
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// precomputed data
|
||||||
|
CholeskyFactorization Lheat; // factorization for Step I of heat method
|
||||||
|
CholeskyFactorization Lpoisson; // factorization for Step II of heat method
|
||||||
|
SurfaceMesh remesh; // intrinsic Delaunay mesh
|
||||||
|
|
||||||
|
VertexSet sources;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -0,0 +1,67 @@
|
||||||
|
// Copyright (c) 2016 GeometryFactory SARL (France).
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public License as
|
||||||
|
// published by the Free Software Foundation; either version 3 of the License,
|
||||||
|
// or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// Licensees holding a valid commercial license may use this file in
|
||||||
|
// accordance with the commercial license agreement provided with the software.
|
||||||
|
//
|
||||||
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||||
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
//
|
||||||
|
// $URL$
|
||||||
|
// $Id$
|
||||||
|
// SPDX-License-Identifier: LGPL-3.0+
|
||||||
|
//
|
||||||
|
// Author(s) : Andreas Fabri
|
||||||
|
//
|
||||||
|
// Warning: this file is generated, see include/CGAL/licence/README.md
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef CGAL_LICENSE_HEAT_METHOD_3_H
|
||||||
|
#define CGAL_LICENSE_HEAT_METHOD_3_H
|
||||||
|
|
||||||
|
#include <CGAL/config.h>
|
||||||
|
#include <CGAL/license.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CGAL_HEAT_METHOD_3_COMMERCIAL_LICENSE
|
||||||
|
|
||||||
|
# if CGAL_HEAT_METHOD_3_COMMERCIAL_LICENSE < CGAL_RELEASE_DATE
|
||||||
|
|
||||||
|
# if defined(CGAL_LICENSE_WARNING)
|
||||||
|
|
||||||
|
CGAL_pragma_warning("Your commercial license for CGAL does not cover "
|
||||||
|
"this release of the 3D Heat Method package.")
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifdef CGAL_LICENSE_ERROR
|
||||||
|
# error "Your commercial license for CGAL does not cover this release \
|
||||||
|
of the 3D Heat Method package. \
|
||||||
|
You get this error, as you defined CGAL_LICENSE_ERROR."
|
||||||
|
# endif // CGAL_LICENSE_ERROR
|
||||||
|
|
||||||
|
# endif // CGAL_HEAT_METHOD_3_COMMERCIAL_LICENSE < CGAL_RELEASE_DATE
|
||||||
|
|
||||||
|
#else // no CGAL_HEAT_METHOD_3_COMMERCIAL_LICENSE
|
||||||
|
|
||||||
|
# if defined(CGAL_LICENSE_WARNING)
|
||||||
|
CGAL_pragma_warning("\nThe macro CGAL_HEAT_METHOD_3_COMMERCIAL_LICENSE is not defined."
|
||||||
|
"\nYou use the CGAL 3D Heat Method package under "
|
||||||
|
"the terms of the GPLv3+.")
|
||||||
|
# endif // CGAL_LICENSE_WARNING
|
||||||
|
|
||||||
|
# ifdef CGAL_LICENSE_ERROR
|
||||||
|
# error "The macro CGAL_HEAT_METHOD_3_COMMERCIAL_LICENSE is not defined.\
|
||||||
|
You use the CGAL 3D Heat Method package under the terms of \
|
||||||
|
the GPLv3+. You get this error, as you defined CGAL_LICENSE_ERROR."
|
||||||
|
# endif // CGAL_LICENSE_ERROR
|
||||||
|
|
||||||
|
#endif // no CGAL_HEAT_METHOD_3_COMMERCIAL_LICENSE
|
||||||
|
|
||||||
|
#endif // CGAL_LICENSE_CHECK_HEAT_METHOD_3_H
|
||||||
Loading…
Reference in New Issue