7std::pair<Eigen::Vector3d, double>
getNewellPlane(InputIterator pnts_begin,
8 InputIterator pnts_end)
10 Eigen::Vector3d plane_normal({0, 0, 0});
11 Eigen::Vector3d centroid({0, 0, 0});
12 for (
auto i = std::prev(pnts_end), j = pnts_begin; j != pnts_end;
15 auto const& pt_i = *(*i);
16 auto const& pt_j = *(*j);
18 (pt_i[1] - pt_j[1]) * (pt_i[2] + pt_j[2]);
20 (pt_i[2] - pt_j[2]) * (pt_i[0] + pt_j[0]);
22 (pt_i[0] - pt_j[0]) * (pt_i[1] + pt_j[1]);
24 centroid += pt_j.asEigenVector3d();
27 plane_normal.normalize();
28 auto n_pnts(std::distance(pnts_begin, pnts_end));
33 d = centroid.dot(plane_normal) / n_pnts;
35 return std::make_pair(plane_normal, d);
47 const std::vector<T_POINT>& pnts)
49 Eigen::Vector3d plane_normal({0, 0, 0});
50 Eigen::Vector3d centroid({0, 0, 0});
51 std::size_t n_pnts(pnts.size());
52 for (std::size_t i = n_pnts - 1, j = 0; j < n_pnts; i = j, j++)
54 plane_normal[0] += (pnts[i][1] - pnts[j][1]) *
55 (pnts[i][2] + pnts[j][2]);
56 plane_normal[1] += (pnts[i][2] - pnts[j][2]) *
57 (pnts[i][0] + pnts[j][0]);
58 plane_normal[2] += (pnts[i][0] - pnts[j][0]) *
59 (pnts[i][1] + pnts[j][1]);
61 centroid += pnts[j].asEigenVector3d();
64 plane_normal.normalize();
65 double const d = centroid.dot(plane_normal) / n_pnts;
66 return std::make_pair(plane_normal, d);
81 InputIterator1 p_pnts_end,
82 InputIterator2 r_pnts_begin,
83 InputIterator2 r_pnts_end)
85 assert(std::distance(p_pnts_begin, p_pnts_end) > 2);
88 auto const [plane_normal, d] =
95 for (
auto it = r_pnts_begin; it != r_pnts_end; ++it)