Demonstrates flattening using a conjugate gradient solver instead of SparseLU.
#include <iostream>
#include <Eigen/IterativeLinearSolvers>
#include "OpenABF/OpenABF.hpp"
auto main() -> int
{
using Mtx = Eigen::SparseMatrix<float>;
using ABFSolver = Eigen::ConjugateGradient<Mtx, Eigen::Lower | Eigen::Upper>;
using LSCMSolver = Eigen::LeastSquaresConjugateGradient<Mtx>;
const std::vector vertices = {Vec3f{0.f, 0.f, 0.f}, Vec3f{2.f, 0.f, 0.f},
Vec3f{1.f, std::sqrt(3.f), 0.f},
Vec3f{1.f, std::sqrt(3.f) / 3.f, std::sqrt(6.f) * 2.f / 3.f}};
auto mesh = ABF::Mesh::New();
mesh->insert_vertices(vertices);
mesh->insert_faces({{1, 3, 0}, {3, 2, 0}, {3, 1, 2}});
std::size_t iters{0};
std::cout << "ABF++ Final gradient: " << grad << std::endl;
std::cout << "ABF++ Iterations: " << iters << std::endl;
for (const auto& v : mesh->vertices()) {
std::cout << v->idx << ": " << vertices[v->idx] << " -> " << v->pos << std::endl;
}
WriteMesh("openabf_example_alternative_solvers.obj", mesh);
}
Compute parameterized interior angles using ABF++.
Definition OpenABF.hpp:2640
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.
Definition OpenABF.hpp:2678
MeshType Mesh
Mesh type alias.
Definition OpenABF.hpp:2643
Compute parameterized mesh using Angle-based LSCM.
Definition OpenABF.hpp:2987
static void Compute(typename Mesh::Pointer &mesh)
Compute the parameterized mesh using automatic pin selection.
Definition OpenABF.hpp:3018
Vec< float, 3 > Vec3f
3D, 32-bit float vector
Definition OpenABF.hpp:419
constexpr T INF
Inf, templated for floating-point type.
Definition OpenABF.hpp:69