diff --git a/Siv3D/include/Siv3D/MultiPolygon.hpp b/Siv3D/include/Siv3D/MultiPolygon.hpp index 3df41f908..9c1784eb6 100644 --- a/Siv3D/include/Siv3D/MultiPolygon.hpp +++ b/Siv3D/include/Siv3D/MultiPolygon.hpp @@ -417,6 +417,9 @@ namespace s3d [[nodiscard]] double perimeter() const noexcept; + [[nodiscard]] + Vec2 centroid() const; + [[nodiscard]] RectF computeBoundingRect() const noexcept; diff --git a/Siv3D/src/Siv3D/MultiPolygon/SivMultiPolygon.cpp b/Siv3D/src/Siv3D/MultiPolygon/SivMultiPolygon.cpp index 1134c23aa..8e8985002 100644 --- a/Siv3D/src/Siv3D/MultiPolygon/SivMultiPolygon.cpp +++ b/Siv3D/src/Siv3D/MultiPolygon/SivMultiPolygon.cpp @@ -330,6 +330,26 @@ namespace s3d return total; } + Vec2 MultiPolygon::centroid() const + { + if (m_data.empty()) + { + return Vec2{ 0, 0 }; + } + + Vec2 weightedCoordsTotal{ 0, 0 }; + double areaTotal = 0.0; + + for (const auto& polygon : m_data) + { + const double polygonArea = polygon.area(); + weightedCoordsTotal += polygonArea * polygon.centroid(); + areaTotal += polygonArea; + } + + return weightedCoordsTotal / areaTotal; + } + RectF MultiPolygon::computeBoundingRect() const noexcept { if (isEmpty())