29 for (
const auto& t : xyz) {
30 _xyz[std::get<0>(t)][std::get<2>(t)] = std::get<1>(t);
36 double max_x = _xyz.rbegin()->first;
37 double min_x = _xyz.begin()->first;
39 return InterpolateYz(_xyz.rbegin()->second, xy.second);
42 return InterpolateYz(_xyz.begin()->second, xy.second);
45 auto itr_after = _xyz.lower_bound(xy.first);
46 auto itr_before = itr_after;
49 double x_before = itr_before->first;
50 double z_before = InterpolateYz(itr_before->second, xy.second);
51 double x_after = itr_after->first;
52 double z_after = InterpolateYz(itr_after->second, xy.second);
54 double x_diff_before = std::fabs(xy.first - x_before);
55 double x_diff_after = std::fabs(xy.first - x_after);
57 return InterpolateValue(z_before, x_diff_before, z_after, x_diff_after);
60double Interpolation2D::InterpolateYz(
const std::map<double, double>& yz_table,
62 double max_y = yz_table.rbegin()->first;
63 double min_y = yz_table.begin()->first;
65 return yz_table.rbegin()->second;
68 return yz_table.begin()->second;
71 auto itr_after = yz_table.lower_bound(y);
72 auto itr_before = itr_after;
75 double y_before = itr_before->first;
76 double z_before = itr_before->second;
77 double y_after = itr_after->first;
78 double z_after = itr_after->second;
80 double y_diff_before = std::fabs(y - y_before);
81 double y_diff_after = std::fabs(y - y_after);
83 return InterpolateValue(z_before, y_diff_before, z_after, y_diff_after);
86double Interpolation2D::InterpolateValue(
const double value_before,
87 const double dist_before,
88 const double value_after,
89 const double dist_after)
const {
96 double value_gap = value_after - value_before;
97 double value_buff = value_gap * dist_before / (dist_before + dist_after);
98 return value_before + value_buff;
bool init(const DataType &xyz)
std::vector< std::tuple< double, double, double > > DataType
std::pair< double, double > KeyType
double Interpolate(const KeyType &xy) const
const double kDoubleEpsilon