Найти количество точек лежащих внутри 2D фигуры
От: m1st  
Дата: 15.11.14 07:44
Оценка:
Условие задачи:


Подскажите, куда копать?

Уточнения:
    Фигура может начинаться из любой точки (не обязательно из x = 1 и y = 1).
    Вид фигур (треугольник, прямоугольник и тд.) неизвестен.
    Фигуры не имеют самопересечений/дыр, только 1 внутренняя область.
    Положительные целые числа координат могут использоваться чтобы заключить, что входные данные неверны.
    4/8-соединение — на Ваше усмотрение (описать выбор в ту или иную пользу).
    Строгих ограничений по времени и памяти нет.
Отредактировано 19.11.2014 0:38 m1st . Предыдущая версия .
Re: Найти количество точек лежащих внутри 2D фигуры
От: Mr WeL Россия  
Дата: 15.11.14 13:16
Оценка:
Здравствуйте, m1st, Вы писали:

M>Условие задачи:

M>Image: 11.15.2014-10.32.png

M>Подскажите, куда копать?


Cоставить уравнение прямой проходящей через две точки.

ax + by + c = 0

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

берем точки (x1, y1) (x2, y2) (x3, y3) (x4, y4) (x1, y1)

и составляешь 4 прямые:

p1(x,y): (x1,y1)(x2,y2)
p2(x,y): (x2,y2)(x3,y3)
p3(x,y): (x3,y3)(x4,y4)
p4(x,y): (x4,y4)(x1,y1)

для точек лежащих внутри 2д фигуры, значение всех выражение pi (i=1..4) будет одного знака
Re[2]: Найти количество точек лежащих внутри 2D фигуры
От: Lexey Россия  
Дата: 17.11.14 08:28
Оценка:
Здравствуйте, Mr WeL, Вы писали:

MW>для точек лежащих внутри 2д фигуры, значение всех выражение pi (i=1..4) будет одного знака


Только для выпуклых многоугольников. И только при "правильном" выборе направлений прямых (направлений ортогональных векторов внутрь).
Для невыпуклых фигур так не получится.
Re: Найти количество точек лежащих внутри 2D фигуры
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 17.11.14 10:27
Оценка:
Здравствуйте, m1st, Вы писали:

M>Подскажите, куда копать?


В общих чертах:
0. Представить, что ты работаешь с чёрным изображением. То есть значение всех точек равно 0.
1. Значению всех точек контура присвоить 1.
2. Любым методом найти хотя бы одну точку, лежащую внутри контура. Пометить её 2.
3. Рекурсивно помечать 2 все лежащие рядом точки, которые не являются контуром.
4. Посчитать количество двоек на изображении.

Можно обратный метод, который, возможно, будет быстрей. Пометить двойкой любую НЕ лежащую внутри контура точку и произвести рекурсивную закраску двойками внешней области. После считать число нулевых точек.
Отредактировано 17.11.2014 10:30 Nuzhny . Предыдущая версия .
Re: Найти количество точек лежащих внутри 2D фигуры
От: andyp  
Дата: 17.11.14 10:58
Оценка:
Здравствуйте, m1st, Вы писали:

  Условие
M>Условие задачи:
M>Image: 11.15.2014-10.32.png


M>Подскажите, куда копать?


Разбивать на треугольники
http://grafika.me/node/12

Проверять, что является внутренней для найденного треугольника.

PS Не понял, что функция возвращать должна.

собственно, вот и решение на Java
http://grafika.me/node/175
Отредактировано 17.11.2014 11:41 andyp . Предыдущая версия .
Re: Найти количество точек лежащих внутри 2D фигуры
От: Muxa  
Дата: 17.11.14 11:09
Оценка:
M>Подскажите, куда копать?
1. Берешь две соседние точки на контуре.
2. Выбираешь произвольное направление.
3. Определяешь справа или слева (в соотв. с выбранным направлением) лежит заданная внутренняя точка относительно прямой, соединяющей эти две точки на контуре.
4. Идешь по контуру в выбранном направлении и считаешь-помечаешь точки с той стороны, с которой лежит заданная внутренняя точка.
5. Повторяешь пп. 1 и 4 для нового контура из только что помеченных точек пока не останется точек внутри контура.
Отредактировано 17.11.2014 11:12 Muxa . Предыдущая версия . Еще …
Отредактировано 17.11.2014 11:11 Muxa . Предыдущая версия .
Re: Найти количество точек лежащих внутри 2D фигуры
От: watchmaker  
Дата: 17.11.14 11:21
Оценка: +1
Здравствуйте, m1st, Вы писали:


M>Подскажите, куда копать?


Наивное решение — floodfill.
Быстрое решение — через ориентированную площадь, наименьший общий делитель и теорему Пика.

