|
подсчитать площадь кляксы |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 20)
|
Oct 22 2013, 15:45
|
Знающий
   
Группа: Свой
Сообщений: 518
Регистрация: 12-04-07
Из: Санкт-Петербург
Пользователь №: 26 997

|
Заливать всю площадь и считать интенсивность это обалдеть как ресурсозатратно. Одна только заливка произвольной фигуры чего стоит. Тогда уж проще прямо в процессе заливки и посчитать, скольким точкам был присвоен цвет заливки и помножить на площадь пикселя.
Для вашей задачи неплохим, как мне кажется, решением будет именно метод трапеций, о котором я говорил в начале. Точки у вас, как я понимаю, заданы в порядке обхода. Каждые две точки соединяются прямой, т.е. фигура описывается многоугольником. Затем, начиная с некоторой точки, считаем площадь прямоугольной трапеции, заданной вершинами (x(i),0) — (x(i),y(i)) — (x(i+1),y(i+1)) — (x(i+1),0). Тут для простоты считается, что все y больше нуля: dS = (x(i+1)-x(i)) *(y(i+1)+y(i))/2; S=S+dS. Когда обойдем все точки, в S будет площадь аппроксимирующего прямоугольника. Естественно, dS может быть как положительным, так и отрицательным.
|
|
|
|
|
Oct 22 2013, 22:56
|
ʕʘ̅͜ʘ̅ʔ
    
Группа: Свой
Сообщений: 1 008
Регистрация: 3-05-05
Пользователь №: 4 691

|
Залить и перебрать. это подход. Всё зависит от точности, с которой нужно получить эту площадь. Этим метод и прекрасен. Можно оценку уточнять с течением времени. Можно, оценивая сходимость, решать, нужно ли продолжать вычисления. В качестве начальной оценки (лист для кляксы в моем примере) взять описанный прямоугольник. Цитата(Xenia @ Oct 23 2013, 00:43)  Так он же не может определить, внутри кляксы точка или снаружи! Дорого это занятие для него. А если бы легко определялось, то залить кляксу краской и дело с концом. Тем паче, что быстрее все точки на том дисплее по очереди перебрать, чем Монте-Карла заводить.
|
|
|
|
|
Oct 24 2013, 10:50
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
по-моему, все гораздо проще. фигура нарисована на координатной плоскости, т.е. по сути известны целочисленные координаты каждой точки линии, ограничивающей ее контур, и сама площадь в пикселах будет только целочисленной, поэтому никакой тригонометрии и прочей плавающей точки в вычислениях! итак, начинаем сканирование от нуля координат дисплея: для каждой строки с координатой Yi ищем точку контура кляксы (Xj,Yi) - если нашли, значит, эту строку дисплея фигура пересекает. найдя такую точку, продолжаем искать парную ей точку ПРАВЕЕ, т.е. точку с координатой (Xn,Yi) - если нашли, то определяем длину (она же площадь) полученного отрезка Si=Xn-Xj+1, затем продолжаем искать в той же строке очередную точку и т.д. в конечном итоге в строке y мы можем найти 1 или более отрезков по 2 точки, либо только 1 точку, либо ни одной. сумма длин всех отрезков (для одной точки длина 1) и будет площадью "сечения" кляксы в этой строке дисплея. затем повторяем для всех остальных строк, суммируя площади сечений - получаем площадь кляксы в пикселах. затем умножаем на площадь пиксела - и вуаля! имеем площадь кляксы.
алгоритм в сущности примитивнейший. если анализировать только массив точек контура кляксы (определенно, для каждой точки с координатой (Xj, Yi) обязательно должна найтись парная ей (Xn,Yi), раз фигура замкнутая), то будет даже очень нересурсоемко. но и в исходном варианте алгоритм не сильно требователен к ресурсам...
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Oct 24 2013, 11:18
|
Знающий
   
Группа: Свой
Сообщений: 518
Регистрация: 12-04-07
Из: Санкт-Петербург
Пользователь №: 26 997

|
Цитата(ARV @ Oct 24 2013, 14:50)  по-моему, все гораздо проще. Да, хороший целочисленный вариант и ни одного умножения. Единственная загвоздка - а точно ли даны все точки контурной линии? Если для какого-то значения Y точка пропущена, мало ли вдруг, то контур придется аппроксимировать прямой и начинать вычисления. Даже более того. Предположим, для какого-то Y вы нашли три точки X: 5, 10, 50. Как определить, это однопиксельное касание в точке 5 и отрезок длинной 40, или отрезок длиной 5 и однопиксельное касание в точке 50? Или вообще три касания?
|
|
|
|
|
Oct 24 2013, 12:23
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Цитата(RHnd @ Oct 24 2013, 15:18)  Да, хороший целочисленный вариант и ни одного умножения. Единственная загвоздка - а точно ли даны все точки контурной линии? Если для какого-то значения Y точка пропущена, мало ли вдруг, то контур придется аппроксимировать прямой и начинать вычисления.
Даже более того. Предположим, для какого-то Y вы нашли три точки X: 5, 10, 50. Как определить, это однопиксельное касание в точке 5 и отрезок длинной 40, или отрезок длиной 5 и однопиксельное касание в точке 50? Или вообще три касания? да, по мере обдумывания сложность задачи возрастает  однако, по мере обдумывания и решения находятся так же. отличить касания можно путем сравнения с предыдущей или последующей строкой - если в текущей строке есть касание, то в следующей вблизи этой координаты либо останется одна точка, либо появится 2 или более. в любом случае, начальный импульс для раздумий задан  P.S. что ВСЕ точки даны - это исходное условие. если не все - надо сначала достроить контур.
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Oct 24 2013, 13:26
|
Знающий
   
Группа: Свой
Сообщений: 518
Регистрация: 12-04-07
Из: Санкт-Петербург
Пользователь №: 26 997

|
Цитата(Tarbal @ Oct 24 2013, 17:20)  Тогда и заливка цветом не поможет. Конечно. Я об этом и написал в 7-ом сообщении.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|