[기하학] 다각형의 면적 - 백준 2166번
Self Intersecting Polygon
self-intersecting polygon의 정답 = 0
예제 입력 1
4
0 0
0 10
10 10
10 0
⇒ 100.0
self-intersecting polygon 예제
4
0 0
0 10
10 0
10 10
⇒ 0.0
신발끈 공식
헤론의 공식
Wrtn.ai : 이 코드를 통해 삼각형의 넓이를 계산하려고 할 때 헤론의 공식은 사용이 어렵고 신발끈 공식을 사용해야 하는 이유는 다음과 같습니다.
- 헤론의 공식을 이용한 방법: 헤론의 공식은 삼각형의 세 변의 길이를 알고 있을 때 넓이를 구하는 공식입니다. 이 코드에서는 삼각형의 세 꼭짓점의 좌표를 알고 있기 때문에, 각 꼭짓점 사이의 거리를 계산하여 헤론의 공식을 적용할 수 있습니다. 하지만 이 방법은 세 꼭짓점 사이의 거리를 계산하는 추가적인 계산이 필요하고, 더욱이 헤론의 공식 자체가 제곱근을 포함하는 복잡한 계산을 필요로 하기 때문에 계산 과정이 복잡해집니다.
- 신발끈 공식을 이용한 방법: 반면에 신발끈 공식은 삼각형의 세 꼭짓점의 좌표만 알면 바로 넓이를 계산할 수 있는 공식입니다. 이 코드에서는 각 꼭짓점의 좌표를 바로 사용하여 신발끈 공식을 적용하여 삼각형의 넓이를 계산하는 것이 더 효율적입니다.
따라서, 이 코드에서는 삼각형의 넓이를 계산할 때 헤론의 공식보다는 신발끈 공식을 사용하는 것이 더 효율적이고 간단합니다.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n;
pair<long double, long double> xy[10001];
//신발끈 공식
long double solve(pair<long double, long double> first, pair<long double, long double> second, pair<long double, long double> third) {
long double a = first.first, b = first.second;
long double c = second.first, d = second.second;
long double e = third.first, f = third.second;
return (a * d + c * f + e * b - c * b - e * d - a * f) / 2;
}
int main(void) {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n;
for (int i = 0; i < n; i++) {
cin >> xy[i].first >> xy[i].second;
}
// 정렬된 배열을 출력
long double total = 0;
for (int i = 1; i < n - 1; i++) {
// 삼각형의 넓이를 계산하고 반올림하여 출력
total += solve(xy[0], xy[i], xy[i + 1]);
}
cout << fixed;
cout.precision(1);
cout << abs(total); // 반올림하여 출력
return 0;
}
//헤론의 공식을 이용하여 넓이 계산
// #include <iostream>
// #include <algorithm>
// #include <cmath> // <math.h> 대신 <cmath> 헤더를 사용
// using namespace std;
// int n;
// pair<double, double> xy[10001];
// double distance(pair<double, double> p1, pair<double, double> p2) {
// return sqrt(pow((p1.first - p2.first), 2) + pow((p1.second - p2.second), 2));
// }
// double calculateTriangleArea(pair<double, double> a, pair<double, double> b, pair<double, double> c) {
// // 세 변의 길이 계산
// double sideA = distance(b, c);
// double sideB = distance(a, c);
// double sideC = distance(a, b);
// // 반 둘레 계산
// double s = (sideA + sideB + sideC) / 2.0;
// // 헤론의 공식을 이용하여 넓이 계산
// double area = sqrt(s * (s - sideA) * (s - sideB) * (s - sideC));
// return area;
// }