Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,744
1

Node Editor

07.04.2014, 09:32. Показов 942. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте

Тема как бы "на стыке" техники программирования и алгоритмов. Ладно, вот что от меня хотят:

Есть фабрика эффектов (десятка 2) применяющихся к изображению. Можно сказать и "плагин" (вместо "эффект") Задача сделать эффекты селективными, т.е. юзер задает маску (в простейшем случае альфа-канал, хотя есть и др варианты). На первый взгляд все просто: пусть все эффекты выполняются как сейчас, а потом смешали/взвесили результат с исходным по маске. К сожалению, так не выходит. Пример: эффект "вращение". Если мы хотим иметь "половину вращения" то надо уменьшить угол поворота вдвое, но не смешивать с исходным. Юзер хочет видеть бубочку в UI эффекта (рядом с параметром "angle") где он сможет назначить/сменить маску.

Прямолинейное решение: перелопатить все UI и все опции (со всеми вытекающими). Вообще "объект ссылается на объект" (без владения) = всегда геморрой, особенно когда дело доходит до undo. Да, и запросы юзера всегда растут. Вполне вероятно напр "а покажите какие эффекты используют вот эту маску" - и опять у меня тонна работы.

Вот я и подумал - а не делать ли это более капитально? Вроде подходит "Node Editor", ссылок много, есть open-source реализации. Но все это посвящено визуализации (рисованию нодов и связок). А вот как мне организовать данные в расчете на это? Допустим юзер в editor'е сделал connect (или disconnect), мои действия?

С уважением
Игорь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.04.2014, 09:32
Ответы с готовыми решениями:

Direct Editor - наш ответ Яндекс Директ.Коммандеру и Google AdWords.Editor-у
Компания <b>PromoSoft</b> сообщает о выходе альфа-версии десктопного программного продукта...

Реализовать класс Node ([Error] field 'next' has incomplete type 'Node')
#include <iostream> using namespace std; class Node { private: int value; Node next; ...

Не запускается пакет node js - пакетами? npm? сам node? gulp?
Всем доброго времени суток. Есть такая проблема, пытаюсь перебраться на Linux (Ubuntu) Установил...

Cannot find logical node by the specified physical road graph node
Создал перекресток, машины двигаются по двум дорогам в обоих направлениях. Теперь хочу сделать...

14
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,037
07.04.2014, 14:09 2
Подсмотреть как это делают графические редакторы.
Насколько я встречал, если у нас имеет выделенная область - то эффект по умолчанию применяется к области, а не к всему рисунку.

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

Другая проблема - механизм взаимодействия плагинов и маски - например, хотим ли мы повернуть картинку глобально, или только по маске (тогда центр поворота в центре маски), также некоторые алгоритмы довольно прожорливые, и если есть маска то не нужно применять их ко всему изображению, с другой стороны если ограничить область виденья алгоритма только маской, то возможны артефакты (например алгоритм размытия по большому радиусу). Где-то встречал редакторы с возможностью переключения режимов типа "только по области" и "учесть изображение за областью".
0
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,744
07.04.2014, 17:56  [ТС] 3
Цитата Сообщение от wingblack Посмотреть сообщение
На счет применения эффектов - сделать копию изображения, провести над ней преобразование, результат наложить поверх исходного изображения с учетом прозрачности маски.
Давайте вместе перечитаем стартовый пост
Цитата Сообщение от Igor3D Посмотреть сообщение
На первый взгляд все просто: пусть все эффекты выполняются как сейчас, а потом смешали/взвесили результат с исходным по маске.
И далее объясняется почему не проходит. Может Вы умеете только писать, но не читать?
0
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,037
07.04.2014, 19:51 4
Может мой текст из желания помочь и трудности поиска именно той проблемы, которая требует решения.
Думаю даже с учетом бесполезности большей части текста вы найдете что-то на что стоит обратить внимание.
0
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,744
07.04.2014, 20:33  [ТС] 5
Цитата Сообщение от wingblack Посмотреть сообщение
Может мой текст из желания помочь и трудности поиска именно той проблемы, которая требует решения. Думаю даже с учетом бесполезности большей части текста вы найдете что-то на что стоит обратить внимание.
Я понял. Мне хотелось бы пообсуждать общий механизм взаимодействия. Маска, поворот, и.т.п. - это всего лишь для конкретного примера. В общем случае "объект ссылается на объект". Самый простой способ это сделать
C++
1
2
3
4
struct SomeEffect {
  ...
 Mask * m_MaskReference;
};
Он же и самый худший. Напр юзер удалил маску и указатель m_MaskReference стал невалиден. Надо как-то найти все объекты использующие эту маску и.т.д и.т.п.
0
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,037
08.04.2014, 17:25 6
А если передавать в эффект область применения? Есть маска - даем маску, нет маски - даем все изображение. В этом случае можно даже сделать квадратик пред-просмотра
0
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,744
08.04.2014, 17:35  [ТС] 7
Цитата Сообщение от wingblack Посмотреть сообщение
А если передавать в эффект область применения? Есть маска - даем маску, нет маски - даем все изображение.
Маска не булевское значение в пикселе, даже простейший альфа-канал уже 256 значений.
0
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,037
08.04.2014, 18:22 8
Эффект же накладывается один раз и результат переходит на изображение, так? Маску следует передавать только в момент нажатия на кнопку "применить эффект". Зачем передавать маску в эффект когда его еще не нужно применять?

