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 class State;
10 class BSplineParametrization2D;
11 class BSplineParametrization3D;
12} // namespace polyfem
13
14namespace polyfem::solver
15{
17 {
18 public:
19 BSplineParametrization1DTo2D(const Eigen::MatrixXd &initial_control_points, const Eigen::VectorXd &knots, const int num_vertices, const bool exclude_ends = true)
20 : initial_control_points_(initial_control_points), knots_(knots), size_(num_vertices), exclude_ends_(exclude_ends) {}
21
22 // Should only be called to initialize the parameter, when the shape matches the initial control points.
23 Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override;
24 inline int size(const int x_size) const override
25 {
26 return 2 * size_;
27 };
28 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
29 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad_full, const Eigen::VectorXd &x) const override;
30
31 private:
32 const Eigen::MatrixXd initial_control_points_;
33 const Eigen::VectorXd knots_;
34
36
37 const int size_;
38
39 std::shared_ptr<BSplineParametrization2D> spline_;
40
41 const bool exclude_ends_;
42 };
43
45 {
46 public:
47 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) {}
48
49 // Should only be called to initialize the parameter, when the shape matches the initial control points.
50 Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override;
51 int size(const int x_size) const override { return 3 * u_.size() * v_.size(); }
52 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
53 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad_full, const Eigen::VectorXd &x) const override;
54
55 private:
56 const Eigen::MatrixXd initial_control_point_grid_;
57 const Eigen::VectorXd knots_u_;
58 const Eigen::VectorXd knots_v_;
59
60 std::shared_ptr<BSplineParametrization3D> spline_;
61
62 Eigen::VectorXd u_;
63 Eigen::VectorXd v_;
64
66
67 const bool exclude_ends_;
68 };
69
71 {
72 public:
73 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) {}
74 BoundedBiharmonicWeights2Dto3D(const int num_control_vertices, const int num_vertices, const State &state, const bool allow_rotations);
75
76 // Should only be called to initialize the parameter, when the shape matches the initial control points.
77 Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override;
78 int size(const int x_size) const override { return num_vertices_ * 3; }
79 Eigen::VectorXd eval(const Eigen::VectorXd &x) const override;
80 Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad_full, const Eigen::VectorXd &x) const override;
81
82 Eigen::MatrixXd get_bbw_weights() { return bbw_weights_; }
83
84 private:
85 void compute_faces_for_partial_vertices(const Eigen::MatrixXd &V, Eigen::MatrixXi &F) const;
86
87 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;
88
90 const int num_vertices_;
91 Eigen::MatrixXd control_points_;
92 Eigen::MatrixXd bbw_weights_;
93 Eigen::MatrixXd boundary_bbw_weights_;
94
95 Eigen::MatrixXd V_surface_;
96 Eigen::MatrixXi F_surface_;
97
98 Eigen::VectorXd y_start;
99
101
103 };
104
105} // namespace polyfem::solver
int V
int y
int x
main class that contains the polyfem solver and all its state
Definition State.hpp:113
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).
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override
Eval x = f^-1 (y).
BSplineParametrization1DTo2D(const Eigen::MatrixXd &initial_control_points, const Eigen::VectorXd &knots, const int num_vertices, const bool exclude_ends=true)
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad_full, const Eigen::VectorXd &x) const override
Apply jacobian for chain rule.
BSplineParametrization2DTo3D(const Eigen::MatrixXd &initial_control_point_grid, const Eigen::VectorXd &knots_u, const Eigen::VectorXd &knots_v, const bool exclude_ends=true)
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override
Eval x = f^-1 (y).
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
Eval y = f(x).
std::shared_ptr< BSplineParametrization3D > 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).
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad_full, const Eigen::VectorXd &x) const override
Apply jacobian for chain rule.
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override
Eval x = f^-1 (y).
void compute_faces_for_partial_vertices(const Eigen::MatrixXd &V, Eigen::MatrixXi &F) const
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 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