площадь произвольного многоугольника
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
даны натуральное число 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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Это довольно просто.
Для примера возьмём треугольник ABC, у которого координаты вершин заданы точками a, b, c.
Есть даже специальная структура POINT, которая описывает координаты точки.
Нужно сначала вычислить контрольные значения для отрезков ab, bc, ca.
Это делается с помощью весьма простой функции...
Эта функция вызывается для каждого отрезка. Здесь главное не нарушить порядок обхода вершин фигуры.
Т.е. конец одного отрезка должен быть началом следующего отрезка, иначе результат получится неверным.
Далее результаты контрольных значений складываем и сумму делим на 2.
Вместо треугольника можно взять фигуру с любым количеством сторон.
Для примера возьмём треугольник 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 писал(а):чего-то я не понимаю! Для треугольника да, не трудно...но если задать произвольный многоугольник...не понимаю...
Просто вызываете функцию CheckLine в цикле для последовательных пар вершин, а результат заносите либо в другой массив, либо сразу считаете сумму, а в конце делите ее на 2.13-GK-13 писал(а):чего-то я не понимаю! Для треугольника да, не трудно...но если задать произвольный многоугольник...не понимаю...
-
- Сообщения: 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)
}
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-ем.
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-ем.