Площадь невыпуклого многоугольника

122
11 декабря 2020, 07:50

Задача: Многоугольник (необязательно выпуклый) задан на плоскости перечислением координат вершин в порядке обхода его границы. Определить площадь многоугольника.

Написал код для вычисления площади выпуклого многоугольника (да, с выделением памяти в куче). Как его можно переделать под вычисление площади невыпуклого многоугольника и вообще алгоритм определения: введенный многоугольник является выпуклым или нет? (Если без разбивания многоугольника на фигуры никак, то напишите, пожалуйста, как его разбить и вычислить каждую фигуру отдельно)

#include "stdafx.h"
#include <iostream>
using namespace System;
using namespace std;
int main()
{
    setlocale(0, "");
    int y, x, c, i = 0;
    cout << "Кол-во углов ";
    cin >> c;
    int(*coor)[2];
    coor = new int[c][2];
    while (i != c)
    {
        for (int j = 0; j < 2; j++)
        {
            cout << "Введите координаты " << endl;
            cout << "По X ";
            cin >> x;
            cout << "По Y ";
            cin >> y;
            coor[i][j] = x;
            j = 1;
            coor[i][j] = y;
            j = 2;
        }
        i++;
    };
    i = 0;
    int t = i + 1;
    double sum, pl = 0;
    for (i; t!= c; i++)
    {
        sum = ((coor[i][0] + coor[t][0])*(coor[i][1] - coor[t][1])) / 2;
        pl = pl + sum;
        t++;
    }
    cout << "Площадь " << abs(pl) << endl;
    system("pause");
    delete[]coor;
}

Так выглядит эта же прога без массивов. Здесь все работает верно. Видимо неправильно интегрировал сюда динамический массив... Помогите, пожалуйста

int n, x, y, x1, x2, y1, y2;
    double sum = 0;
    cout << "Введите кол-во углов многоугольника: ";
    cin >> n;
    cout << "Введите координаты вершины многоугольника: ";
    cin >> x >> y;
    x1 = x;
    y1 = y;
    for (int i = 0; i < (n - 1); i++) 
    {
        cout << "Введите координаты следующей вершины: ";
        cin >> x2 >> y2;
        sum = sum + (x1 + x2)*(y2 - y1);
        x1 = x2;
        y1 = y2;
    }
    sum = sum + (x + x2)*(y - y2);
    sum = abs(sum) / 2;
    cout << fixed << setprecision(3) << sum << endl;
Answer 1

У вас в коде реализована какая-то совсем бессмысленная формула, никакого отношения ни какой площади не имеющая даже для выпуклых многоугольников.

Ваша формула как-будто отдаленно напоминает формулу "шнуровки" для вычисления площади многоугольника. Формула "шнуровки" прекрасно работает для любого простого многоугольника. Никакого требования выпуклости многоугольника у этой формулы нет. Именно эта формула вам и нужна.

То есть: реализуйте правильную формулу. И помните, что в ней участвуют все ребра многоугольника, в том числе и ребро из последней вершины в первую.

Ваш "псевдо-цикл" for (int j = 0; j < 2; j++) при вводе координат вообще поражает своей сюрреалистичностью. Зачем вы писали цикл, если никакого цикла вы там не собирались делать?

Ваш код "без массивов" - вариант корректной реализации формулы шнуровки.

Answer 2

Решил следующим образом, все работает правильно, даже с невыпуклыми треугольниками. Спасибо за замечания, AnT.

#include "stdafx.h"
#include <iostream> 
#include <iomanip>
#include <cmath>
using namespace std;
int main()
{
    setlocale(0, "");
    int c, i = 0;
    cout << "Кол-во углов ";
    cin >> c;
    int(*coor)[2];
    coor = new int[c][2];
    while (i != c)
    {
        cout << "Введите координаты " << endl;
        cout << "По X ";
        cin >> coor[i][0];
        cout << "По Y ";
        cin >> coor[i][1];
        i++;
    };
    double sum = 0;
    i = 0;
    int t = 1;
    while (t != c) 
    {
        sum = sum + (coor[i][0] + coor[t][0])*(coor[t][1] - coor[i][1]);
        t++;
        i++;
    }
    t = c - 1;
    i = 0;
    sum = sum + (coor[i][0] + coor[t][0])*(coor[i][1] - coor[t][1]);
    cout << "Площадь " << fixed << setprecision(3) << abs(sum) / 2 << endl;
    system("pause");
    delete[]coor;
}
READ ALSO
Qt5: lineEdit Не учитывается значение с запятой

Qt5: lineEdit Не учитывается значение с запятой

Есть некоторая форма на которой есть lineEdit

104
Запись и чтение объекта из бинарного файла

Запись и чтение объекта из бинарного файла

Неправильно записывает и читает из файлаЗаписывает age = 5и Name = "Масло", а выводит age=0 и Name = ""

113
Иероглифы вместо русского текста в коде

Иероглифы вместо русского текста в коде

Переустановил Windows, поставив английскую версию (United States)После этого все файлы кода в Visual Studio, которые были написаны на русской версии, искажены,...

87
Qt5: как понять на каком из lineEdit стоит фокус

Qt5: как понять на каком из lineEdit стоит фокус

На форме есть 2 lineEdit'aЕсть на форме куча кнопок а-ля цифровая клавиатура (делаю десктоп-приложение с адаптацией под тачскрины)

122