21 #include "core/normgrid.h"
24 using namespace mondschein;
27 std::array<Eigen::Vector3d,2> make_triangle(
const Eigen::Vector3d &_a,
const Eigen::Vector3d &_b,
const Eigen::Vector3d &_c);
28 Eigen::Vector3d calc_normal(
const std::array<Eigen::Vector3d,2> &_t);
29 Eigen::Vector3d interpolate_vector(
const std::array<Eigen::Vector3d,4> &_v);
30 void expand(std::vector<std::vector<Eigen::Vector3d> > &_grid);
32 std::array<Eigen::Vector3d,2> make_triangle(
const Eigen::Vector3d &_a,
const Eigen::Vector3d &_b,
const Eigen::Vector3d &_c)
34 std::array<Eigen::Vector3d,2> t;
40 Eigen::Vector3d calc_normal(
const std::array<Eigen::Vector3d,2> &_t)
42 return _t.at(0).cross(_t.at(1)).normalized();
45 Eigen::Vector3d interpolate_vector(
const std::array<Eigen::Vector3d,4> &_v)
47 Eigen::Vector3d v(0.0,0.0,0.0);
50 std::map<float64,float64> p;
51 for (
uint32 j=0; j<3; j++) p.insert(std::make_pair(j,_v.at(j)(i)));
53 v(i)=ip->interpolate(-1.0);
58 void expand(std::vector<std::vector<Eigen::Vector3d> > &_grid)
60 std::vector<Eigen::Vector3d> b,e;
61 std::array<Eigen::Vector3d,4> a;
63 uint32 s2=_grid.at(0).size();
64 for (
uint32 j=0; j<s2; ++j)
66 for (
uint32 k=0; k<4; ++k) a.at(k)=_grid.at(k).at(j);
67 b.push_back(interpolate_vector(a));
68 for (
uint32 k=0; k<4; ++k) a.at(k)=_grid.at(s1-1-k).at(j);
69 e.push_back(interpolate_vector(a));
71 _grid.insert(_grid.begin(),b);
74 s2=_grid.at(0).size();
75 for (
uint32 i=0; i<s1; ++i)
77 for (
uint32 k=0; k<4; ++k) a.at(k)=_grid.at(i).at(k);
78 _grid.at(i).insert(_grid.at(i).begin(),interpolate_vector(a));
79 for (
uint32 k=0; k<4; ++k) a.at(k)=_grid.at(i).at(s2-2-k);
80 _grid.at(i).push_back(interpolate_vector(a));
85 Normal_Grid::Normal_Grid()
90 Normal_Grid::Normal_Grid(Normal_Grid_c _nc)
95 Normal_Grid::~Normal_Grid()
100 Normal_Grid &Normal_Grid::operator=(Normal_Grid_c _nc)
105 std::vector<Eigen::Vector3d>
Normal_Grid::flat(
const std::vector<std::vector<Eigen::Vector3d> > &_grid)
107 std::vector<Eigen::Vector3d> n;
108 for (
uint32 i=0; i<_grid.size()-1; ++i)
110 for (
uint32 j=0; j<_grid.at(i).size()-1; ++j)
112 n.push_back(calc_normal(make_triangle(_grid.at(i).at(j),_grid.at(i+1).at(j),_grid.at(i).at(j+1))));
113 n.push_back(calc_normal(make_triangle(_grid.at(i+1).at(j+1),_grid.at(i).at(j+1),_grid.at(i+1).at(j))));
121 std::vector<Eigen::Vector3d> n;
122 for (
uint32 i=0; i<_grid.size()-1; ++i)
124 for (
uint32 j=0; j<_grid.at(i).size()-1; ++j)
126 n.push_back(calc_normal(make_triangle(_grid.at(i).at(j),_grid.at(i+1).at(j),_grid.at(i).at(j+1)))*(-1));
127 n.push_back(calc_normal(make_triangle(_grid.at(i+1).at(j+1),_grid.at(i).at(j+1),_grid.at(i+1).at(j)))*(-1));
136 std::vector<Eigen::Vector3d> n;
138 for (
uint32 i=1; i<_grid.size()-1; ++i)
140 for (
uint32 j=1; j<_grid.at(i).size()-1; ++j)
142 tn=calc_normal(make_triangle(_grid.at(i).at(j),_grid.at(i+1).at(j),_grid.at(i+1).at(j+1)));
143 tn+=calc_normal(make_triangle(_grid.at(i).at(j),_grid.at(i+1).at(j+1),_grid.at(i).at(j+1)));
144 tn+=calc_normal(make_triangle(_grid.at(i).at(j),_grid.at(i).at(j+1),_grid.at(i-1).at(j+1)));
145 tn+=calc_normal(make_triangle(_grid.at(i).at(j),_grid.at(i-1).at(j+1),_grid.at(i-1).at(j)));
146 tn+=calc_normal(make_triangle(_grid.at(i).at(j),_grid.at(i-1).at(j),_grid.at(i-1).at(j-1)));
147 tn+=calc_normal(make_triangle(_grid.at(i).at(j),_grid.at(i-1).at(j-1),_grid.at(i).at(j-1)));
148 tn+=calc_normal(make_triangle(_grid.at(i).at(j),_grid.at(i).at(j-1),_grid.at(i).at(j+1)));
149 tn+=calc_normal(make_triangle(_grid.at(i).at(j),_grid.at(i).at(j+1),_grid.at(i+1).at(j))).normalized();
159 std::vector<Eigen::Vector3d> n;
161 for (
uint32 i=0; i<_grid.size()-1; ++i)
163 for (
uint32 j=0; j<_grid.at(i).size()-1; ++j)
165 tn=calc_normal(make_triangle(_grid.at(i).at(j),_grid.at(i+1).at(j),_grid.at(i+1).at(j+1)));
166 tn+=calc_normal(make_triangle(_grid.at(i).at(j),_grid.at(i+1).at(j+1),_grid.at(i).at(j+1)));
167 tn+=calc_normal(make_triangle(_grid.at(i).at(j),_grid.at(i).at(j+1),_grid.at(i-1).at(j+1)));
168 tn+=calc_normal(make_triangle(_grid.at(i).at(j),_grid.at(i-1).at(j+1),_grid.at(i-1).at(j)));
169 tn+=calc_normal(make_triangle(_grid.at(i).at(j),_grid.at(i-1).at(j),_grid.at(i-1).at(j-1)));
170 tn+=calc_normal(make_triangle(_grid.at(i).at(j),_grid.at(i-1).at(j-1),_grid.at(i).at(j-1)));
171 tn+=calc_normal(make_triangle(_grid.at(i).at(j),_grid.at(i).at(j-1),_grid.at(i).at(j+1)));
172 tn+=calc_normal(make_triangle(_grid.at(i).at(j),_grid.at(i).at(j+1),_grid.at(i+1).at(j))).normalized();