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