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
- 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)²).
- Tính diện tích (Công thức Shoelace):
Area = 0.5 * |Σ(x_i * y_{i+1} - x_{i+1} * y_i)| - 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