www.newearth.ru

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » www.newearth.ru » Основной » Площадь многоугольника


Площадь многоугольника

Сообщений 1 страница 30 из 31

1

Нужен алгоритм попроще для вычисления площади выпуклого многоугольника если есть массив точек:
X1-Y1, X2-Y2, X3-Y3, ...  , Xn-Yn

имейте ввиду что точки расположены хаотично и не все могут лежать на границе

Чья формула будет вставлена в проект получит хорошее вознаграждение.

0

2

Территория

я чегото не догнал. А это чем плохо?

0

3

Artppm написал(а):

я чегото не догнал. А это чем плохо?

Не площадь треугольника, а площадь многоугольника с N-вершинами (и не забыть отбросить лишние)
нужна y=f(x), точнее S=f(x1,y1,....,xn,yn)

0

4

admin написал(а):

Artppm написал(а):я чегото не догнал. А это чем плохо?Не площадь треугольника, а площадь многоугольника с N-вершинаминужна y=f(x), точнее S=f(x1,y1,....,xn,yn)

Проще всего вычислить площадь выпуклого многоугольника - разбиение его на отдельные треугольники! И потом вычислить площи треугольников и их сумирования!

Формула расчета площади треугольника по координатам его вершин:

Пусть n - число вершин, X(n), Y(n) - массивы, содержащие координаты вершин!
Код на паскале:

s:=0;
for i:=3 to n do
s:=s+0.5*abs((x[i-1]-x[1])*(y[i]-y[1])-
             (x[i]-x[1])*(y[i-1]-y[1]));

