Форум: "Основная";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
ВнизПлощадь Найти похожие ветки
← →
Bobby Digital © (2004-12-11 17:36) [0]Есть ли в Делфи какая-нить стандартная функция которая находит площадь много угольника, если известны координаты его точек
или подскажите кто-нить формулу а то что аналитич. геометрию подзабыл
← →
Arm79 (2004-12-11 17:58) [1]я и математической то формулы не знаю, которая позволяла бы находить площадь Н-угольника в общем случае. Только частные случаи типа квадрат, треугольник. Если не нужна сверхточность, то можно использоваь метод монте-карло. Определяешь min(x), min(y), max(x), max(y), строишь прямоугольник по этим координатам (получается, что фигура будет заключена внутри прямоугольника). Пишешь функцию, которая может определять, попала ли случайно выбранная точка внутри прямоугольника внутрь Н-угольника или нет. Затем определяешь процент таких попаданий. этот процент будет являться и процентом прощади Н-угольника от площади прямоугольника. Соостветственно, чем больше точек выберешь, тем точнее результат. Распределение должно быть равномерным, поэтому стандартная фунцкция Random вполне подходит
← →
TButton © (2004-12-11 18:52) [2]я знаю, ибо топограф с красным дипломом, и прога у мну есть которая считает площадь N-угольника по координатам вершин *написал в свое время, чтоб лабораторные в ней считать, неплохо кстати наварился*
сейчас найду исходняки.
← →
TButton © (2004-12-11 18:57) [3]эээ...
давай я тебе их на мыло скину.
с тебя конверт с обратным адресом =)
вышлешь его на marcuch@yandex.ru
← →
default © (2004-12-11 19:01) [4]Arm79 (11.12.04 17:58) [1]
посчитать-то можно точно по-любому - есть же вроде бы методы триангуляции многоугольников(разбиения на треугольники), ну а их площадь посчитать не проблема по точкам
← →
TButton © (2004-12-11 20:02) [5]в двух словах:
есть n-угольник *не Игоря*
1. выписываем координаты
X[1]
X[2]
...
X[n]
X[1]
2. высчитываем приращения координат
X[1]-X[2]
X[2]-X[3]
...
X[n-1]-X[n]
X[n]-X[1]
получается n приращений координат
3. перемножаем
(X[1]-X[2])*Y[1]
(X[2]-X[3])*Y[2]
...
(X[n-1]-X[n])*Y[n-1]
(X[n]-X[1])*Y[n]
получаем n произведений
4. суммируем произведения
получаем удвоеную пложадь P2
5. делим сумму пополам
получаем площадь n-угольника *не Игоря*
знак пложади зависит от порядка в котором взяты координаты
если выписывать координаты по ходу часовой стрелки площадь получится с плюсом
против - с минусом
*или наоборот, точно не помню*
т.е. P=ABS(P2/2)
← →
TButton © (2004-12-11 20:06) [6]запорол п.2
должно быть так:X[1]-X[3]
X[2]-X[4]
...
X[n-2]-X[n]
X[n-1]-X[1]
← →
ECM © (2004-12-11 20:13) [7]Это задача для средней школы:
procedure TRGN_Element.CalcArea;
var
i,j: Integer;
p0,p1: PPointF;
begin
Area := 0;
if fCount > 2 then begin
for i:=0 to fCount-1 do begin
p0 := PPointF(fOrigins+i*SizeOf(TPointF));
j := i+1;
if j = fCount then j := 0;
p1 := PPointF(fOrigins+j*SizeOf(TPointF));
Area := Area + (p1.x - p0.x)*(p1.y + p0.y);
end;
Area := EAbs(Area)*0.5;
end;
end;
Это расчет площади фигуры в векторной карте (я думаю принцип достаточно прозрачен)
← →
ECM © (2004-12-11 20:14) [8]Сорри начал набирать - отвлекся - посты [4]-[6] не видел
← →
Oitxr © (2004-12-11 20:32) [9]Попробуй с помощью трапеций,составленных из вершин n-угольника.
← →
jack128 © (2004-12-11 20:36) [10]Oitxr © (11.12.04 20:32) [9]
Попробуй с помощью трапеций,составленных из вершин n-угольника
произвольный n-угольник очевидно нельзя разбить на трапеции. Берем учебник геометрии и ищем определение трапеции.
← →
ECM © (2004-12-11 20:45) [11]jack128 © (11.12.04 20:36) [10]
произвольный n-угольник очевидно нельзя разбить на трапеции.
Гы-Гы .. Легко! И-тая трапеция ограничена сверху И-тым ребром н-угольника,снизу осью OX, две остальные стороны - перпендикуляры опущеные из вершин И-того ребра...
Это же видно из листинга [7]
← →
ECM © (2004-12-11 20:52) [12]З.Ы. Перпендикуляры опущены на ось OX...
И как правильно замечено в [5] часть трапеций будет со знаком "+" часть со знаком "-". После суммирования "лишняя" площадь - не входящая в многоугольник (под многоугольником до оси OX) исключается...
← →
default © (2004-12-11 20:57) [13]ECM © (11.12.04 20:13) [7]
код с j лучше за цикл вынести
что-то мне кажется что Ваш код правильно считает только тогда когда каждое ребро соприкасается один раз с осью OX
← →
ECM © (2004-12-11 21:05) [14]2 default © (11.12.04 20:57) [13]
Код абсолютно рабочий - точно так же считает программа
GPSMapEdit http://www.geopainting.com/ru/
Я сравнивал с ее исходниками (правда тогда она называлась
просто MapEdit и была фриваре-опенсорц )
А по-поводу соприкосновения - нарисуйте на бумаге многоугольник
и опустите из каждой вершины перпендикуляр на OX и присмотритесь :)
← →
ECM © (2004-12-11 21:14) [15]З.ы. Сорри - про GPSMapEdit немного наврал - давно не заходил
сайт переделан - так что сразу не нашел исходники (правда все равно лишь частичные ).
Так что извиняюсь перед автором :)
← →
jack128 © (2004-12-11 21:36) [16]ECM © (11.12.04 21:05) [14]
А по-поводу соприкосновения - нарисуйте на бумаге многоугольник
и опустите из каждой вершины перпендикуляр на OX и присмотритесь :)
нарисовал правельный пятиугольник. Одну из старон принял за ось OX. Провел перпендикуляры из оставшихся трех точек. Увидел 3 трапеции. все выходили за границы пятиугольника.
Вырежь, пожалуйста, из бумаги 5-угольник, неимеющий паралельных сторон и разрежь его на трапеции. У меня не получилось..
То ли лыжи не едут, то ли..
← →
ECM © (2004-12-11 22:57) [17]2 jack128 © (11.12.04 21:36) [16]
То ли лыжи не едут, то ли..
как говорил хрюндель - "на этом мысль останавливается...":)
Вы наверное невнимательно прочитали предыдущее...
Никто многоугольник вот так в лоб на трапеции НЕ режет.
(может я действительно не точно выразился - сорри)
Строятся трапеции как бы ПОД многоугольником.
И одну из сторон НЕ надо принимать за ОХ а просто опустить перпендикуляры. В рез. получаться трапеции выходящие за границы
многоугольника - но суммирование их площадей дает площадь многоугольника(т.к. площади трапеций имеют разные знаки)
← →
Bobby Digital © (2004-12-11 22:57) [18]Спасибо всем за ответы, все работает! ;)
← →
jack128 © (2004-12-11 23:02) [19]ECM © (11.12.04 22:57) [17]
Угу, разобрались.
← →
default © (2004-12-11 23:27) [20]вообщем принцип можно понять тут
(вообщем интегрируем по ломаным слева направо с плюсом, справа налево с минусом дабы убить лишнюю площадь полученную на первом обходе)
http://algolist.manual.ru/maths/geom/polygon/area.php
и сравнить с Вашими программами
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.036 c