Если линейный размер исходного многоугольника принять равным D, то временная сложность floodfill (и прочих модификаций, уже предложенные в этой теме) будет Ω(ND+D²), а сложность с использованием теоремы Пика — O(NlogD) времени и O(1) памяти.
Отредактировано 17.11.2014 14:17 watchmaker . Предыдущая версия . Еще …
Отредактировано 17.11.2014 14:16 watchmaker . Предыдущая версия .
Re: Найти количество точек лежащих внутри 2D фигуры
От: Географ Россия нет
Дата: 17.11.14 11:33
Оценка:
Здравствуйте, m1st, Вы писали:

M>Условие задачи:

M>Image: 11.15.2014-10.32.png

M>Подскажите, куда копать?


Судя по всему, эта задача — по мотивам древних ДОС'овских времён, когда все полигоны рисовались только на растрах. На это указывает наличие внутренней точки в задании.

В данном случае логично будет взять любой метод заливки растрового полигона, ограниченного пикселами заданного цвета, начиная от указанной точки. Попадёт точка снаружи полигона — зальётся всё окружающее пространство, кроме полигона, попадёт внутрь — зальётся внутренняя полость. Отслеживать уже залитые пикселы (их число), думаю, особых трудностей не представит. Найти алгоритм заливки растрового полигона по внутренней точке — тоже.

Можно начать отсюда: http://yandex.ru/yandsearch?text=%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%20%D0%B7%D0%B0%D0%BB%D0%B8%D0%B2%D0%BA%D0%B8%20%D1%80%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE%20%D0%BF%D0%BE%D0%BB%D0%B8%D0%B3%D0%BE%D0%BD%D0%B0%20%D0%BF%D0%BE%20%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B5%D0%BD%D0%BD%D0%B5%D0%B9%20%D1%82%D0%BE%D1%87%D0%BA%D0%B5&clid=1909644&lr=213&csg=1759%2C5682%2C56%2C28%2C0%2C0%2C0 , глаз остановился тут: http://algolist.manual.ru/graphics/fill.php .

P.S. Лет 30 назад этим бредили по ночам серьёзные разработчики важных машин с дисплейными процессорами, обрабатывавшими полный телевизионный кадр за 1 такт видеопотока :o)
Re: Найти количество точек лежащих внутри 2D фигуры
От: m1st  
Дата: 19.11.14 00:40
Оценка:
Добавил в шапку:

Уточнения:

    Фигура может начинаться из любой точки (не обязательно из x = 1 и y = 1).
    Вид фигур (треугольник, прямоугольник и тд.) неизвестен.
    Фигуры не имеют самопересечений/дыр, только 1 внутренняя область.
    Положительные целые числа координат могут использоваться чтобы заключить, что входные данные неверны.
    4/8-соединение — на Ваше усмотрение (описать выбор в ту или иную пользу).
    Строгих ограничений по времени и памяти нет.

Re[2]: Найти количество точек лежащих внутри 2D фигуры
От: m1st  
Дата: 19.11.14 00:58
Оценка:
Здравствуйте, andyp, Вы писали:
A>PS Не понял, что функция возвращать должна.
Функция должна возвращать кол-во пикселей(точек), которые лежат внутри 2D фигуры.

A>собственно, вот и решение на Java

A>http://grafika.me/node/175
Это решение на "HTML + JavaScript"
Re[2]: Найти количество точек лежащих внутри 2D фигуры
От: m1st  
Дата: 19.11.14 01:05
Оценка:
Здравствуйте, Nuzhny, Вы писали:
N>2. Любым методом найти хотя бы одну точку, лежащую внутри контура. Пометить её 2.
В условии нам дается точка, которая лежит внутри контура.

N>Можно обратный метод, который, возможно, будет быстрей. Пометить двойкой любую НЕ лежащую внутри контура точку и произвести рекурсивную закраску двойками внешней области. После считать число нулевых точек.

Для 2х приведенных примеров фигур такой метод явно будет не быстрее.
Re[2]: Найти количество точек лежащих внутри 2D фигуры
От: m1st  
Дата: 19.11.14 01:09
Оценка:
Здравствуйте, Muxa, Вы писали:
M>1. Берешь две соседние точки на контуре.
M>2. Выбираешь произвольное направление.
M>3. Определяешь справа или слева (в соотв. с выбранным направлением) лежит заданная внутренняя точка относительно прямой, соединяющей эти две точки на контуре.
M>4. Идешь по контуру в выбранном направлении и считаешь-помечаешь точки с той стороны, с которой лежит заданная внутренняя точка.
M>5. Повторяешь пп. 1 и 4 для нового контура из только что помеченных точек пока не останется точек внутри контура.
Спасибо. Проще говоря — "Flood fill".
Отредактировано 19.11.2014 1:09 m1st . Предыдущая версия .
Re[2]: Найти количество точек лежащих внутри 2D фигуры
От: m1st  
Дата: 19.11.14 01:14
Оценка:
Здравствуйте, watchmaker, Вы писали:
W>Быстрое решение — через ориентированную площадь, наименьший общий делитель и теорему Пика.
Можно подробнее?

