[기하학] 다각형의 면적 - 백준 2166번

2 분 소요

2166번: 다각형의 면적

Self Intersecting Polygon

Untitled

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

신발끈 공식

Untitled 1

Untitled 2

헤론의 공식

Untitled 3

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;
// }

카테고리:

업데이트: