[백준 2166] 다각형의 면적 (C++)

codingNoob12·2024년 2월 28일
0

알고리즘

목록 보기
3/73

이 문제에서 각 한 다각형의 꼭짓점 좌표들이 입력으로 주어진다. 이때의 다각형의 넓이는 어떻게 구할 수 있을까?

먼저, 다각형은 삼각형들의 합으로 구할 수 있고, 삼각형의 넓이는 12absinθ=12u^×v^\frac{1}{2} a b \cdot sin \theta = \frac{1}{2} \cdot \| \hat{u} \times \hat{v} \|이며, 외적을 통해 구해줄 수 있다.

하지만, 이 문제의 입력은 2차원 좌표이기 때문에, 외적하면 z좌표만 남게 되고 이것의 절댓값이 외적의 크기가 된다.

u^=(u1,u2,u3)\hat{u} = (u_1, u_2, u_3), v^=(v1,v2,v3)\hat{v} = (v_1, v_2, v_3)일 때,

u^×v^=i^j^k^u1u2u3v1v2v3=(u2v3u3v2,u1v3u3v1,u1v2u2v1)\hat{u} \times \hat{v} = \begin{vmatrix} \hat{i} & \hat{j} & \hat{k} \\ u_1 & u_2 & u_3 \\ v_1 & v_2 & v_3 \end{vmatrix} \\ = (u_2 v_3 - u_3 v_2, u_1 v_3 - u_3 v_1, u_1 v_2 - u_2 v_1)가 된다.

하지만, u3,v3u_3, v_300이므로, u^×v^=(0,0,u1v2u2v1)\hat{u} \times \hat{v} = (0, 0, u_1 v_2 - u_2 v_1)임을 확인할 수 있다.

따라서, 12u^×v^=12(u1v2u2v1)\frac{1}{2} \| \hat{u} \times \hat{v} \| = \frac{1}{2} \cdot (u_1 v_2 - u_2 v_1)임이 유도된다.

벡터를 편하게 구하기 위해서, 입력으로 들어오는 첫번째 좌표를 기준으로 벡터를 구성해 문제를 해결해보자.

#include <bits/stdc++.h>
#define X first
#define Y second
using namespace std;

int n;
pair<double, double> coords[10000];

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout << fixed;
    cout.precision(1);

    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> coords[i].X >> coords[i].Y;
    }

    double area = 0;
    for (int i = 1; i < n - 1; i++) {
        pair<double, double> u = {coords[i].X - coords[0].X, coords[i].Y - coords[0].Y};
        pair<double, double> v = {coords[i + 1].X - coords[0].X, coords[i + 1].Y - coords[0].Y};
        area += (u.X * v.Y - u.Y * v.X) / 2.0;
    }
    cout << abs(area);
}
profile
나는감자

0개의 댓글