Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: подсчитать площадь кляксы
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Математика и Физика
sergey sva
Подскажите пожалуйста как подсчитать площадь кляксы? Площадь круга понятно как считать, а если это что то типа кляксы значение получено из ацп по всему периметру, цифры от 0 до 4096.
RHnd
Вообще площадь произвольной замкнутой несамопересекающейся фигуры на плоскости можно считать методом трапеций. Но лично мне не совсем ясна задача - что значит "значение получено из ацп по всему периметру"? Это какая-то фигура на плоскости или что?
sergey sva
Вот на таком примере: лежит экран сенсорный и на нем провели какой то рисунок замкнутый получили координаторы xy как теперь подсчитать площадь?
Xenia
Цитата(sergey sva @ Oct 22 2013, 18:48) *
Вот на таком примере: лежит экран сенсорный и на нем провели какой то рисунок замкнутый получили координаторы xy как теперь подсчитать площадь?


Залейте контур изнутри белым цветом (0xFF), а снаружи черным (0х00). А потом посуммируйте интенсивности всех точек на экране.
sergey sva
Это если известно разрешение экрана, а если нет, и нужно подсчитать площадь этого контура в кв мм ?

Да разрешение не известно, но к значением ацп могу привязать например 0 = 0мм а 4096 = 500мм но это длина, как теперь из массива x[n] и y[n] определить площадь?
cant
произвольную фигуру проще всего так, как описала Xenia. только нормировку сделать по размерам и все
RHnd
Заливать всю площадь и считать интенсивность это обалдеть как ресурсозатратно. Одна только заливка произвольной фигуры чего стоит. Тогда уж проще прямо в процессе заливки и посчитать, скольким точкам был присвоен цвет заливки и помножить на площадь пикселя.

Для вашей задачи неплохим, как мне кажется, решением будет именно метод трапеций, о котором я говорил в начале. Точки у вас, как я понимаю, заданы в порядке обхода. Каждые две точки соединяются прямой, т.е. фигура описывается многоугольником. Затем, начиная с некоторой точки, считаем площадь прямоугольной трапеции, заданной вершинами (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 может быть как положительным, так и отрицательным.
_Pasha
Polygon triangulation
Палыч
Цитата(sergey sva @ Oct 22 2013, 17:57) *
Подскажите пожалуйста как подсчитать площадь кляксы?

Площадь будет равна сумме ориентированных площадей треугольников, образованных из следующих точек: любая точка плоскости (абсолютно любая, хоть 0,0), пара соседних точек из множества контура, ограничивающего "кляксу". Обходим контур в определенном направлении - считаем ориентированную площадь треугольников - модуль суммы площадей = искомая площадь. Трудность (и то - небольшая) в определении ориентации треугольника - т.е. в определении положения третьей точки относительно прямой, проходящей через первые две...
Fat Robot
Классическая задача для интегрирования методом Монте-Карло. Грубо:

Пусть клякса нарисована на листе с известной площадью.
Кидаем на лист горсть копеечных монет.
Подсчитываем количество монет на всем листе и на кляксе.
Отношение числа монет в пределе равно отношению площадей.

Задача "Point in polygon" решается не сложно.

Всё. Раздаем монеты нищим.
Xenia
Цитата(Fat Robot @ Oct 22 2013, 23:58) *
Классическая задача для интегрирования методом Монте-Карло. Грубо:

Пусть клякса нарисована на листе с известной площадью.
Кидаем на лист горсть копеечных монет.
Подсчитываем количество монет на всем листе и на кляксе.
Отношение числа монет в пределе равно отношению площадей.

Так он же не может определить, внутри кляксы точка или снаружи! Дорого это занятие для него. А если бы легко определялось, то залить кляксу краской и дело с концом sm.gif. Тем паче, что быстрее все точки на том дисплее по очереди перебрать, чем Монте-Карла заводить.
Fat Robot
Залить и перебрать. это подход.

Всё зависит от точности, с которой нужно получить эту площадь. Этим метод и прекрасен. Можно оценку уточнять с течением времени. Можно, оценивая сходимость, решать, нужно ли продолжать вычисления.
В качестве начальной оценки (лист для кляксы в моем примере) взять описанный прямоугольник.

Цитата(Xenia @ Oct 23 2013, 00:43) *
Так он же не может определить, внутри кляксы точка или снаружи! Дорого это занятие для него. А если бы легко определялось, то залить кляксу краской и дело с концом. Тем паче, что быстрее все точки на том дисплее по очереди перебрать, чем Монте-Карла заводить.

RHnd
Подождите, а как вы предлагаете реализовывать заливку, не определяя, внутри фигуры точка или нет?
Предложили два аналитических метода - по трапециям и по ориентированным треуголькам. Зачем накручивать более ресурсоемкие, и медленные методы подсчета точек?
megajohn
Цитата(RHnd @ Oct 24 2013, 13:10) *
Зачем накручивать более ресурсоемкие, и медленные методы подсчета точек?


можно еще проще: да взять и поставить резистор в цепь питания сенсора и смотреть ток =)
RHnd
Цитата(megajohn @ Oct 24 2013, 13:18) *
можно еще проще: да взять и поставить резистор в цепь питания сенсора и смотреть ток =)