К сожалению как написать правильно не знаю(((

Отредактировано whitenight (2008-06-30 11:57:16)

0

5

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

Отредактировано whird (2008-06-30 12:15:06)

0

6

почему повторяющиеся?
там есть цикл и соответственно координаты на одиницу будут сдвигатся до последней вершины! Незнаю как картинку вставить, так бы показал!!!

Отредактировано whitenight (2008-06-30 12:32:48)

0

7

а не проще ли ЗК считать по крайним точкам . провести через них прямые а внутренние точки в расчет не брать

0

8

вершины для проверки ваших формул
(0,0);(2,0);(2,2);(0,2)
(0,0);(2,0);(0,2);(2,2)
(0,0);(2,0);(2,2);(0,2);(1,1)

Во всех случаях площадь должна быть равна 4 !

0

9

admin написал(а):

(0,0);(2,0);(2,2);(0,2);(1,1)

Ето не выпуклый многоугольник!!!
Точка (1,1), лежит внутри многоугольника (0,0);(2,0);(2,2);(0,2)!!!

Если для ЗК то нуна вычислять какие точки лежат внутри и выкидать из ращота!!!
Есть два варианта:
1. Вычислять ненужные точки!
2. Вычислять площадь ломаного треугольника, ну тогда зк будет меньше!
Жду ответ :flag:

0

10

whitenight написал(а):

Ето не выпуклый многоугольник!!!

admin написал(а):

Во всех случаях площадь должна быть равна 4 !

ЗК всегда выпуклый многоугольник. Это к тому что просто все точки не глядя в формулу не подставишь.
Нужно исключить лишние!

whitenight написал(а):

Вычислять площадь ломаного треугольника

ЛОМАНЫЙ ТРЕУГОЛЬНИК ?! Это новое слово в геометрии :)

0

11

admin написал(а):

Это к тому что просто все точки не глядя в формулу не подставишь.
Нужно исключить лишние!

Предлагаеш придумать алгоритм который будет откидать лишние точки е делать многоугольник  выпуклым?
Если можеш, напиши код который уже используется, может что то придумаю упростить!

admin написал(а):

ЛОМАНЫЙ ТРЕУГОЛЬНИК ?! Это новое слово в геометрии :)

Да винду переустановил и бока с сеткой и нетом были, раза 4 писал сообшение и бред написал! :blush:

0

12

admin написал(а):

ЗК всегда выпуклый многоугольник.

ИМХО надо бы всё-таки точнее определиться с самим понятием ЗК.
А то, например, у Santа поселения в 5 системах и площадь зоны 36382км2, а у меня поселения всего в 3х системах, а площадь ЗК почти в 2 раза больше (65292км2)!
Мне-то хорошо..., а каково Santу?  :crazy:
зы: типа увязать площадь ЗК не только с расположением крайних систем, но и с количеством оных...

Отредактировано Makarushka (2008-07-01 11:06:53)

0

13

Makarushka написал(а):

зы: типа увязать площадь ЗК не только с расположением крайних систем, но и с количеством оных...

НУ тогда заколонил свою систему всю и ЗК должна увеличится? Каким макаром?
ЗК должна зависеть от расположения поселения, а не от количества!

Отредактировано whitenight (2008-07-01 11:26:56)

0

14

+1

0

15

whitenight написал(а):

s:=0;
for i:=3 to n do
s:=s+0.5*abs((x[i-1]-x[1])*(y[i]-y[1])-
             (x[i]-x[1])*(y[i-1]-y[1]));

для (0,0);(2,0);(2,2);(0,2);(1,1) дает неверное "5"

0

16

Makarushka написал(а):

ИМХО надо бы всё-таки точнее определиться с самим понятием ЗК.

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

0

17

Нужен нормальный законченный алгоритм за который кто-то может получить 100000Cr

а вот такие рассуждения

slavcko написал(а):

а не проще ли ЗК считать по крайним точкам . провести через них прямые а внутренние точки в расчет не брать

делайте у себя дома, локально, сюда только алгоритмы!!!

whitenight написал(а):

Если можеш, напиши код который уже используется, может что то придумаю упростить!

Я дам 100000Cr за ваш алгоритм, а не за переделку моего!

0

18

admin написал(а):

Я дам 100000Cr за ваш алгоритм, а не за переделку моего!

у мя есть идея вычесления максимальной и правильной площади, но пока не придумал как проверить лежит ли точка в многоуголнике! Но алгоритм простым врядли будет!

0

19

как вариант, использовать алгоритм (является ли точка внутренней для n-1 точек) для всех точек по очереди.
если i точка является внутренней для оставшихся n-1 точек, то ее можно отбросить и проверить еще раз без нее, до тех пор, пока не останется внутренних точек

нашли n_j точек образующих выпуклую фигуру.
далее разделяем ее на треугольники:

от одной точки проводим прямые y=k x +b
где к = (y1-y2)(x1-x2), сортируем по к точки (акуратно работаем с делением на ноль, там может получится + и - бесконечность, можно ручками исправить)
начинаем строить треугольники
1 - выбраная точка + 1 и 2 с минимальным к
2 - выбраная точка + 2 и 3
....
j-2 выбраная точка + j-2 и j-1

сумируем пложади треугольников

это будет площадь фигуры

Отредактировано vvv (2008-07-02 19:49:18)

0

20

vvv написал(а):

нашли n_j точек образующих выпуклую фигуру.
далее разделяем ее на треугольники:

Формула есть уже

admin написал(а):

s:=0;
for i:=3 to n do
s:=s+0.5*abs((x[i-1]-x[1])*(y[i]-y[1])-
             (x[i]-x[1])*(y[i-1]-y[1]));

а вот идея нащот отпроса внутренних точок интересная, и вполне неплохо будет работать
+1

0

21

Формула для вычисления площади сложной фигуры по координатам точек выглядит следующим образом:
S=0.5[(X2Y1-X1Y2) + (X3Y2-X2Y3) + (X4Y3-X3Y4) +.....+ (X{n}Y{n-1}-X{n-1}Y{n}) + (X1Yn-XnY1)

для определения вершин, необходимо отбросить точки, которые находятся в середине этого многоульника. Для этого можна использовать вычесления синуса угла между векторами (с вершиной в проверяемой точке). если синус угла между всеми векторами имеет одинаковый знак (или + или -), то эта точка являеться вершиной. если синусу угла  векторов  (с вершиной в проверяемой точке) имеют разные значение или равняются 0, то эту точку надо отбросить.

вроде бы и не сложно :)

0

22

Программа определяющая площадь многоугольника

float ugol(float x1,float y1,float x2,float y2,float x3,float y3)
{
float a1,a2,b1,b2,e,k,a,yp,xn,xp,yn,alpha,pi=3.14159265;
if ((x3==x2&&y3==y2)||(x3==x1&&y3==y1)||(x1==x2&&y1==y2)) return pi*2.0;
a1=x1-x2;  b1=y2-y1;
a2=x3-x2;  b2=y2-y3;
e=a1*a2+b1*b2;
if(e<0) e=e*(-1.0);
alpha=acos(e/(sqrt(a1*a1+b1*b1)*sqrt(a2*a2+b2*b2)));
// Определение четверти
if(x1!=x2)
{
k=(y1-y2)/(x1-x2);
a=y2-k*x2;
yp=k*x3+a;
xn=x2+y2*k-y3*k;
if(y3>=yp&&x3<xn) alpha=pi-alpha;
else if(y3<yp&&x3<=xn) alpha=pi+alpha;
else if(y3<=yp&&x3>xn) alpha=2.0*pi-alpha;
}
else
{
k=(x1-x2)/(y1-y2);
a=x2-k*y2;
xp=k*y3+a;
yn=y2+x2*k-x3*k;
if(x3<=xp&&y3<yn) alpha=pi-alpha;
else if(x3>xp&&y3<=yn) alpha=pi+alpha;
else if(x3>=xp&&y3>yn) alpha=2.0*pi-alpha;
}
return alpha;
}

//----------------------------
float square (int x[100], int y[100],int n)
{
struct tochka {int x;int y;} r,cur,last;
int i,j=1,k=0,x1[100],y1[100];
float alpha, pi=3.14159265,beta,S=0.0,a,b,v;
r.x=x[1];
r.y=y[1];

for(i=2;i<=n;i++)
if(r.x<x[i])
{
r.x=x[i];
r.y=y[i];
j=i;
}

x[j]=-1;    y[j]=-1;
n++;
x[n]=r.x;   y[n]=r.y;
cur=r;
last=r;
last.x=last.x+1;
// Определение точек на периметре многоугольника
for(;;)
{
alpha=2.0*pi;
j=n;
for(i=1;i<=n;i++)
if(x[i]!=-1)
{
beta=ugol(last.x,last.y,cur.x,cur.y,x[i],y[i]);
if(beta<alpha)
{
alpha=beta;
j=i;
}
}
if ((x[j]==r.x)&&(y[j]==r.y)) break;
k++;
x1[k]=x[j];
y1[k]=y[j];
x[j]=-1;
y[j]=-1;
last=cur;
cur.x=x1[k];
cur.y=y1[k];
}

// Определение площади
for(i=2;i<=k;i++)
{
a=sqrt((r.x-x1[i-1])*(r.x-x1[i-1])+(r.y-y1[i-1])*(r.y-y1[i-1]));
b=sqrt((r.x-x1[i])*(r.x-x1[i])+(r.y-y1[i])*(r.y-y1[i]));
v=sin(ugol(x1[i-1],y1[i-1],r.x,r.y,x1[i],y1[i]));
if(v<0)v=v*(-1.0);
S=S+a*b*0.5*v;
}
return S;
}

+2

23

Я выместил архив по адресу http://rapidshare.com/files/127093284/alg.7z   В архиве Borland C 3.1 и исходник программы. Можешь поэксперементировать с программой и проверить точность вычислений. Алгоритм работает для любого количества точек более 2. Остается только перевести на нужный язык и пользоваться. Если непонятно по программе как алгоритм работает отпишись и я представлю алгоритм в более понятной форме.

0

24

А вот еще файл с информацией о вычеслении площади прямоуголтника (не всегда выпуклого) -  http:// www. referats. net/pages/ referats/ newage/ Detailed/ 16678.html. (нужно убрать пробелы)

Может поможет :)

