PolyFEM
Loading...
Searching...
No Matches
RefElementSampler.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <Eigen/Dense>
4
5namespace polyfem
6{
7 namespace utils
8 {
17 void regular_2d_grid(const int n, bool tri, Eigen::MatrixXd &V, Eigen::MatrixXi &F);
18
29 void regular_3d_grid(const int nn,
30 bool tet,
31 bool prism,
32 Eigen::MatrixXd &V,
33 Eigen::MatrixXi &F,
34 Eigen::MatrixXi &T);
35
37 {
38 public:
40 void init(const bool is_volume, const int n_elements, const double target_rel_area);
41
42 const Eigen::MatrixXd &cube_corners() const { return cube_corners_; }
43 const Eigen::MatrixXd &cube_points() const { return cube_points_; }
44 const Eigen::MatrixXi &cube_faces() const { return cube_faces_; }
45 const Eigen::MatrixXi &cube_volume() const { return is_volume_ ? cube_tets_ : cube_faces_; }
46 const Eigen::MatrixXi &cube_edges() const { return cube_edges_; }
47
48 const Eigen::MatrixXd &simplex_corners() const { return simplex_corners_; }
49 const Eigen::MatrixXd &simplex_points() const { return simplex_points_; }
50 const Eigen::MatrixXi &simplex_faces() const { return simplex_faces_; }
51 const Eigen::MatrixXi &simplex_volume() const { return is_volume_ ? simplex_tets_ : simplex_faces_; }
52 const Eigen::MatrixXi &simplex_edges() const { return simplex_edges_; }
53
54 const Eigen::MatrixXd &prism_corners() const { return prism_corners_; }
55 const Eigen::MatrixXd &prism_points() const { return prism_points_; }
56 const Eigen::MatrixXi &prism_faces() const { return prism_faces_; }
57 const Eigen::MatrixXi &prism_volume() const { return prism_tets_; }
58 const Eigen::MatrixXi &prism_edges() const { return prism_edges_; }
59
60 void sample_polygon(const Eigen::MatrixXd &poly, Eigen::MatrixXd &pts, Eigen::MatrixXi &faces, Eigen::MatrixXi &edges) const;
61 void sample_polyhedron(const Eigen::MatrixXd &vertices, const Eigen::MatrixXi &f, Eigen::MatrixXd &pts, Eigen::MatrixXi &faces, Eigen::MatrixXi &edges) const;
62
63 inline int num_samples() const
64 {
65 return is_volume_ ? std::max(2., round(1. / pow(area_param_, 1. / 3.) + 1)) : std::max(2., round(1. / sqrt(area_param_) + 1));
66 }
67
68 private:
69 void build();
70
71 Eigen::MatrixXi cube_tets_;
72 Eigen::MatrixXi prism_tets_;
73 Eigen::MatrixXi simplex_tets_;
74
75 Eigen::MatrixXd prism_corners_;
76 Eigen::MatrixXd prism_points_;
77 Eigen::MatrixXi prism_faces_;
78 Eigen::MatrixXi prism_edges_;
79
80 Eigen::MatrixXd cube_corners_;
81 Eigen::MatrixXd cube_points_;
82 Eigen::MatrixXi cube_faces_;
83 Eigen::MatrixXi cube_edges_;
84
85 Eigen::MatrixXd simplex_corners_;
86 Eigen::MatrixXd simplex_points_;
87 Eigen::MatrixXi simplex_faces_;
88 Eigen::MatrixXi simplex_edges_;
89
91 double is_volume_;
92 };
93 } // namespace utils
94} // namespace polyfem
int V
std::vector< Eigen::VectorXi > faces
const Eigen::MatrixXd & prism_points() const
const Eigen::MatrixXi & cube_faces() const
void init(const bool is_volume, const int n_elements, const double target_rel_area)
void sample_polygon(const Eigen::MatrixXd &poly, Eigen::MatrixXd &pts, Eigen::MatrixXi &faces, Eigen::MatrixXi &edges) const
const Eigen::MatrixXd & simplex_corners() const
const Eigen::MatrixXi & prism_faces() const
const Eigen::MatrixXi & simplex_faces() const
const Eigen::MatrixXi & prism_volume() const
const Eigen::MatrixXd & simplex_points() const
void sample_polyhedron(const Eigen::MatrixXd &vertices, const Eigen::MatrixXi &f, Eigen::MatrixXd &pts, Eigen::MatrixXi &faces, Eigen::MatrixXi &edges) const
const Eigen::MatrixXi & simplex_edges() const
const Eigen::MatrixXd & cube_points() const
const Eigen::MatrixXi & prism_edges() const
const Eigen::MatrixXd & prism_corners() const
const Eigen::MatrixXi & cube_edges() const
const Eigen::MatrixXi & cube_volume() const
const Eigen::MatrixXd & cube_corners() const
const Eigen::MatrixXi & simplex_volume() const
void regular_2d_grid(const int n, bool tri, Eigen::MatrixXd &V, Eigen::MatrixXi &F)
Generate a canonical triangle/quad subdivided from a regular grid.
void regular_3d_grid(const int nn, bool tet, bool prism, Eigen::MatrixXd &V, Eigen::MatrixXi &F, Eigen::MatrixXi &T)
Generate a canonical tet/hex subdivided from a regular grid.