백준/골드
[백준 2166번] 다각형의 면적 (C++)
게임개발기원
2023. 8. 25. 18:07
문제링크 : https://www.acmicpc.net/problem/2166
2166번: 다각형의 면적
첫째 줄에 N이 주어진다. 다음 N개의 줄에는 다각형을 이루는 순서대로 N개의 점의 x, y좌표가 주어진다. 좌표값은 절댓값이 100,000을 넘지 않는 정수이다.
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;
vector<pii>v;
double ccw(double x1, double x2, double x3, double y1, double y2, double y3) //삼각형 넓이 구하기
{
double temp = (x2-x1)*(y3-y1) - (x3-x1)*(y2-y1);
return temp/2;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int N;
cin >> N;
for(int i=0; i<N; i++)
{
int x, y;
cin >> x >> y;
v.push_back({x, y});
}
double result = 0;
for(int i=2; i<N; i++)
{
result += ccw(v[0].first, v[i-1].first, v[i].first, v[0].second, v[i-1].second, v[i].second);
}
cout.precision(1); //소수점 첫째자리까지 출력
cout << fixed << abs(result);
return 0;
}
다각형을 삼각형으로 나누고, 해당 삼각형의 넓이를 더하는 것으로 풀 수 있는 문제이다.
세 점이 주어졌을 때 해당 세점으로 이루어진 삼각형의 넓이를 구하는 공식인 사선 공식을 이용했다.
이는 ccw알고리즘의 값에 /2를 반환해주면 된다.
<사선 공식>
((x2-x1)*(y3-y1) - (x3-x1)*(y2-y1)) /2
고정점(v[0])을 설정하고 고정점을 기준으로 한 쪽방향으로 꼭짓점을 돌면서 사선 공식을 통해 삼각형의 넓이를 구해주는 동시에 모든 꼭짓점을 돌때까지 넓이를 더해가면서 반복해주면 된다.
이때 음수가 존재할 수 있으므로 결과값에 절대값을 씌워서 출력해준다.