Отредактировано Lord (2008-07-04 22:25:12)

0

25

Lord написал(а):

А вот еще файл с информацией о вычеслении площади прямоуголтника (не всегда выпуклого) -  http:// www. referats. net/pages/ referats/ newage/ Detailed/ 16678.html. (нужно убрать пробелы)
Может поможет

Алгорит на 4 листа формата А4.... Нет спасибо....
Иначе сервер 50% времени будет рассчитывать площади ЗК...

0

26

remi написал(а):

Программа определяющая площадь многоугольника

Укажи результат работы этой программы для
1: (0,0);(2,0);(2,2);(0,2)
2: (0,0);(2,0);(0,2);(2,2)
3: (0,0);(2,0);(2,2);(0,2);(1,1)

0

27

1: S=4.000000
2: S=4.000000
3: S=4.000000

Скачай архив с прогой и протести для более сложных значений и для большего числа точек

0

28

Я протестил большое количество разных ваиантов точек и пограмма давала правельный результат. Если и будет неточность то причина не в алгоритме а в программной реализации, и это очень легко подправить. У меня есть идеи как сделать пограмму быстрее и стабильнее, но переделать смогу ко вторнику.

0

29

vvv написал(а):

как вариант, использовать алгоритм (является ли точка внутренней для n-1 точек) для всех точек по очереди.если i точка является внутренней для оставшихся n-1 точек, то ее можно отбросить и проверить еще раз без нее, до тех пор, пока не останется внутренних точек
            нашли n_j точек образующих выпуклую фигуру.далее разделяем ее на треугольники:
            от одной точки проводим прямые y=k x +b где к = (y1-y2)(x1-x2), сортируем по к точки (акуратно работаем с делением на ноль, там может получится + и - бесконечность, можно ручками исправить)начинаем строить треугольники1 - выбраная точка + 1 и 2 с минимальным к2 - выбраная точка + 2 и 3 ....j-2 выбраная точка + j-2 и j-1
            сумируем пложади треугольников
            это будет площадь фигуры

