단순 다각형(simple polygon)의 무게중심(center of gravity or center of mass)은 다각형을 균일한 밀도의 판으로 생각했을 때 판의 무게중심과 같다. 가장 단순한 다각형인 삼각형의 무게중심은 세 꼭짓점의 산술평균으로 표현된다.
$$ \text{CoG} = \frac{1}{3} ({{\bf P} + {\bf Q} + {\bf R}}).$$
증명: 삼각형의 한 변 PQ에 나란한 띠로 삼각형을 분할하자. 그러면 각 띠의 무게중심은 띠의 기하학적 중심이므로 꼭짓점 R와 변 PQ의 중심을 연결한 선분 RA상에 있어야 한다. 그리고 띠의 무게중심은 그 점에 모든 질량이 뭉친 것으로 생각할 수 있으므로 전체 삼각형의 무게중심은 선분 RA상의 어느 지점에 있어야 한다. 마찬가지 논리로 삼각형을 선분 QR에 나란한 띠로 분할하면 띠들의 무게중심은 선분 PB상에 있음을 알 수 있다. 따라서 삼각형의 무게중심도 PB상의 한 점이어야 하므로 선분 PB와 선분 RA의 교점이 무게중심이 된다. 그러면 삼각형 PRG와 ABG는 닮은꼴이고, AB가 PR의 절반이므로 무게중심은 AR과 PB를 2:1로 내분한다는 사실은 쉽게 알 수 있다. $\overrightarrow{AG}= \frac{1}{3} \overrightarrow{AR}\to {\bf G} = \frac{1}{3} {\bf R}+\frac{2}{3} {\bf A}$이고, ${\bf A} = \frac{1}{2}({\bf P} + {\bf Q})$이므로 위의 결과를 얻는다.
다각형은 삼각형으로 분할되므로 이 분할된 삼각형의 무게중심을 이용하면 쉽게 계산할 수 있다. 분할된 삼각형의 무게중심을 면적으로 가중치를 준 평균값이 다각형의 무게중심이 된다.
실제 계산에서는 다각형을 삼각 분할하지 않고도 간단한 방법에 의해서 무게중심을 구할 수 있다. 원점과 다각형의 각 변의 꼭짓점을 이용해서 삼각형들을 구성하면 원래의 다각형을 겹치게(원점이 내부에 있으면 겹침이 없다) 분할할 수 있다. 분할된 삼각형으로 무게중심을 구할 때 겹치는 영역의 기여를 제거해야 한다. 그런데 다각형 밖의 영역을 분할하는 삼각형은 다각형 내부를 분할하는 삼각형과는 다른 orientation을 가지게 된다. 삼각형의 면적은 한 꼭짓점을 공유하는 두 변의 외적에 비례하므로, 반대의 orientation을 갖는 삼각형은 자동으로 반대 부호의 면적을 가지게 된다. 따라서 분할된 삼각형 면적 가중치를 외적으로 주어서 무게중심을 구하면 겹치는 영역이 자동으로 상쇄되는 효과를 얻을 수 있다.
$$\begin{align} \text{CoG} &= \frac{1}{\text{다각형 면적}} \sum (\text{삼각형 CoG}) (\text{면적}) \\ &= \frac{1}{\text{다각형 면적}} \sum \frac{1}{3} \left( {\bf V}_i + {\bf V}_{i+1} + {\bf O}\right ) \frac{ {\bf V}_{i} \times {\bf V}_{i+1} }{2} \\ &= \frac{1}{3}\frac{1}{ \text{다각형 면적} }\sum ( {\bf V}_{i} + {\bf V}_{i+1}) \frac{{\bf V}_{i} \times {\bf V}_{i+1}}{2} \end{align}$$
다각형의 면적($=\sum \frac{1}{2}({\bf V}_i \times {\bf V}_{i+1})$)을 구할 때 삼각형과 동일하게 orientation에 따라 부호를 포함하도록 설정하면 다각형의 면적 부호가 삼각형의 면적 부호로 상쇄되므로 다각형의 orientation에 무관하게 성립하는 공식이 된다.
CfPt polygon_centroid(const std::vector<CfPt>& V) {
double cx = 0, cy = 0, area2 = 0;
for (int i = 0, j = V.size() - 1; i < V.size(); j = i++) {
double tri_area2 = V[i].x * V[j].y - V[i].y * V[j].x; // area * 2;
cx += (V[i].x + V[j].x) * tri_area2;
cy += (V[i].y + V[j].y) * tri_area2;
area2 += tri_area2; //total area * 2
}
cx /= 3 * area2;
cy /= 3 * area2;
return CfPt(cx, cy);
};
'Computational Geometry' 카테고리의 다른 글
Creating Simple Polygons (0) | 2021.01.25 |
---|---|
단순 다각형의 Convex Hull (0) | 2021.01.24 |
단순 다각형의 면적(2D) (0) | 2021.01.23 |
Binary Image에서 Convex Hull (0) | 2021.01.06 |
삼각형 외접원의 Inclusion Test (0) | 2020.12.30 |