PolyFEM
Loading...
Searching...
No Matches
InterpolatedFunction.cpp
Go to the documentation of this file.
2
3#include <igl/in_element.h>
4#include <igl/barycentric_coordinates.h>
5
6#include <iostream>
7
8namespace polyfem
9{
10 namespace utils
11 {
12 InterpolatedFunction2d::InterpolatedFunction2d(const Eigen::MatrixXd &fun, const Eigen::MatrixXd &pts, const Eigen::MatrixXi &tris)
13 {
14 init(fun, pts, tris);
15 }
16
17 void InterpolatedFunction2d::init(const Eigen::MatrixXd &fun, const Eigen::MatrixXd &pts, const Eigen::MatrixXi &tris)
18 {
19 assert(pts.cols() == 2);
20 assert(pts.rows() == fun.rows());
21 assert(tris.cols() == 3);
22
23 fun_ = fun;
24 pts_ = pts;
25 tris_ = tris;
26
27 tree_.init(pts_, tris_);
28 }
29
30 Eigen::MatrixXd InterpolatedFunction2d::interpolate(const Eigen::MatrixXd &pts) const
31 {
32 assert(pts.cols() == 2);
33
34 Eigen::VectorXi I;
35 igl::in_element(pts_, tris_, pts, tree_, I);
36
37 Eigen::MatrixXd res(pts.rows(), fun_.cols());
38 res.setZero();
39
40 Eigen::MatrixXd bc;
41
42 for (long i = 0; i < pts.rows(); ++i)
43 {
44 const int index = I(i);
45
46 if (index < 0)
47 {
48 continue;
49 }
50
51 const Eigen::MatrixXd pt = pts.row(i);
52 const Eigen::MatrixXd A = pts_.row(tris_(index, 0));
53 const Eigen::MatrixXd B = pts_.row(tris_(index, 1));
54 const Eigen::MatrixXd C = pts_.row(tris_(index, 2));
55 igl::barycentric_coordinates(pt, A, B, C, bc);
56 // std::cout<<pt<<"\tii:"<<index<<"\tr:"<<bc<<std::endl;
57
58 for (int j = 0; j < 3; ++j)
59 res.row(i) += fun_.row(tris_(index, j)) * bc(j);
60 }
61
62 return res;
63 }
64 } // namespace utils
65} // namespace polyfem
void init(const Eigen::MatrixXd &fun, const Eigen::MatrixXd &pts, const Eigen::MatrixXi &tris)
igl::AABB< Eigen::MatrixXd, 2 > tree_
Eigen::MatrixXd interpolate(const Eigen::MatrixXd &pts) const