В общем идея чтобы маска передавалась в эффект в такой ситуации когда пользователь не будет иметь возможности изменять маску.
0
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,744
09.04.2014, 10:07  [ТС] 9
Цитата Сообщение от wingblack Посмотреть сообщение
Эффект же накладывается один раз и результат переходит на изображение, так?
Тот же пример с вращением. Без маски все поворачивается на заданный угол, напр 180 градусов. Теперь юзер назначил маску-градиент где на краях 0 а в центре 1. Тогда крайние пыксели остались на месте, центральные повернулись на 180. Результат гораздо более богатый, интересный. И он совсем не равен миксу исходного с полным поворотом. Др эффект может использовать маску совершенно по-другому, возможно неск масок для различных параметров.
0
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,037
09.04.2014, 12:35 10
Значит маска определяет параметры эффекта. Интересно, не помню встречал ли где я такую реализацию в рисовалках, по крайней мере так сильно я не копался в них.
Если уж эффекты так сильно завязаны на маски может проще в эффекте использовать некую маску по умолчанию? Т.е. маска всегда есть, но если пользователь задал маску, тогда дефолтная заменяется пользовательской.
0
833 / 641 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
10.04.2014, 13:55 11
Действительно, а что мешает передать указатель на маску при применении эффекта?
Или тут речь о каком-то комбиноровании, когда пользователь может насохранять охапку масок и охапку эффектов, каждый из которых содержит маску (т. е. можно сохранить два эффекта, отличающихся только масками)?

Для второго случая предлагаю создать коллекцию масок, а в эффектах хранить идентификатор маски, то которому извлекать маску из коллекции. При особом желании можно прикрутить к этой коллекции ответственность за удаление масок и взаимодействие с эффектами (если такое требуется).
0
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,744
11.04.2014, 08:12  [ТС] 12
Цитата Сообщение от Qwertiy Посмотреть сообщение
Или тут речь о каком-то комбиноровании, когда пользователь может насохранять охапку масок и охапку эффектов, каждый из которых содержит маску (т. е. можно сохранить два эффекта, отличающихся только масками)?
Да, совершенно верно

Цитата Сообщение от Qwertiy Посмотреть сообщение
Действительно, а что мешает передать указатель на маску при применении эффекта?
Ничто не мешает, но за эту простоту придется расплачиваться. Простейшие примеры:

- пользователь удалил маску, указатели на нее стали невалидны. Как найти их всех и обнулить?
- пользователь спохватился и делает undo. Как "вернуть маску взад"?

Конечно это реализуемо но мне придется написать немало кода. А вот как сделать маску "умной" чтобы она умела себя удалять/восстанавливать?
0
833 / 641 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
11.04.2014, 12:31 13
Цитата Сообщение от Igor3D Посмотреть сообщение
А вот как сделать маску "умной" чтобы она умела себя удалять/восстанавливать?
Ну так вот же ответ, вроде:
Цитата Сообщение от Qwertiy Посмотреть сообщение
Для второго случая предлагаю создать коллекцию масок, а в эффектах хранить идентификатор маски, то которому извлекать маску из коллекции. При особом желании можно прикрутить к этой коллекции ответственность за удаление масок и взаимодействие с эффектами (если такое требуется).
Добавлено через 5 минут
Т. е. есть некий репозиторий с масками. В течении того времени, пока пользователь может восстановить маску, держать у неё (или для неё) флаг с пометкой, что она удалена. В эффектах же хранить некоторые идентификаторы масок (можно строки, тогда будет возможность давать маскам осмысленные имена и пользоваться ими). Дальше эффект при применении обращается к репозиторию масок, с просьбой выдать маску с заданным id. Если она есть и не удалена, он получает указатель на неё, если же такой маски нет, либо она удалена, то он получает null.

При желании можно сделать, что эффект при создании/загрузке говорит репозиторию "мне нужна маска с таким-то id", а при изменении входящей в него маски, а также при удалении эффекта от неё отписывается. Репозиторий это учитывает и не позволяет пользователю удалять используемую маску, пока все эффекты от неё не откажутся.
0
1824 / 732 / 99
Регистрация: 01.10.2012
Сообщений: 3,744
12.04.2014, 10:54  [ТС] 14
Цитата Сообщение от Qwertiy Посмотреть сообщение
Т. е. есть некий репозиторий с масками. В течении того времени, пока пользователь может восстановить маску, держать у неё (или для неё) флаг с пометкой, что она удалена. В эффектах же хранить некоторые идентификаторы масок (можно строки, тогда будет возможность давать маскам осмысленные имена и пользоваться ими). Дальше эффект при применении обращается к репозиторию масок, с просьбой выдать маску с заданным id. Если она есть и не удалена, он получает указатель на неё, если же такой маски нет, либо она удалена, то он получает null.
Так делает 3ds (во всяком случае делал, давно им не занимался). ID уникальны (в течение жизни приложения) и неуклонно растут. Каждое ID знает всех кто ссылается на него и наоборот. Вариант возможный и выглядит капитально, но придется городить свою систему ID с нуля (что впрочем не значит "плохо"). Какие еще есть возможности?
0
833 / 641 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
12.04.2014, 23:48 15
Цитата Сообщение от Igor3D Посмотреть сообщение
ID уникальны (в течение жизни приложения) и неуклонно растут. Каждое ID знает всех кто ссылается на него и наоборот.
Можно и так, хотя я не это всё-таки мел в виду
0
12.04.2014, 23:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.04.2014, 23:48
Помогаю со студенческими работами здесь

Аргумент типа "Node *" несовместим с параметром "Node*"
не понимаю в чем проблема, но в Visual Studio выводит ошибку о несовместимости типа и параметра,...

Не удается неявно преобразовать тип "UnsafeStack.Node" в "UnsafeStack.Node*" - как исправить?
Узел: namespace UnsafeStack { public unsafe struct Node { public int value; ...

Rt-editor
Добрый день. В Xpages есть такой элемент как RichText Editor. У этого элемента есть верхний...

Dialog Editor
Здравствуйте, подскажите, можно ли реализовать приложение на языке C#, в котором можно было...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru