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
30 void regular_3d_grid(const int nn,
31 bool tet,
32 bool prism,
33 bool pyramid,
34 Eigen::MatrixXd &V,
35 Eigen::MatrixXi &F,
36 Eigen::MatrixXi &T);
37
39 {
40 public:
42 void init(const bool is_volume, const int n_elements, const double target_rel_area);
43
44 const Eigen::MatrixXd &cube_corners() const { return cube_corners_; }
45 const Eigen::MatrixXd &cube_points() const { return cube_points_; }
46 const Eigen::MatrixXi &cube_faces() const { return cube_faces_; }
47 const Eigen::MatrixXi &cube_volume() const { return is_volume_ ? cube_tets_ : cube_faces_; }
48 const Eigen::MatrixXi &cube_edges() const { return cube_edges_; }
49
50 const Eigen::MatrixXd &simplex_corners() const { return simplex_corners_; }
51 const Eigen::MatrixXd &simplex_points() const { return simplex_points_; }
52 const Eigen::MatrixXi &simplex_faces() const { return simplex_faces_; }
53 const Eigen::MatrixXi &simplex_volume() const { return is_volume_ ? simplex_tets_ : simplex_faces_; }
54 const Eigen::MatrixXi &simplex_edges() const { return simplex_edges_; }
55
56 const Eigen::MatrixXd &prism_corners() const { return prism_corners_; }
57 const Eigen::MatrixXd &prism_points() const { return prism_points_; }
58 const Eigen::MatrixXi &prism_faces() const { return prism_faces_; }
59 const Eigen::MatrixXi &prism_volume() const { return prism_tets_; }
60 const Eigen::MatrixXi &prism_edges() const { return prism_edges_; }
61
62 const Eigen::MatrixXd &pyramid_corners() const { return pyramid_corners_; }
63 const Eigen::MatrixXd &pyramid_points() const { return pyramid_points_; }
64 const Eigen::MatrixXi &pyramid_faces() const { return pyramid_faces_; }
65 const Eigen::MatrixXi &pyramid_volume() const { return pyramid_tets_; }
66 const Eigen::MatrixXi &pyramid_edges() const { return pyramid_edges_; }
67 void sample_polygon(const Eigen::MatrixXd &poly, Eigen::MatrixXd &pts, Eigen::MatrixXi &faces, Eigen::MatrixXi &edges) const;
68 void sample_polyhedron(const Eigen::MatrixXd &vertices, const Eigen::MatrixXi &f, Eigen::MatrixXd &pts, Eigen::MatrixXi &faces, Eigen::MatrixXi &edges) const;
69
70 inline int num_samples() const
71 {
72 return is_volume_ ? std::max(2., round(1. / pow(area_param_, 1. / 3.) + 1)) : std::max(2., round(1. / sqrt(area_param_) + 1));
73 }
74
75 private:
76 void build();
77
78 Eigen::MatrixXi cube_tets_;
79 Eigen::MatrixXi prism_tets_;
80 Eigen::MatrixXi pyramid_tets_;
81 Eigen::MatrixXi simplex_tets_;
82
83 Eigen::MatrixXd prism_corners_;
84 Eigen::MatrixXd prism_points_;
85 Eigen::MatrixXi prism_faces_;
86 Eigen::MatrixXi prism_edges_;
87
88 Eigen::MatrixXd pyramid_corners_;
89 Eigen::MatrixXd pyramid_points_;
90 Eigen::MatrixXi pyramid_faces_;
91 Eigen::MatrixXi pyramid_edges_;
92
93 Eigen::MatrixXd cube_corners_;
94 Eigen::MatrixXd cube_points_;
95 Eigen::MatrixXi cube_faces_;
96 Eigen::MatrixXi cube_edges_;
97
98 Eigen::MatrixXd simplex_corners_;
99 Eigen::MatrixXd simplex_points_;
100 Eigen::MatrixXi simplex_faces_;
101 Eigen::MatrixXi simplex_edges_;
102
105 };
106 } // namespace utils
107} // namespace polyfem
int V
std::vector< Eigen::VectorXi > faces
const Eigen::MatrixXi & pyramid_edges() const
const Eigen::MatrixXd & prism_points() const
const Eigen::MatrixXd & pyramid_corners() 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::MatrixXi & pyramid_volume() 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::MatrixXd & pyramid_points() const
const Eigen::MatrixXi & pyramid_faces() 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, bool pyramid, Eigen::MatrixXd &V, Eigen::MatrixXi &F, Eigen::MatrixXi &T)
Generate a canonical tet/hex subdivided from a regular grid.