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
28 void regular_3d_grid(const int nn, bool tet, Eigen::MatrixXd &V, Eigen::MatrixXi &F, Eigen::MatrixXi &T);
29
31 {
32 public:
34 void init(const bool is_volume, const int n_elements, const double target_rel_area);
35
36 const Eigen::MatrixXd &cube_corners() const { return cube_corners_; }
37 const Eigen::MatrixXd &cube_points() const { return cube_points_; }
38 const Eigen::MatrixXi &cube_faces() const { return cube_faces_; }
39 const Eigen::MatrixXi &cube_volume() const { return is_volume_ ? cube_tets_ : cube_faces_; }
40 const Eigen::MatrixXi &cube_edges() const { return cube_edges_; }
41
42 const Eigen::MatrixXd &simplex_corners() const { return simplex_corners_; }
43 const Eigen::MatrixXd &simplex_points() const { return simplex_points_; }
44 const Eigen::MatrixXi &simplex_faces() const { return simplex_faces_; }
45 const Eigen::MatrixXi &simplex_volume() const { return is_volume_ ? simplex_tets_ : simplex_faces_; }
46 const Eigen::MatrixXi &simplex_edges() const { return simplex_edges_; }
47
48 void sample_polygon(const Eigen::MatrixXd &poly, Eigen::MatrixXd &pts, Eigen::MatrixXi &faces, Eigen::MatrixXi &edges) const;
49 void sample_polyhedron(const Eigen::MatrixXd &vertices, const Eigen::MatrixXi &f, Eigen::MatrixXd &pts, Eigen::MatrixXi &faces, Eigen::MatrixXi &edges) const;
50
51 inline int num_samples() const
52 {
53 return is_volume_ ? std::max(2., round(1. / pow(area_param_, 1. / 3.) + 1)) : std::max(2., round(1. / sqrt(area_param_) + 1));
54 }
55
56 private:
57 void build();
58
59 Eigen::MatrixXi cube_tets_;
60 Eigen::MatrixXi simplex_tets_;
61
62 Eigen::MatrixXd cube_corners_;
63 Eigen::MatrixXd cube_points_;
64 Eigen::MatrixXi cube_faces_;
65 Eigen::MatrixXi cube_edges_;
66
67 Eigen::MatrixXd simplex_corners_;
68 Eigen::MatrixXd simplex_points_;
69 Eigen::MatrixXi simplex_faces_;
70 Eigen::MatrixXi simplex_edges_;
71
73 double is_volume_;
74 };
75 } // namespace utils
76} // namespace polyfem
int V
std::vector< Eigen::VectorXi > faces
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 & simplex_faces() 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 & cube_edges() const
const Eigen::MatrixXi & cube_volume() const
const Eigen::MatrixXd & cube_corners() const
const Eigen::MatrixXi & simplex_volume() const
void regular_3d_grid(const int nn, bool tet, Eigen::MatrixXd &V, Eigen::MatrixXi &F, Eigen::MatrixXi &T)
Generate a canonical tet/hex subdivided from a regular grid.
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.