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

Compute parameterized interior angles using Angle-based flattening. More...

#include <OpenABF/OpenABF.hpp>

Public Types

using Mesh = MeshType
 Mesh type alias.
 

Public Member Functions

void setMaxIterations (const 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.
 

Protected 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::ABF< T, MeshType, Solver, >

Compute parameterized interior angles using Angle-based flattening.

Iteratively computes a new set of interior angles which minimize the total angular error of the parameterized mesh. This follows the standard angled-based flattening formulation, which directly solves for the objective functions and constraints. ABFPlusPlus is generally preferred as it dramatically simplifies the size of the solved problem without introducing more error.

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 "Parameterization of faceted surfaces for meshing using angle-based flattening" by Sheffer and de Sturler (2001) [4].

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>

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::ABF< 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() [1/2]

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::ABF< T, MeshType, Solver, >::Compute ( typename Mesh::Pointer &  mesh)
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.

◆ Compute() [2/2]

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::ABF< 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.

◆ 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::ABF< 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::ABF< 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::ABF< T, MeshType, Solver, >::grad_ {0}
protected

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::ABF< T, MeshType, Solver, >::gradThreshold_ {0.001}
protected

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::ABF< T, MeshType, Solver, >::iters_ {0}
protected

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::ABF< T, MeshType, Solver, >::maxIters_ {10}
protected

Max iterations