Формула Пика (или теорема Пика) — классический результат комбинаторной геометрии и геометрии чисел.
Площадь многоугольника с целочисленными вершинами[1] равна
В + Г/2 − 1,
где В есть количество целочисленных точек внутри многоугольника, а Г — количество целочисленных точек на границе многоугольника.
1. Точка координатной плоскости называется целочисленной, если обе её координаты целые.

Отредактировано 19.11.2014 1:17 m1st . Предыдущая версия .
Re[2]: Найти количество точек лежащих внутри 2D фигуры
От: m1st  
Дата: 19.11.14 01:27
Оценка:
Здравствуйте, Географ, Вы писали:
Г>P.S. Лет 30 назад этим бредили по ночам серьёзные разработчики важных машин с дисплейными процессорами, обрабатывавшими полный телевизионный кадр за 1 такт видеопотока :o)
Как раз отметим? 30 лет первой Mac OS — которая хранит координаты во float. ж)
Re[3]: Найти количество точек лежащих внутри 2D фигуры
От: watchmaker  
Дата: 19.11.14 01:37
Оценка:
Здравствуйте, m1st, Вы писали:

M>Здравствуйте, watchmaker, Вы писали:

W>>Быстрое решение — через ориентированную площадь, наименьший общий делитель и теорему Пика.
M>Можно подробнее?
А что именно не ясно?
Есть равенство В + Г/2 − 1 = П. В нём В — это что тебе по условию задачи требуется найти. Если перенести слагаемые из одной части уравнения в другую, то получится В = -Г/2 + 1 + П — собственно всё, осталось только сложить три числа :)
Ориентированная площадь считается за один проход по точкам. Обычная площадь — её модуль.
Число точек на границе считается для каждого отрезка, коих N, например, алгоритмом Евклида. Что, если сильно не повезёт, в худшем случае будет работать за логарифмическое время от его длины.
Re[4]: Найти количество точек лежащих внутри 2D фигуры
От: m1st  
Дата: 19.11.14 02:23
Оценка:
Здравствуйте, watchmaker, Вы писали:
W>Есть равенство В + Г/2 − 1 = П. В нём В — это что тебе по условию задачи требуется найти. Если перенести слагаемые из одной части уравнения в другую, то получится В = -Г/2 + 1 + П — собственно всё, осталось только сложить три числа
W>Ориентированная площадь считается за один проход по точкам. Обычная площадь — её модуль.
W>Число точек на границе считается для каждого отрезка, коих N, например, алгоритмом Евклида. Что, если сильно не повезёт, в худшем случае будет работать за логарифмическое время от его длины.
Спасибо!
Как я понимаю, "Число точек на границе" можно не вычислять, т.к. нам уже даны все координаты, которые полностью описывают границы фигуры.
Re[3]: Найти количество точек лежащих внутри 2D фигуры
От: andyp  
Дата: 19.11.14 08:22
Оценка:
Здравствуйте, m1st, Вы писали:

A>>собственно, вот и решение на Java

A>>http://grafika.me/node/175
M>Это решение на "HTML + JavaScript"

Точно. Я просто посмотрел, что программа есть.

Что-то меня переклинило, что требуется определить, является ли точка внутренней.

Поршу прощения, если ввел в заблуждение.
Отредактировано 19.11.2014 8:29 andyp . Предыдущая версия .
Re[5]: Найти количество точек лежащих внутри 2D фигуры
От: watchmaker  
Дата: 19.11.14 12:58
Оценка:
Здравствуйте, m1st, Вы писали:

M>Как я понимаю, "Число точек на границе" можно не вычислять, т.к. нам уже даны все координаты, которые полностью описывают границы фигуры.

Ах, точно, я невнимательно прочитал условие. Предыдущее решение основывалось на предположении, что входные точки являются вершинами многоугольника, очерчивающего контур интересующей области. Соответственно в этом случае между двумя вершинами может лежать более нуля целочисленных точек.
Впрочем в варианте где даны сразу точки контура их всё равно нужно как-то отфильтровать, например чтобы исключить из них точки не принадлежащие периметру ограниченной области (если во входных данных не запрещён случай толстой границы). В общем в такой постановке задача получается чуть сложнее, так как если входные точки неупорядочены, то сначала нужно сделать ещё один шаг, который соберёт из них какой-то контур. Хотя всё равно этот шаг можно сделать быстрее чем в floodfill, ограничившись исследованиями только периметра, а не всей площади внутренней области. Ну а далее можно либо сразу свести задачу к предыдущей, либо пообъединять алгоритмы чтобы выкинуть всякие проверки невозможных теперь случаев.
Отредактировано 19.11.2014 17:41 watchmaker . Предыдущая версия .
Re[2]: Найти количество точек лежащих внутри 2D фигуры
От: m1st  
Дата: 24.11.14 23:50
Оценка:
Здравствуйте, andyp, Вы писали:
A>Разбивать на треугольники
A>http://grafika.me/node/12
и окружность?
Re[3]: Найти количество точек лежащих внутри 2D фигуры
От: m1st  
Дата: 25.11.14 00:01
Оценка:
Что думаете насчет http://en.wikipedia.org/wiki/Depth-first_search ?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.