Задача: Многоугольник (необязательно выпуклый) задан на плоскости перечислением координат вершин в порядке обхода его границы. Определить площадь многоугольника.
Написал код для вычисления площади выпуклого многоугольника (да, с выделением памяти в куче). Как его можно переделать под вычисление площади невыпуклого многоугольника и вообще алгоритм определения: введенный многоугольник является выпуклым или нет? (Если без разбивания многоугольника на фигуры никак, то напишите, пожалуйста, как его разбить и вычислить каждую фигуру отдельно)
#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;
У вас в коде реализована какая-то совсем бессмысленная формула, никакого отношения ни какой площади не имеющая даже для выпуклых многоугольников.
Ваша формула как-будто отдаленно напоминает формулу "шнуровки" для вычисления площади многоугольника. Формула "шнуровки" прекрасно работает для любого простого многоугольника. Никакого требования выпуклости многоугольника у этой формулы нет. Именно эта формула вам и нужна.
То есть: реализуйте правильную формулу. И помните, что в ней участвуют все ребра многоугольника, в том числе и ребро из последней вершины в первую.
Ваш "псевдо-цикл" for (int j = 0; j < 2; j++)
при вводе координат вообще поражает своей сюрреалистичностью. Зачем вы писали цикл, если никакого цикла вы там не собирались делать?
Ваш код "без массивов" - вариант корректной реализации формулы шнуровки.
Решил следующим образом, все работает правильно, даже с невыпуклыми треугольниками. Спасибо за замечания, 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;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Неправильно записывает и читает из файлаЗаписывает age = 5и Name = "Масло", а выводит age=0 и Name = ""
Переустановил Windows, поставив английскую версию (United States)После этого все файлы кода в Visual Studio, которые были написаны на русской версии, искажены,...
На форме есть 2 lineEdit'aЕсть на форме куча кнопок а-ля цифровая клавиатура (делаю десктоп-приложение с адаптацией под тачскрины)