PolyFEM
Loading...
Searching...
No Matches
SplineParametrizations.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "Parametrization.hpp"
4
5#include <Eigen/Core>
6
7namespace polyfem
8{
9 namespace legacy
10 {
11 class State;
12 }
13 class BSplineParametrization2D;
14 class BSplineParametrization3D;
15} // namespace polyfem
16
17namespace polyfem::solver
18{
20 {
21 public:
22 BSplineParametrization1DTo2D(const Eigen::MatrixXd &initial_control_points, const Eigen::VectorXd &knots, const int num_vertices, const bool exclude_ends = true)
23 : initial_control_points_(initial_control_points), knots_(knots), size_(num_vertices), exclude_ends_(exclude_ends) {}
24
25 int inverse_size(int y_size) const override;
26
27 // Should only be called to initialize the parameter, when the shape matches the initial control points.
28 Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override;
29 int size(const int x_size) const override
30 {
31 return 2 * size_;
32 };
33 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
34 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad_full, const Eigen::VectorXd &x) const override;
35
36 private:
37 const Eigen::MatrixXd initial_control_points_;
38 const Eigen::VectorXd knots_;
39
40 const int size_;
41 const bool exclude_ends_;
42
43 // TODO: This is a workaround. I want to make inverse_eval() const,
44 // but right now it's used as initializer/cache layer so not possible.
45 mutable bool invoked_inverse_eval_ = false;
46 mutable std::shared_ptr<BSplineParametrization2D> spline_;
47 };
48
49 // Comment out because this class is half-baked. Some methods are dummy.
50 //
51 // class BSplineParametrization2DTo3D : public Parametrization
52 // {
53 // public:
54 // BSplineParametrization2DTo3D(const Eigen::MatrixXd &initial_control_point_grid, const Eigen::VectorXd &knots_u, const Eigen::VectorXd &knots_v, const bool exclude_ends = true) : initial_control_point_grid_(initial_control_point_grid), knots_u_(knots_u), knots_v_(knots_v), exclude_ends_(exclude_ends) {}
55 //
56 // // Should only be called to initialize the parameter, when the shape matches the initial control points.
57 // Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override;
58 // int size(const int x_size) const override { return 3 * u_.size() * v_.size(); }
59 // Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
60 // Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad_full, const Eigen::VectorXd &x) const override;
61 //
62 // private:
63 // const Eigen::MatrixXd initial_control_point_grid_;
64 // const Eigen::VectorXd knots_u_;
65 // const Eigen::VectorXd knots_v_;
66 //
67 // std::shared_ptr<BSplineParametrization3D> spline_;
68 //
69 // Eigen::VectorXd u_;
70 // Eigen::VectorXd v_;
71 //
72 // bool invoked_inverse_eval_ = false;
73 //
74 // const bool exclude_ends_;
75 // };
76
78 {
79 public:
80 BoundedBiharmonicWeights2Dto3D(const int num_control_vertices, const int num_vertices, const Eigen::MatrixXd &V_surface, const Eigen::MatrixXi &F_surface) : num_control_vertices_(num_control_vertices), num_vertices_(num_vertices), V_surface_(V_surface), F_surface_(F_surface), allow_rotations_(true) {}
81 BoundedBiharmonicWeights2Dto3D(const int num_control_vertices, const int num_vertices, const legacy::State &state, const bool allow_rotations);
82
83 int inverse_size(int y_size) const override;
84
85 // Should only be called to initialize the parameter, when the shape matches the initial control points.
86 Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override;
87 int size(const int x_size) const override { return num_vertices_ * 3; }
88 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
89 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad_full, const Eigen::VectorXd &x) const override;
90
91 Eigen::MatrixXd get_bbw_weights() { return bbw_weights_; }
92
93 private:
94 void compute_faces_for_partial_vertices(const Eigen::MatrixXd &V, Eigen::MatrixXi &F) const;
95
96 int optimal_new_control_point_idx(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, const Eigen::VectorXi &boundary_loop, const std::vector<int> &existing_points) const;
97
99 const int num_vertices_;
100
101 // TODO: This is a workaround. I want to make inverse_eval() const,
102 // but right now it's used as initializer/cache layer so not possible.
103 mutable bool invoked_inverse_eval_ = false;
104 mutable Eigen::VectorXd y_start;
105 mutable Eigen::MatrixXd control_points_;
106 mutable Eigen::MatrixXd bbw_weights_;
107 mutable Eigen::MatrixXd boundary_bbw_weights_;
108
109 Eigen::MatrixXd V_surface_;
110 Eigen::MatrixXi F_surface_;
111
113 };
114
115} // namespace polyfem::solver
int V
int y
int x
main class that contains the polyfem solver and all its state
Definition State.hpp:114
int inverse_size(int y_size) const override
Compute DOF of x given DOF of y.
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad_full, const Eigen::VectorXd &x) const override
Apply jacobian for chain rule.
std::shared_ptr< BSplineParametrization2D > spline_
int size(const int x_size) const override
Compute DOF of y given DOF of x.
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
Eval y = f(x).
BSplineParametrization1DTo2D(const Eigen::MatrixXd &initial_control_points, const Eigen::VectorXd &knots, const int num_vertices, const bool exclude_ends=true)
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override
Eval x = f^-1 (y).
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
Eval y = f(x).
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad_full, const Eigen::VectorXd &x) const override
Apply jacobian for chain rule.
void compute_faces_for_partial_vertices(const Eigen::MatrixXd &V, Eigen::MatrixXi &F) const
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override
Eval x = f^-1 (y).
int size(const int x_size) const override
Compute DOF of y given DOF of x.
BoundedBiharmonicWeights2Dto3D(const int num_control_vertices, const int num_vertices, const Eigen::MatrixXd &V_surface, const Eigen::MatrixXi &F_surface)
int inverse_size(int y_size) const override
Compute DOF of x given DOF of y.
int optimal_new_control_point_idx(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, const Eigen::VectorXi &boundary_loop, const std::vector< int > &existing_points) const
polyfem::legacy::State State
Definition Remesher.hpp:19