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:79
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad_full, const Eigen::VectorXd &x) const override
std::shared_ptr< BSplineParametrization2D > spline_
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override
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
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
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
std::shared_ptr< BSplineParametrization3D > spline_
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad_full, const Eigen::VectorXd &x) const override
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override
void compute_faces_for_partial_vertices(const Eigen::MatrixXd &V, Eigen::MatrixXi &F) const
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
This parameterize a function f : x -> y and provides the chain rule with respect to previous gradient...