Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Hình dạng Equable (Equable Shapes) trong C++

Cho tọa độ các đỉnh của một đa giác. Kiểm tra xem đa giác đó có phải là Hình Equable hay không.

Hình Equable là hình có Chu vi bằng Diện tích.

Ví dụ minh họa

Đầu vào: polygon[][] = {{0, 0}, {5, 7}, {2, 0}} (Tam giác)

Đầu ra: Không phải hình Equable

Giải thích: Chu vi ≈ 18.21, Diện tích = 7. Không bằng nhau.

Phương pháp giải

  1. Tính chu vi: Tổng độ dài các cạnh. Độ dài cạnh giữa (x1,y1) và (x2,y2) là sqrt((x2-x1)² + (y2-y1)²).
  2. Tính diện tích (Công thức Shoelace):
    Area = 0.5 * |Σ(x_i * y_{i+1} - x_{i+1} * y_i)|
  3. So sánh Chu vi và Diện tích (cần xét sai số float).

Chương trình minh họa

#include <bits/stdc++.h>
using namespace std;

double polygonArea(vector<pair<double, double>> pts) {
    double area = 0;
    int n = pts.size();
    for (int i = 0; i < n; i++) {
        int j = (i + 1) % n;
        area += pts[i].first * pts[j].second - pts[j].first * pts[i].second;
    }
    return fabs(area) / 2.0;
}

double polygonPerimeter(vector<pair<double, double>> pts) {
    double peri = 0;
    int n = pts.size();
    for (int i = 0; i < n; i++) {
        int j = (i + 1) % n;
        double dx = pts[i].first - pts[j].first;
        double dy = pts[i].second - pts[j].second;
        peri += sqrt(dx*dx + dy*dy);
    }
    return peri;
}

bool isEquable(vector<pair<double, double>> pts) {
    double area = polygonArea(pts);
    double peri = polygonPerimeter(pts);
    cout << "Dien tich: " << area << ", Chu vi: " << peri << endl;
    // So sánh float với epsilon
    return fabs(area - peri) < 1e-9;
}

int main() {
    vector<pair<double, double>> poly = {{0,0}, {5,7}, {2,0}};
    if (isEquable(poly))
        cout << "La hinh Equable";
    else
        cout << "Khong phai hinh Equable";
    return 0;
}

Đầu ra

Dien tich: 7, Chu vi: 18.2116
Khong phai hinh Equable