Add methods to calculate polygon geometric center & center of mass

This commit is contained in:
Nikita Lisitsa 2021-06-20 15:53:40 +03:00
parent 6994b23fdb
commit 72921c06e3

View file

@ -40,4 +40,47 @@ namespace psemek::cg
return result / scalar_type{12};
}
template <typename Iterator>
auto polygon_center(Iterator begin, Iterator end)
{
auto const first = *begin;
auto offset = decltype(*begin - *begin)::zero();
std::size_t count = 0;
for (; begin != end; ++begin)
{
offset += *begin - first;
++count;
}
using scalar_type = std::remove_cvref_t<decltype((*begin)[0])>;
return first + offset / static_cast<scalar_type>(count);
}
template <typename Iterator>
auto polygon_mass_center(Iterator begin, Iterator end)
{
using scalar_type = std::remove_cvref_t<decltype((*begin)[0])>;
using result_type = std::remove_cvref_t<decltype(*begin)>;
auto result = result_type::zero();
for (auto it = begin, prev = std::prev(end); it != end; prev = it++)
{
auto const v0 = *prev;
auto const v1 = *it;
result[0] += (v1[1] - v0[1]) * (v0[0] * v0[0] + v0[0] * v1[0] + v1[0] * v1[0]);
result[1] -= (v1[0] - v0[0]) * (v0[1] * v0[1] + v0[1] * v1[1] + v1[1] * v1[1]);
}
scalar_type a = polygon_area(begin, end) * 6;
result[0] /= a;
result[1] /= a;
return result;
}
}