Russian Qt Forum
Апрель 29, 2024, 08:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: QPolygonF - сжатие (inflate)  (Прочитано 24685 раз)
alexis031182
Гость
« Ответ #15 : Март 04, 2013, 12:01 »

На простом полигоне это работает. Я просто добавил свой полигон в Ваш код. Взгляните.
Записан
alexis031182
Гость
« Ответ #16 : Март 04, 2013, 12:15 »

С помощью функции во вложении я получил результат как на скриншоте. Но есть проблема, что получаются "петли" в узких местах полигона (отметил красным) и соприкосновение линий "сжатого" полигона с полигоном-источником (отметил зелёным). Вторая проблема менее критична, а вот первая надо как-то устранить, но не могу придумать как.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Март 04, 2013, 13:12 »

На простом полигоне это работает. Я просто добавил свой полигон в Ваш код. Взгляните.
Ну так у Вас длины отрезков примерно 1.0, а величина выдавливания 20 - конечно перехлестнет. Используйте разумную амплитуду - напр 0.5

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

По поводу возможных само-пересечений. Это типовая проблема если исходная поли-линия слишком "зубатая" и/или амплитуда слишком велика. Пока на Ваших картинках такого не видел. Чаще всего эту проблему "никак не решают" (т.е. отдают на откуп пользователю считая что он задаст разумные значения). По-настоящему хорошего/нормального решения там нет, надо так или иначе латать. Это можно долго обсуждать, но сначала давайте разберемся чего не хватает и откуда перехлесты.
Записан
alexis031182
Гость
« Ответ #18 : Март 04, 2013, 13:38 »

Ну так у Вас длины отрезков примерно 1.0, а величина выдавливания 20 - конечно перехлестнет. Используйте разумную амплитуду - напр 0.5
Да, точно, Вы правы, использовал неподходящую амплитуду. Отрисовало также как у меня.

Вникнуть в текст (засоренный модными итераторами) трудновато.
QVectorIterator, что в нём модного? С итераторами очень удобно, если индексы особо не нужны.

Покажите исходную одним цветом а построенный контур другим - и будет ясно
Нарисовал. Чёрный цвет - исходный полигон. Красный - "сжатый". Видна петля у красного контура в нижней части изображения с левой стороны.

По поводу возможных само-пересечений. Это типовая проблема если исходная поли-линия слишком "зубатая" и/или амплитуда слишком велика.
Мне нужно избавиться от точек в сжатом полигоне, которые образуют петлю. Точки будут основой для вывода текста. И соответственно, если оставить петли, то текст будет выводиться и по точкам этих петель. Получается очень не красиво.

Пока на Ваших картинках такого не видел.
Ну как же. На всех скриншотах я жирным маркером красного цвета обвёл места, где петли выводятся.

Чаще всего эту проблему "никак не решают" (т.е. отдают на откуп пользователю считая что он задаст разумные значения). По-настоящему хорошего/нормального решения там нет, надо так или иначе латать. Это можно долго обсуждать, но сначала давайте разберемся чего не хватает и откуда перехлесты.
Перехлёсты (петли) получаются в узких местах полигона, когда вектор нормали (или как его правильно назвать) получается длиннее чем половина ширины узкого места полигона. Тут наверное надо как-то определять ширину узкого места, чтобы выводить точки для сжатого полигона на расстоянии от исходной, вычисляемого по коэффициенту, а не на основе постоянной величины. Либо найти способ, как удалить точки петель, скажем, вторым каким-нибудь проходом по точкам сжатого полигона. Я пробовал добавлять метод вырезания точек, расстояние между которыми меньше задаваемого минимума. Часть точек петли конечно вырезается, но опять же не все.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Март 04, 2013, 13:50 »

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

- "пропускать" такие места, красный будет гладким но потеряет детали
- автоматычно сужать размер "дорожки"
- Ваш вариант?
Записан
alexis031182
Гость
« Ответ #20 : Март 04, 2013, 13:54 »

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

- "пропускать" такие места, красный будет гладким но потеряет детали
- автоматычно сужать размер "дорожки"
- Ваш вариант?
Если не влезает, то однозначно резать, то есть пропускать. Нужно как-то определять, что если "ссуженный" контур в этом месте не получается, то и нафиг оно надо, едем дальше, не заходя в узкую область.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #21 : Март 04, 2013, 14:06 »

Если не влезает, то однозначно резать, то есть пропускать. Нужно как-то определять, что если "ссуженный" контур в этом месте не получается, то и нафиг оно надо, едем дальше, не заходя в узкую область.
Ну резать так резать Улыбающийся Можно напр сделать метод "удалить само-пересечения", потом (если понадобится) подгладить эти места. Тут надо (немного) подумать, до завтра сделаю
Записан
alexis031182
Гость
« Ответ #22 : Март 04, 2013, 14:17 »

Ну резать так резать Улыбающийся Можно напр сделать метод "удалить само-пересечения", потом (если понадобится) подгладить эти места. Тут надо (немного) подумать, до завтра сделаю
Хм... спасибо большое! Я над этим уже три дня бьюсь. Единственное, что смог придумать - это выполнять свою offset-функцию совместно с функцией вырезания точек по минимально допустимой длине линии в несколько итераций. Но с каждой такой итерацией сжатый полигон естественно всё больше сужается и "огрубляется" (меньше следует форме исходного полигона). Да, петли удаляются полностью, но конечный результат "не вставляет", т.к. у меня есть совсем уж аляпистые полигоны, у которых узкие и широкие области могут понескольку раз перемежаться.

P.S. Контуры берутся из векторного SVG изображения, которое в свою очередь создаётся векторным редактором из растровой картинки.
Записан
alexis031182
Гость
« Ответ #23 : Март 04, 2013, 22:56 »

Igors, подскажите хоть суть метода "удалить само-пересечения". Каким образом это можно сделать?
Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #24 : Март 05, 2013, 00:23 »

Но с каждой такой итерацией сжатый полигон естественно всё больше сужается и "огрубляется" (меньше следует форме исходного полигона). Да, петли удаляются полностью, но конечный результат "не вставляет", т.к. у меня есть совсем уж аляпистые полигоны, у которых узкие и широкие области могут понескольку раз перемежаться.
А что вы хотите делать с отделяющимися и исчезающими островками вроде таких:

?
« Последнее редактирование: Март 05, 2013, 00:26 от kamre » Записан
alexis031182
Гость
« Ответ #25 : Март 05, 2013, 00:41 »

Круто! А как Вы так сделали?! Островки оставить конечно, я их отдельным полигоном оформлю. Поделитесь, если не жалко алгоритмом.
Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #26 : Март 05, 2013, 10:37 »

Круто! А как Вы так сделали?! Островки оставить конечно, я их отдельным полигоном оформлю. Поделитесь, если не жалко алгоритмом.
Это коллеги по работе в проекте реализовывали вычисление offset, нужно было для того, чтобы определять места, куда можно поставить круглые присоски при поднятии детали, вырезанной из листового материала. А я просто взял ваш полигон и запустил на нем вычисление offset с разной величиной.

Проект не open source, так что кодом поделиться не могу. А алгоритм брали и реализовывали по статьям вроде этой и других, которые ищутся в google.

Так что предлагаю подождать решение от Igors, интересно будет посмотреть на выбранный им алгоритм...
« Последнее редактирование: Март 05, 2013, 10:41 от kamre » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #27 : Март 05, 2013, 10:46 »

[Так что предлагаю подождать решение от Igors, интересно будет посмотреть на выбранный им алгоритм...
Делаю, скоро будет  Улыбающийся
Записан
alexis031182
Гость
« Ответ #28 : Март 05, 2013, 15:14 »

Нашёл в инете на C# (или типа того, их хрен разберёшь) пример. Переписал на C++, но тоже самое - петли в узких местах. Хоть сам полезай в оную ))
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #29 : Март 05, 2013, 16:23 »

Хоть сам полезай в оную ))
Цитировать
Держитесь, помощь идет
(из послания к окруженной в Сталинграде армии)

Ну в общем сделал (аттач). Довольно трудно, в каких-то случаях остаются "пипсики" которые формально корректны, но конфузят.

Нашёл в инете на C# (или типа того, их хрен разберёшь) пример. Переписал на C++, но тоже самое - петли в узких местах.
Ну да, легко смеяться над глупыми велосипедистами, а припрет - и где же оно, то "готовое решение" которое так экономит время и силы ?  Улыбающийся

Edit: удалил аттач чтобы был только последний (см ниже)
« Последнее редактирование: Март 06, 2013, 00:10 от Igors » Записан
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 22.