OpenABF 2.1.0
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Static Public Member Functions | Private Attributes | List of all members
OpenABF::ABFPlusPlus< T, MeshType, Solver, > Class Template Reference

Compute parameterized interior angles using ABF++. More...

#include <OpenABF/OpenABF.hpp>

Public Types

using Mesh = MeshType
 Mesh type alias.
 

Public Member Functions

void setMaxIterations (std::size_t it)
 Set the maximum number of iterations.
 
void setGradientThreshold (T t)
 Set the gradient convergence threshold.
 
auto gradient () const -> T
 Get the mesh gradient.
 
auto iterations () const -> std::size_t
 Get the number of iterations of the last computation.
 
void compute (typename Mesh::Pointer &mesh)
 Compute parameterized interior angles.
 

Static Public Member Functions

static void Compute (typename Mesh::Pointer &mesh, std::size_t &iters, T &gradient, const std::size_t maxIters=10, T gradThreshold=T(0.001))
 Compute parameterized interior angles.
 
static void Compute (typename Mesh::Pointer &mesh)
 Compute parameterized interior angles.
 

Private Attributes

grad_ {0}
 
std::size_t iters_ {0}
 
std::size_t maxIters_ {10}
 
gradThreshold_ {0.001}
 

Detailed Description

template<typename T, class MeshType = detail::ABF::Mesh<T>, class Solver = Eigen::SparseLU<Eigen::SparseMatrix<T>, Eigen::COLAMDOrdering<int>>, std::enable_if_t< std::is_floating_point_v< T >, bool > = true>
class OpenABF::ABFPlusPlus< T, MeshType, Solver, >

Compute parameterized interior angles using ABF++.

Iteratively computes a new set of interior angles which minimize the total angular error of the parameterized mesh. This follows the ABF++ formulation, which solves a 5x smaller system of equations than standard ABF at the expense of more iterations.

This class does not compute a parameterized mesh. Rather, it calculates the optimal interior angles for such a mesh. To convert this information into a full parameterization, pass the processed HalfEdgeMesh to AngleBasedLSCM.

Implements "ABF++: Fast and Robust Angle Based Flattening" by Sheffer et al. (2005) [5].

Template Parameters
TFloating-point type
MeshTypeHalfEdgeMesh type which implements the ABF traits
SolverA solver implementing the Eigen Sparse solver concept and templated on Eigen::SparseMatrix<T>
Examples
AlternativeSolvers.cpp, BasicFlattening.cpp, CloneMesh.cpp, FlattenTool.cpp, and SplitPath.cpp.

Member Function Documentation

◆ compute()

template<typename T , class MeshType = detail::ABF::Mesh<T>, class Solver = Eigen::SparseLU<Eigen::SparseMatrix<T>, Eigen::COLAMDOrdering<int>>, std::enable_if_t< std::is_floating_point_v< T >, bool > = true>
void OpenABF::ABFPlusPlus< T, MeshType, Solver, >::compute ( typename Mesh::Pointer &  mesh)
inline

Compute parameterized interior angles.

Exceptions
SolverExceptionIf matrix cannot be decomposed or if solver fails to find a solution.
MeshExceptionIf mesh gradient cannot be calculated.

◆ Compute()

template<typename T , class MeshType = detail::ABF::Mesh<T>, class Solver = Eigen::SparseLU<Eigen::SparseMatrix<T>, Eigen::COLAMDOrdering<int>>, std::enable_if_t< std::is_floating_point_v< T >, bool > = true>
static void OpenABF::ABFPlusPlus< T, MeshType, Solver, >::Compute ( typename Mesh::Pointer &  mesh,
std::size_t &  iters,
T &  gradient,
const std::size_t  maxIters = 10,
gradThreshold = T(0.001) 
)
inlinestatic

Compute parameterized interior angles.

Exceptions
SolverExceptionIf matrix cannot be decomposed or if solver fails to find a solution.
MeshExceptionIf mesh gradient cannot be calculated.
Examples
AlternativeSolvers.cpp, BasicFlattening.cpp, CloneMesh.cpp, FlattenTool.cpp, and SplitPath.cpp.

◆ gradient()

template<typename T , class MeshType = detail::ABF::Mesh<T>, class Solver = Eigen::SparseLU<Eigen::SparseMatrix<T>, Eigen::COLAMDOrdering<int>>, std::enable_if_t< std::is_floating_point_v< T >, bool > = true>
auto OpenABF::ABFPlusPlus< T, MeshType, Solver, >::gradient ( ) const -> T
inline

Get the mesh gradient.

Note: Result is only valid after running compute().

◆ iterations()

template<typename T , class MeshType = detail::ABF::Mesh<T>, class Solver = Eigen::SparseLU<Eigen::SparseMatrix<T>, Eigen::COLAMDOrdering<int>>, std::enable_if_t< std::is_floating_point_v< T >, bool > = true>
auto OpenABF::ABFPlusPlus< T, MeshType, Solver, >::iterations ( ) const -> std::size_t
inline

Get the number of iterations of the last computation.

Note: Result is only valid after running compute().

Member Data Documentation

◆ grad_

template<typename T , class MeshType = detail::ABF::Mesh<T>, class Solver = Eigen::SparseLU<Eigen::SparseMatrix<T>, Eigen::COLAMDOrdering<int>>, std::enable_if_t< std::is_floating_point_v< T >, bool > = true>
T OpenABF::ABFPlusPlus< T, MeshType, Solver, >::grad_ {0}
private

Gradient

◆ gradThreshold_

template<typename T , class MeshType = detail::ABF::Mesh<T>, class Solver = Eigen::SparseLU<Eigen::SparseMatrix<T>, Eigen::COLAMDOrdering<int>>, std::enable_if_t< std::is_floating_point_v< T >, bool > = true>
T OpenABF::ABFPlusPlus< T, MeshType, Solver, >::gradThreshold_ {0.001}
private

Gradient convergence threshold

◆ iters_

template<typename T , class MeshType = detail::ABF::Mesh<T>, class Solver = Eigen::SparseLU<Eigen::SparseMatrix<T>, Eigen::COLAMDOrdering<int>>, std::enable_if_t< std::is_floating_point_v< T >, bool > = true>
std::size_t OpenABF::ABFPlusPlus< T, MeshType, Solver, >::iters_ {0}
private

Number of executed iterations

◆ maxIters_

template<typename T , class MeshType = detail::ABF::Mesh<T>, class Solver = Eigen::SparseLU<Eigen::SparseMatrix<T>, Eigen::COLAMDOrdering<int>>, std::enable_if_t< std::is_floating_point_v< T >, bool > = true>
std::size_t OpenABF::ABFPlusPlus< T, MeshType, Solver, >::maxIters_ {10}
private

Max iterations