Здорово. И что вы увидете?
megajohn
Цитата(RHnd @ Oct 24 2013, 13:55) *
Здорово. И что вы увидете?

В зависимости от типа дисплея. И вообще, так пошутил
ARV
по-моему, все гораздо проще.
фигура нарисована на координатной плоскости, т.е. по сути известны целочисленные координаты каждой точки линии, ограничивающей ее контур, и сама площадь в пикселах будет только целочисленной, поэтому никакой тригонометрии и прочей плавающей точки в вычислениях!
итак, начинаем сканирование от нуля координат дисплея: для каждой строки с координатой Yi ищем точку контура кляксы (Xj,Yi) - если нашли, значит, эту строку дисплея фигура пересекает. найдя такую точку, продолжаем искать парную ей точку ПРАВЕЕ, т.е. точку с координатой (Xn,Yi) - если нашли, то определяем длину (она же площадь) полученного отрезка Si=Xn-Xj+1, затем продолжаем искать в той же строке очередную точку и т.д. в конечном итоге в строке y мы можем найти 1 или более отрезков по 2 точки, либо только 1 точку, либо ни одной. сумма длин всех отрезков (для одной точки длина 1) и будет площадью "сечения" кляксы в этой строке дисплея. затем повторяем для всех остальных строк, суммируя площади сечений - получаем площадь кляксы в пикселах. затем умножаем на площадь пиксела - и вуаля! имеем площадь кляксы.

алгоритм в сущности примитивнейший. если анализировать только массив точек контура кляксы (определенно, для каждой точки с координатой (Xj, Yi) обязательно должна найтись парная ей (Xn,Yi), раз фигура замкнутая), то будет даже очень нересурсоемко. но и в исходном варианте алгоритм не сильно требователен к ресурсам...
RHnd
Цитата(ARV @ Oct 24 2013, 14:50) *
по-моему, все гораздо проще.


Да, хороший целочисленный вариант и ни одного умножения. Единственная загвоздка - а точно ли даны все точки контурной линии? Если для какого-то значения Y точка пропущена, мало ли вдруг, то контур придется аппроксимировать прямой и начинать вычисления.

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

Даже более того. Предположим, для какого-то Y вы нашли три точки X: 5, 10, 50. Как определить, это однопиксельное касание в точке 5 и отрезок длинной 40, или отрезок длиной 5 и однопиксельное касание в точке 50? Или вообще три касания?
да, по мере обдумывания сложность задачи возрастает sm.gif однако, по мере обдумывания и решения находятся так же. отличить касания можно путем сравнения с предыдущей или последующей строкой - если в текущей строке есть касание, то в следующей вблизи этой координаты либо останется одна точка, либо появится 2 или более.

в любом случае, начальный импульс для раздумий задан sm.gif
P.S. что ВСЕ точки даны - это исходное условие. если не все - надо сначала достроить контур.
Tarbal
Цитата(RHnd @ Oct 24 2013, 15:18) *
Единственная загвоздка - а точно ли даны все точки контурной линии? Если для какого-то значения Y точка пропущена, мало ли вдруг, то контур придется аппроксимировать прямой и начинать вычисления.

Даже более того. Предположим, для какого-то Y вы нашли три точки X: 5, 10, 50. Как определить, это однопиксельное касание в точке 5 и отрезок длинной 40, или отрезок длиной 5 и однопиксельное касание в точке 50? Или вообще три касания?


Тогда и заливка цветом не поможет.
Перед измерением площади надо проверить и починить контур.
RHnd
Цитата(Tarbal @ Oct 24 2013, 17:20) *
Тогда и заливка цветом не поможет.

Конечно. Я об этом и написал в 7-ом сообщении.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.