Add methods to calculate polygon geometric center & center of mass
This commit is contained in:
parent
6994b23fdb
commit
72921c06e3
1 changed files with 43 additions and 0 deletions
|
|
@ -40,4 +40,47 @@ namespace psemek::cg
|
||||||
return result / scalar_type{12};
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue