Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <iomanip>
- using namespace std;
- int main()
- {
- setlocale(LC_ALL, "Russian");
- int n, npl, i;
- double **coordinates, area, vpr1, vpr2, vpr3, vpr4;
- bool isNotCorrect;
- area = 0;
- cout << "Программа считает площадь многоугольника по координатам его вершин.\n";
- cout << "Введите количество вершин многоугольника (не более 10^6): ";
- do {
- isNotCorrect = true;
- cin >> n;
- if (cin.fail() || cin.get() != '\n') {
- cout << "Ошибка ввода. Введите натуральное число.\n";
- cin.clear();
- while (cin.get() != '\n');
- }
- else if ((n <= 2) || (n > 1000000)) {
- cout << "Ошибка ввода. Введите натуральное число в промежутке [3;10^6]\n";
- }
- else {
- isNotCorrect = false;
- }
- } while (isNotCorrect);
- npl = n + 1;
- coordinates = new double* [npl];
- for (int i = 0; i < npl; i++) {
- coordinates[i] = new double[2];
- }
- do {
- for (int k = 0; k < n; k++) {
- do {
- do {
- isNotCorrect = true;
- cout << "Введите координату X" << k + 1 << ' ' << "в диапазоне (-10000; 10000):\n";
- cin >> coordinates[k][0];
- if (cin.fail() || cin.get() != '\n') {
- cout << "Ошибка ввода. Введите действительное число." << '\n';
- cin.clear();
- while (cin.get() != '\n');
- }
- else if ((abs(coordinates[k][0]) > 10000)) {
- cout << "Ошибка ввода. Введите координату точки в диапазоне (-10000; 10000)\n";
- }
- else {
- isNotCorrect = false;
- }
- } while (isNotCorrect);
- do {
- isNotCorrect = true;
- cout << "Введите координату Y" << k + 1 << ' ' << "в диапазоне (-10000; 10000):\n";
- cin >> coordinates[k][1];
- if (cin.fail() || cin.get() != '\n') {
- cout << "Ошибка ввода. Введите действительное число." << '\n';
- cin.clear();
- while (cin.get() != '\n');
- }
- else if ((abs(coordinates[k][1]) > 10000)) {
- cout << "Ошибка ввода. Введите координату точки в диапазоне (-10000; 10000)\n";
- }
- else {
- isNotCorrect = false;
- }
- } while (isNotCorrect);
- i = 1;
- while (!isNotCorrect && (i < k - 1)) {
- vpr1 = (coordinates[k][0] - coordinates[k - 1][0]) * (coordinates[i - 1][1] - coordinates[k - 1][1]) - (coordinates[i - 1][0] - coordinates[k - 1][0]) * (coordinates[k][1] - coordinates[k - 1][1]);
- vpr2 = (coordinates[k][0] - coordinates[k - 1][0]) * (coordinates[i][1] - coordinates[k - 1][1]) - (coordinates[i][0] - coordinates[k - 1][0]) * (coordinates[k][1] - coordinates[k - 1][1]);
- vpr3 = (coordinates[i][0] - coordinates[i - 1][0]) * (coordinates[k - 1][1] - coordinates[i - 1][1]) - (coordinates[k - 1][0] - coordinates[i - 1][0]) * (coordinates[i][1] - coordinates[i - 1][1]);
- vpr4 = (coordinates[i][0] - coordinates[i - 1][0]) * (coordinates[k][1] - coordinates[i - 1][1]) - (coordinates[k][0] - coordinates[i - 1][0]) * (coordinates[i][1] - coordinates[i - 1][1]);
- if (((!vpr1 && vpr2) || (vpr1 && !vpr2)) && ((!vpr3 && vpr4) || (vpr3 && !vpr4)) || (((vpr1 > 0 && vpr2 < 0) || (vpr1 < 0 && vpr2 > 0)) && ((vpr3 > 0 && vpr4 < 0) || (vpr3 < 0 && vpr4 > 0)))) {
- cout << "Вы ввели координаты вершин самопересекающегося многоугольника! Повторите ввод." << '\n';
- isNotCorrect = true;
- }
- i++;
- }
- } while (isNotCorrect);
- }
- coordinates[n][0] = coordinates[0][0];
- coordinates[n][1] = coordinates[0][1];
- i = 2;
- while (!isNotCorrect && (i < n - 1)) {
- vpr1 = (coordinates[n][0] - coordinates[n - 1][0]) * (coordinates[i - 1][1] - coordinates[n - 1][1]) - (coordinates[i - 1][0] - coordinates[n - 1][0]) * (coordinates[n][1] - coordinates[n - 1][1]);
- vpr2 = (coordinates[n][0] - coordinates[n - 1][0]) * (coordinates[i][1] - coordinates[n - 1][1]) - (coordinates[i][0] - coordinates[n - 1][0]) * (coordinates[n][1] - coordinates[n - 1][1]);
- vpr3 = (coordinates[i][0] - coordinates[i - 1][0]) * (coordinates[n - 1][1] - coordinates[i - 1][1]) - (coordinates[n - 1][0] - coordinates[i - 1][0]) * (coordinates[i][1] - coordinates[i - 1][1]);
- vpr4 = (coordinates[i][0] - coordinates[i - 1][0]) * (coordinates[n][1] - coordinates[i - 1][1]) - (coordinates[n][0] - coordinates[i - 1][0]) * (coordinates[i][1] - coordinates[i - 1][1]);
- if (((!vpr1 && vpr2) || (vpr1 && !vpr2)) && ((!vpr3 && vpr4) || (vpr3 && !vpr4)) || (((vpr1 > 0 && vpr2 < 0) || (vpr1 < 0 && vpr2 > 0)) && ((vpr3 > 0 && vpr4 < 0) || (vpr3 < 0 && vpr4 > 0)))) {
- cout << "Вы ввели координаты вершин самопересекающегося многоугольника! Повторите ввод." << '\n';
- isNotCorrect = true;
- }
- i++;
- }
- } while (isNotCorrect);
- for (int i = n; i > 0; i--) {
- area = area + coordinates[i - 1][0] * coordinates[i][1] - coordinates[i - 1][1] * coordinates[i][0];
- }
- area = abs(area / 2);
- cout << setprecision(5);
- cout << "Площадь заданного многоугольника равна " << area << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement