Russian Qt Forum
Ноябрь 22, 2024, 19:31
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Программирование
>
Алгоритмы
>
QPolygonF - сжатие (inflate)
Страниц:
1
[
2
]
3
4
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: QPolygonF - сжатие (inflate) (Прочитано 26367 раз)
alexis031182
Гость
Re: QPolygonF - сжатие (inflate)
«
Ответ #15 :
Март 04, 2013, 12:01 »
На простом полигоне это работает. Я просто добавил свой полигон в Ваш код. Взгляните.
Записан
alexis031182
Гость
Re: QPolygonF - сжатие (inflate)
«
Ответ #16 :
Март 04, 2013, 12:15 »
С помощью функции во вложении я получил результат как на скриншоте. Но есть проблема, что получаются "петли" в узких местах полигона (отметил красным) и соприкосновение линий "сжатого" полигона с полигоном-источником (отметил зелёным). Вторая проблема менее критична, а вот первая надо как-то устранить, но не могу придумать как.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QPolygonF - сжатие (inflate)
«
Ответ #17 :
Март 04, 2013, 13:12 »
Цитата: alexis031182 от Март 04, 2013, 12:01
На простом полигоне это работает. Я просто добавил свой полигон в Ваш код. Взгляните.
Ну так у Вас длины отрезков примерно 1.0, а величина выдавливания 20 - конечно перехлестнет. Используйте разумную амплитуду - напр 0.5
Цитата: alexis031182 от Март 04, 2013, 12:15
С помощью функции во вложении я получил результат как на скриншоте. Но есть проблема, что получаются "петли" в узких местах полигона (отметил красным) и соприкосновение линий "сжатого" полигона с полигоном-источником (отметил зелёным). Вторая проблема менее критична, а вот первая надо как-то устранить, но не могу придумать как.
Вникнуть в текст (засоренный модными итераторами) трудновато. Покажите исходную одним цветом а построенный контур другим - и будет ясно
По поводу возможных само-пересечений. Это типовая проблема если исходная поли-линия слишком "зубатая" и/или амплитуда слишком велика. Пока на Ваших картинках такого не видел. Чаще всего эту проблему "никак не решают" (т.е. отдают на откуп пользователю считая что он задаст разумные значения). По-настоящему хорошего/нормального решения там нет, надо так или иначе латать. Это можно долго обсуждать, но сначала давайте разберемся чего не хватает и откуда перехлесты.
Записан
alexis031182
Гость
Re: QPolygonF - сжатие (inflate)
«
Ответ #18 :
Март 04, 2013, 13:38 »
Цитата: Igors от Март 04, 2013, 13:12
Ну так у Вас длины отрезков примерно 1.0, а величина выдавливания 20 - конечно перехлестнет. Используйте разумную амплитуду - напр 0.5
Да, точно, Вы правы, использовал неподходящую амплитуду. Отрисовало также как у меня.
Цитата: Igors от Март 04, 2013, 13:12
Вникнуть в текст (засоренный модными итераторами) трудновато.
QVectorIterator, что в нём модного? С итераторами очень удобно, если индексы особо не нужны.
Цитата: Igors от Март 04, 2013, 13:12
Покажите исходную одним цветом а построенный контур другим - и будет ясно
Нарисовал. Чёрный цвет - исходный полигон. Красный - "сжатый". Видна петля у красного контура в нижней части изображения с левой стороны.
Цитата: Igors от Март 04, 2013, 13:12
По поводу возможных само-пересечений. Это типовая проблема если исходная поли-линия слишком "зубатая" и/или амплитуда слишком велика.
Мне нужно избавиться от точек в сжатом полигоне, которые образуют петлю. Точки будут основой для вывода текста. И соответственно, если оставить петли, то текст будет выводиться и по точкам этих петель. Получается очень не красиво.
Цитата: Igors от Март 04, 2013, 13:12
Пока на Ваших картинках такого не видел.
Ну как же. На всех скриншотах я жирным маркером красного цвета обвёл места, где петли выводятся.
Цитата: Igors от Март 04, 2013, 13:12
Чаще всего эту проблему "никак не решают" (т.е. отдают на откуп пользователю считая что он задаст разумные значения). По-настоящему хорошего/нормального решения там нет, надо так или иначе латать. Это можно долго обсуждать, но сначала давайте разберемся чего не хватает и откуда перехлесты.
Перехлёсты (петли) получаются в узких местах полигона, когда вектор нормали (или как его правильно назвать) получается длиннее чем половина ширины узкого места полигона. Тут наверное надо как-то определять ширину узкого места, чтобы выводить точки для сжатого полигона на расстоянии от исходной, вычисляемого по коэффициенту, а не на основе постоянной величины. Либо найти способ, как удалить точки петель, скажем, вторым каким-нибудь проходом по точкам сжатого полигона. Я пробовал добавлять метод вырезания точек, расстояние между которыми меньше задаваемого минимума. Часть точек петли конечно вырезается, но опять же не все.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QPolygonF - сжатие (inflate)
«
Ответ #19 :
Март 04, 2013, 13:50 »
Определимся с постановкой. Вот место где будет перехлест (аттач). Очевидно что при достаточной амплитуде повторить контур "справа" просто не удастся, не влезет. Возможные решения
- "пропускать" такие места, красный будет гладким но потеряет детали
- автоматычно сужать размер "дорожки"
- Ваш вариант?
Записан
alexis031182
Гость
Re: QPolygonF - сжатие (inflate)
«
Ответ #20 :
Март 04, 2013, 13:54 »
Цитата: Igors от Март 04, 2013, 13:50
Определимся с постановкой. Вот место где будет перехлест (аттач). Очевидно что при достаточной амплитуде повторить контур "справа" просто не удастся, не влезет. Возможные решения
- "пропускать" такие места, красный будет гладким но потеряет детали
- автоматычно сужать размер "дорожки"
- Ваш вариант?
Если не влезает, то однозначно резать, то есть пропускать. Нужно как-то определять, что если "ссуженный" контур в этом месте не получается, то и нафиг оно надо, едем дальше, не заходя в узкую область.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QPolygonF - сжатие (inflate)
«
Ответ #21 :
Март 04, 2013, 14:06 »
Цитата: alexis031182 от Март 04, 2013, 13:54
Если не влезает, то однозначно резать, то есть пропускать. Нужно как-то определять, что если "ссуженный" контур в этом месте не получается, то и нафиг оно надо, едем дальше, не заходя в узкую область.
Ну резать так резать
Можно напр сделать метод "удалить само-пересечения", потом (если понадобится) подгладить эти места. Тут надо (немного) подумать, до завтра сделаю
Записан
alexis031182
Гость
Re: QPolygonF - сжатие (inflate)
«
Ответ #22 :
Март 04, 2013, 14:17 »
Цитата: Igors от Март 04, 2013, 14:06
Ну резать так резать
Можно напр сделать метод "удалить само-пересечения", потом (если понадобится) подгладить эти места. Тут надо (немного) подумать, до завтра сделаю
Хм... спасибо большое! Я над этим уже три дня бьюсь. Единственное, что смог придумать - это выполнять свою offset-функцию совместно с функцией вырезания точек по минимально допустимой длине линии в несколько итераций. Но с каждой такой итерацией сжатый полигон естественно всё больше сужается и "огрубляется" (меньше следует форме исходного полигона). Да, петли удаляются полностью, но конечный результат "не вставляет", т.к. у меня есть совсем уж аляпистые полигоны, у которых узкие и широкие области могут понескольку раз перемежаться.
P.S. Контуры берутся из векторного SVG изображения, которое в свою очередь создаётся векторным редактором из растровой картинки.
Записан
alexis031182
Гость
Re: QPolygonF - сжатие (inflate)
«
Ответ #23 :
Март 04, 2013, 22:56 »
Igors
, подскажите хоть суть метода "удалить само-пересечения". Каким образом это можно сделать?
Записан
kamre
Частый гость
Offline
Сообщений: 233
Re: QPolygonF - сжатие (inflate)
«
Ответ #24 :
Март 05, 2013, 00:23 »
Цитата: alexis031182 от Март 04, 2013, 14:17
Но с каждой такой итерацией сжатый полигон естественно всё больше сужается и "огрубляется" (меньше следует форме исходного полигона). Да, петли удаляются полностью, но конечный результат "не вставляет", т.к. у меня есть совсем уж аляпистые полигоны, у которых узкие и широкие области могут понескольку раз перемежаться.
А что вы хотите делать с отделяющимися и исчезающими островками вроде таких:
?
«
Последнее редактирование: Март 05, 2013, 00:26 от kamre
»
Записан
alexis031182
Гость
Re: QPolygonF - сжатие (inflate)
«
Ответ #25 :
Март 05, 2013, 00:41 »
Круто! А как Вы так сделали?! Островки оставить конечно, я их отдельным полигоном оформлю. Поделитесь, если не жалко алгоритмом.
Записан
kamre
Частый гость
Offline
Сообщений: 233
Re: QPolygonF - сжатие (inflate)
«
Ответ #26 :
Март 05, 2013, 10:37 »
Цитата: alexis031182 от Март 05, 2013, 00:41
Круто! А как Вы так сделали?! Островки оставить конечно, я их отдельным полигоном оформлю. Поделитесь, если не жалко алгоритмом.
Это коллеги по работе в проекте реализовывали вычисление offset, нужно было для того, чтобы определять места, куда можно поставить круглые присоски при поднятии детали, вырезанной из листового материала. А я просто взял ваш полигон и запустил на нем вычисление offset с разной величиной.
Проект не open source, так что кодом поделиться не могу. А алгоритм брали и реализовывали по статьям вроде
этой
и других, которые ищутся в google.
Так что предлагаю подождать решение от
Igors
, интересно будет посмотреть на выбранный им алгоритм...
«
Последнее редактирование: Март 05, 2013, 10:41 от kamre
»
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QPolygonF - сжатие (inflate)
«
Ответ #27 :
Март 05, 2013, 10:46 »
Цитата: kamre от Март 05, 2013, 10:37
[Так что предлагаю подождать решение от
Igors
, интересно будет посмотреть на выбранный им алгоритм...
Делаю, скоро будет
Записан
alexis031182
Гость
Re: QPolygonF - сжатие (inflate)
«
Ответ #28 :
Март 05, 2013, 15:14 »
Нашёл в инете на C# (или типа того, их хрен разберёшь) пример. Переписал на C++, но тоже самое - петли в узких местах. Хоть сам полезай в оную ))
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QPolygonF - сжатие (inflate)
«
Ответ #29 :
Март 05, 2013, 16:23 »
Цитата: alexis031182 от Март 05, 2013, 15:14
Хоть сам полезай в оную ))
Цитировать
Держитесь, помощь идет
(из послания к окруженной в Сталинграде армии)
Ну в общем сделал (аттач). Довольно трудно, в каких-то случаях остаются "пипсики" которые формально корректны, но конфузят.
Цитата: alexis031182 от Март 05, 2013, 15:14
Нашёл в инете на C# (или типа того, их хрен разберёшь) пример. Переписал на C++, но тоже самое - петли в узких местах.
Ну да, легко смеяться над глупыми велосипедистами, а припрет - и где же оно, то "готовое решение" которое так экономит время и силы ?
Edit: удалил аттач чтобы был только последний (см ниже)
«
Последнее редактирование: Март 06, 2013, 00:10 от Igors
»
Записан
Страниц:
1
[
2
]
3
4
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...