нахождение площади
От: Desperatov  
Дата: 07.07.05 19:41
Оценка:
Как найти общую площадь комплекса плоских фигур, накиданных произвольно, возможно с пересечениями.
Заранее спасибо.
Re: нахождение площади
От: McSeem2 США http://www.antigrain.com
Дата: 07.07.05 20:13
Оценка:
Здравствуйте, Desperatov, Вы писали:

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


Сначала надо все их объединить. Для объединения/пересечения и т.д. в векторной форме можно использовать, например вот это: http://www.cs.man.ac.uk/aig/staff/alan/software/
Эта операция может быть весьма дорогой, особенно если многоугольников много. Алгоритм Алана (Bala R.Vatti, если быть точным) может объединить два многосвязных мнгогоугольника (как при вызове функции WinAPI PolyPolygon). Но в данной задече нам придется объединять строго по одному. То есть берем два, объединяем. Далее берем следующий и объединяем с результатом и т.д. Казалось бы, можно интерпретировать все полигоны как один многосвязный и объединить его с пустым множеством, но этот номер не пройдет, поскольку в местах пересечений возникнут дыры. Данный алгоритм умеет работать только по правилу even-odd.

После того, как результирующий мульти-полигон найден, считаем площадь. Для этого суммируем площади всех односвязых полигонов:
http://astronomy.swin.edu.au/~pbourke/geometry/polyarea/
http://astronomy.swin.edu.au/~pbourke/geometry/polyarea/source1.c
Площадь получается со знаком, определяющим направление обхода, поэтому берем модуль.
Но здесь тоже есть засада с самопересекающимися полигонами, например для четырехугольника:
(0,0) (10,0) (0,10) (10,10) вычисленая площадь будет 0.
Но похоже (не уверен на 100%), что алгоритм Алана справляется с такими перевертышами — на выходе вместо самопересекающегося четырехугольника у нас будет шестиугольник без самопересечений.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[2]: нахождение площади
От: McSeem2 США http://www.antigrain.com
Дата: 08.07.05 15:45
Оценка:
MS>Сначала надо все их объединить. [. . .]

Кстати, если не нужна очень-очень большая точность, то все полигоны можно растеризовать в битовую матрицу, после чего посчитать единичные пикселы. На экранных разрешениях это может быть раз в 10 быстрее. Для растеризации можно использовать любой доступный способ, например, такой:
http://www.rsdn.ru/Forum/Message.aspx?mid=461727&only=1
Автор: McSeem2
Дата: 30.11.03

Даже можно средствами WinAPI — создаем монохромный MemDC, рисуем в нем фигуры стандартными функциями, после чего считаем площадь.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[3]: нахождение площади
От: Desperatov  
Дата: 09.07.05 19:44
Оценка:
Ваши советы пришлись кстати. Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.