Untitled

mail@pastecode.io avatar
unknown
plain_text
7 months ago
3.1 kB
1
Indexable
Never
#include <iostream>
#include <vector>

using namespace std;

// Структура, представляющая точку на плоскости
struct Point {
    int x, y;
};

// Функция для определения ориентации трех точек (направление обхода)
int orientation(Point p, Point q, Point r) {
    int val = (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
    if (val == 0) return 0;  // Коллинеарны
    return (val > 0) ? 1 : 2; // по часовой или против часовой стрелки
}

// Функция для проверки, лежит ли точка q на отрезке pr
bool onSegment(Point p, Point q, Point r) {
    return (q.x <= max(p.x, r.x) && q.x >= min(p.x, r.x) &&
        q.y <= max(p.y, r.y) && q.y >= min(p.y, r.y));
}

// Функция для определения пересечения двух отрезков
bool doIntersect(Point p1, Point q1, Point p2, Point q2) {
    int o1 = orientation(p1, q1, p2);
    int o2 = orientation(p1, q1, q2);
    int o3 = orientation(p2, q2, p1);
    int o4 = orientation(p2, q2, q1);

    // Общий случай
    if (o1 != o2 && o3 != o4)
        return true;

    // Особые случаи
    if (o1 == 0 && onSegment(p1, p2, q1)) return true;
    if (o2 == 0 && onSegment(p1, q2, q1)) return true;
    if (o3 == 0 && onSegment(p2, p1, q2)) return true;
    if (o4 == 0 && onSegment(p2, q1, q2)) return true;

    return false;
}

// Функция для определения площади фигуры
int findArea(vector<Point> polygon) {
    int n = polygon.size();
    if (n < 3) return 0; // Многоугольник должен иметь хотя бы три вершины

    int area = 0; // Инициализация площади

    // Проход по каждой паре смежных вершин
    for (int i = 0; i < n; i++) {
        int j = (i + 1) % n;
        area += (polygon[i].x * polygon[j].y - polygon[j].x * polygon[i].y);
    }

    // Возвращаем абсолютное значение, так как площадь может быть отрицательной
    return abs(area / 2);
}

int main() {
    // Ввод координат вершин многоугольника от пользователя
    setlocale(LC_ALL, "Russian");
    int numVertices;
    cout << "Введите количество вершин многоугольника: ";
    cin >> numVertices;

    vector<Point> polygon;
    for (int i = 0; i < numVertices; ++i) {
        Point vertex;
        cout << "Введите координаты вершины " << i + 1 << ": ";
        cin >> vertex.x >> vertex.y;
        polygon.push_back(vertex);
    }

    // Вызов функции для определения площади
    int area = findArea(polygon);

    // Вывод результата
    cout << "Площадь фигуры: " << area << endl;

    return 0;
}
Leave a Comment