Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритм нахождения замкнутых контуров? 
:(
    Опции темы
DarkDragon
  Дата 19.3.2010, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 19.8.2006

Репутация: нет
Всего: 8



Приветствую!

Предположим:
Код

public struct Point
{
    double x, y, z;
}

public class Spline
{
    public List<Point> Points;
}

public List<Spline> Splines; // массив сплайнов (ломанных), в котором нужно осуществлять поиск замкнутых контуров


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

На рисунке показаны линии и случаи когда контур получается замкнутым, а когда нет. Разными цветами помечены разные сплайны, т. е. контур может быть образован набором сплайнов.


Присоединённый файл ( Кол-во скачиваний: 68 )
Присоединённый файл  kontr.JPG 13,75 Kb
PM MAIL   Вверх
Bitter
Дата 19.3.2010, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 4
Всего: 27



DarkDragon, ты ж как-то сумел определить замкнутые они или нет. попробуй словами описать принцип по которому ты определял.
PM MAIL ICQ Skype   Вверх
Earnest
Дата 19.3.2010, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



Вообще-то это задача на графы. При этом, если надо просто определить, есть замкнутые контура или нет, достаточно посчитать число граней (это и есть замкнутый контур) по формуле Эйлера (точно не помню, но что-то там из числа вершин и числа ребер).


--------------------
...
PM   Вверх
DarkDragon
Дата 19.3.2010, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 19.8.2006

Репутация: нет
Всего: 8



Bitter, да вот незнаю как сформулировать это словами :( В голову ничего не приходит, поэтому и нарисовал картинки.

Ну к примеру тот замкнутый четырехугольник по сути имеет 5 точек, 4 - которые нарисованы и одна которая лежит на одной из четырех нарисованных точек, тем самым замыкая контур. В этом случае достаточно проверить начальную и конечную точку, и если их координаты совподают, значить можно сделать вывод что контур замкнут, но как быть когда в одном сплайне образуются множество замкнутых триугольников, четырехугольников или многоугольников (как показано на закрашенном многоугольнике)? А если контур замыкают не один сплайн а несколько (как показано на разоцветном многоугольнике)?



Earnest, мне нужно не просто определить есть ли замкнутые, но и найти все эти точки, чтобы можно было закрасить эти контуры.
PM MAIL   Вверх
maxdiver
Дата 20.3.2010, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



Что-то все мои идеи я сам же и завалил, выжила пока только одна: найти в этом графе фундаментальные циклы, и собственно они и будут искомыми контурами. Попытайтесь вы завалить smile
PM MAIL WWW ICQ   Вверх
Earnest
Дата 22.3.2010, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



maxdiver, для произвольного графа фокус не пройдет. Дело в том, что грани можно по-разному определять, так что нет однозначности в определении минимальных полигонов. Но если граф эвклидов (т.е. узлы - это эвклидовы точки), то при обходе можно использовать направления ребер. Т.е. начинаем с какого-то узла и идем все время налево (или направо).


--------------------
...
PM   Вверх
maxdiver
Дата 23.3.2010, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



Earnest
Ну фокус в том, что автору-то и не нужны максимальные минимальные, ему надо закрасить их все, а тут казалось бы фундаментальные циклы нам помогают тем, что любой цикл можно выразить через их линейную комбинацию....

А если так обходить, как ты говоришь, то вроде в данном тесте это совсем нас может завести не туда. На рисунке же видно, там в точках пересечения отрезков узлов может не быть. Легко сделать тест такой: квадратик, а из одной вершины выходит отрезок, пересекающий квадрат и выходящий из этого квадрата, и приводящий в другой квадрат. Тогда этот алгоритм, идущий каждый раз влево, будучи запущенным из одного квадрата, в итоге выйдет из этого квадрата и отправится в свободное плавание, которое, кажется, ничем хорошим не завершится...

Это сообщение отредактировал(а) maxdiver - 23.3.2010, 00:30
PM MAIL WWW ICQ   Вверх
Earnest
Дата 24.3.2010, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



Разумеется, в пересечениях узлы быть должны, чтоб мой метод сработал. Такую хрень, как ты описывашь, тоже можно корректно обойти, но сложнее, да и полигон получится самопересеченный. Но лучше уж пересечения посчитать.
Если нужно просто закрасить, то я бы просто выкинула все узлы степени 1 (пока они не кончатся), а потом закрасила бы метод сканирования по горизонтали. Точно так же (ну чуть сложнее) методом сканирования можно и контура собрать. Только тогда все равно потребуются точки пересечения, иначе какой контур... Хотя, с другой стороны, если самопересеченные контура устраивают, небольшое усложнение анализа при сканировании позволит и их собрать.


--------------------
...
PM   Вверх
maxdiver
Дата 24.3.2010, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



Earnest
добавлять новые узлы в пересечениях нельзя, потому что по условию это не засчитывается за пересечение (из картинок видно - там, где в точке пересечения нет узла, там не получился замкнутый контур).

А, вот вторая идея - про выкидывание узлов степени 1, и потом уже обычное закрашивание связных областей, кажется уже верным  (а ведь после удаления узлов степени 1 можно добавлять узлы в точке пересечения).
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0942 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.