напишу код:

функции:

In({x1,y1, ... xn,yn}, X,Y) // выдает true/false на принадлежность точки X Y  многоугольнику x1,y1, ... xn,yn. в {} передаются его координаты, чтоб было понятнее

задан некоторый многоурольник (x1,y1, ... xn,yn), n - число вершин, его координаты задать в массив
X[i]
Y[i]

//находим выпклый многоугольник

flag=true
until flag do{

for i=1 to n do
{
for j=1 to n do {
clear[X1,Y1];
If i!=j then {X1[j]=X[j];Y1[j]=Y[j];}}; // X1 Y1 - координаты многоугольника без 1 точки

if In({X1,Y1}, X[i],Y[i]) then {X=X1;Y=Y1; n=n-1;  break;// ушли из for начали заново};
                                  else {if i==n then flag=false};
}//for
}//until

//фукция нахождения коэффицента к от 2 точек

find_k(x1,y1,x2,y2):=
{
if x1==x2 then k=(y1-y2)*10000000 //чтоб избежать бесконечности
else к = (y1-y2)/(x1-x2)
}

//строим линии
for i=1 to n-1 do
{
k[i]=find_k(X[1],Y[1],X[i+1],Y[i+1]) 
}

// нужно отсортировать. готовых алгоритмов есть куча. простейший метод пузырька (медленный, но чисто для наглядностио он)

for i=1 to n-1 do
{
for j=i+1 to n-1 do
{
if k[j]>k[i] then //меняем точки местами, равенство быть не должно
{temp=X[i+1]; X[i+1]=X[j+1];X[j+1]=temp;temp=Y[i+1]; Y[i+1]=Y[j+1];Y[j+1]=temp;temp=k[i]; k[i]=k[j];k[j]=temp;}
}
}

//теперь треугольники
F_3( x1 y1 x2 y2 x3 y3) //нахождение площади треугольника, было выше. не прописываю

S=0;
for i=1 to n-2 do
{
S=S+F_3(X[1],Y[1], X[i+1],Y[i+1],  X[i+2],Y[i+2]);
}

ps. синтаксис не проверял, по памяти :)

Отредактировано vvv (2008-07-05 23:13:15)

0

30

Словесное описание алгоритма.
Пусть есть множество точек Т={t1,t2,..,ti,...,tn} с координатами (хi,yi). Сначала находится самая правая точка ti (самый большой х) и определяется как текущая точка CUR. R=ti, ti=tn, tn=R. Затем определяется "последняя" точка LAST, и ей присваиваются те же координаты что и CUR, но х-вая координата этой точки увеличивается на 1. Будем считать что множество точек P={p1,.....,pm} - это множество точек, находящихся по периметру многоугольника. Находим угол между LAST, CUR, и всеми остальными точками множества Т. Угол высчитывается против часовой стрелки. Таким образом точка ti с наименьшим углом является следующей точкой периметра. P=P+ti, T=T-ti, LAST=CUR, CUR=ti. Высчитываем все углы заново и определяем следующую точку периметра. Алгоритм выполняется до тех пор пока следущей точкой периметра не станет точка R. Таким образом в множестве P будут все точки, находящиеся по периметру многоугольника и эти точки будут упорядочены, если обходить против часовой стрелки. Алгоритм со 100% точностью определения точек периметра многоугольника.
Затем остается найти площадь многоугольника. Поскольку точки в множестве Р упорядочены, то площадь очень легко посчитать. Находя площадь треугольника (p[i],R,p[i+1]) по формуле S=0.5*a*b*sin(a^b). Где a длина отрезка [p[i],R], b длина отрезка [R,p[i]]. Суммируем все площади треугольников и получаем общую площадь многоугольника.
Функция ugol() находит угол между 2 прямыми, заданными двумя точками. Угол считается против часовой стрелки и работает для любого положения прямых на плоскости.
Функция square() находит площадь по указанному выше алгоритму.

0


Вы здесь » www.newearth.ru » Основной » Площадь многоугольника