площадь произвольного многоугольника

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
13-GK-13
Сообщения: 6
Зарегистрирован: 10 окт 2010, 09:21

даны натуральное число n, действительные числа х1, у1, х2, у2,...,хn, yn. Найти площадь n-угольника произвольной конфигурации, вершины которого при некотором последовательном обходе имеют координаты (х1, у1), (x2,y2),..., (xn, yn).
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

В чем проблема? В алгоритме, в реализации? Нужна точечная помощь или хочется получить полную готовую программу?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

Это довольно просто.
Для примера возьмём треугольник ABC, у которого координаты вершин заданы точками a, b, c.
Есть даже специальная структура POINT, которая описывает координаты точки.

Нужно сначала вычислить контрольные значения для отрезков ab, bc, ca.
Это делается с помощью весьма простой функции...

Код: Выделить всё

// Контрольное значение для отрезка 
int CheckLine(POINT p1, POINT p2) 
{
      return p1.x * p2.y - p1.y * p2.x; 
}
Эта функция вызывается для каждого отрезка. Здесь главное не нарушить порядок обхода вершин фигуры.
Т.е. конец одного отрезка должен быть началом следующего отрезка, иначе результат получится неверным.
Далее результаты контрольных значений складываем и сумму делим на 2.

Код: Выделить всё

// Контрольные значения...
int ab = CheckLine(a, b);
int bc = CheckLine(b, c);
int ca = CheckLine(c, a);
// Площадь треугольника...
int S = (ab + bc + ca)/2;
Вместо треугольника можно взять фигуру с любым количеством сторон.
Поумнеть несложно, куда труднее от дури избавиться.
13-GK-13
Сообщения: 6
Зарегистрирован: 10 окт 2010, 09:21

чего-то я не понимаю! Для треугольника да, не трудно...но если задать произвольный многоугольник...не понимаю...
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

13-GK-13 писал(а):чего-то я не понимаю! Для треугольника да, не трудно...но если задать произвольный многоугольник...не понимаю...
Многоугольник состоит из треугольников, сложить площади треугольников.
azrael
Сообщения: 89
Зарегистрирован: 31 май 2009, 15:30
Контактная информация:

13-GK-13 писал(а):чего-то я не понимаю! Для треугольника да, не трудно...но если задать произвольный многоугольник...не понимаю...
Просто вызываете функцию CheckLine в цикле для последовательных пар вершин, а результат заносите либо в другой массив, либо сразу считаете сумму, а в конце делите ее на 2.
yunona_sorry
Сообщения: 3
Зарегистрирован: 02 ноя 2010, 21:02

помогите пожалуйста с формулой... что необходимо изменить здесь? считает, но ответ даже близко не подходит!

Код: Выделить всё

#include <stdio.h>
#include <math.h>
void main()
{
 int n, s, i;
 int x[20]y[20];
 printf ("введите количество углов");
 scanf ("%d",&n);
 {
 for (int i=1; i<=n;i++)
 printf ("ведите координаты точек "%d",i);
 scanf ("%d",&x[i]);
 scanf ("%d",y[i]);
 }
 s=0;
 {for (i=1;i<n-1;i++)
 s=s+(x[i]-x[i+1])*(y[i]+y[i+1]);
 }
 s=s+(x[n]-x[1])*(y[n]+y[1]);
 s=abs(s/2);
 printf ("s n-угольника %d",s)
 }
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

1) Почему scanf ("%d",&x), но scanf ("%d",y) ? (т.к. в первом случае присутствует &, а во втором нет)

2) Массивы в C индексируются с 0, а не с 1, поэтому:
for (i=0; i<n;i++), а не for (int i=1; i<=n;i++)
и
for (i=0;i<n-1;i++), а не for (i=1;i<n-1;i++)
и
s=s+(x[n-1]-x[0])*(y[n-1]+y[0]), а не s=s+(x[n]-x[1])*(y[n]+y[1])

3) Ваша формула верная? По крайней мере, она отличается от предложенной azrael-ем.
Ответить