Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11639
Последний выпуск: 19.06.2015

Алгоритм слияния контуров

406
19 октября 2013 года
Meander
487 / / 04.09.2011
Здравствуйте!
Возникла необходимость реализовать мультик элементами которого являются замкнутые линии (контуры каких то объектов). Эти контуры движутся друг относительно друга и когда сталкиваются должны плавно сливаться. Примерно так это должно выглядеть при раскадровке:

В какую сторону копать, для реализации такого поведения?
Свои соображения сводятся к тому, чтобы реализовать дерево, корнем которого будет вся сцена в целом. Листья дерева - координаты и формы отдельных элементарных контуров. При слиянии будет удаляться некий узел, а лист которому он принадлежал будет добавляться к листу большего контура (или будут удалены оба узла и создан новый с листом состоящим из предыдущих). То-есть вот этот алгоритм вызывает трудности.
  • Вопрос об архитектуре программы (классы, паттерны) или о способах отрисовки? от sadovoya, 19 октября 2013 года
375
19 октября 2013 года
CassandraDied
763 / / 24.05.2012
Почему нельзя просто перекрашивать сегменты круга в белый цвет?..
406
19 октября 2013 года
Meander
487 / / 04.09.2011
Если так сделать, то будет виден резкий переход от прямой к оставшейся части круга, а на самом деле прямая и окружность должны быть соединены сегментом окружности для обеспечения гладкости соединения линий. Хотя так как Вы сказали тоже можно (я понял идею). Однако, как узнать в каком месте должен быть разрыв? Решать систему уравнений для получения точек пересечения не получится, так как контуры по большей часть сложной формы, которую я не смогу задать аналитически.

Все контуры я хотел бы реализовать как полигоны с числом узлов достаточным для обеспечения плавности изгибов.
406
19 октября 2013 года
Meander
487 / / 04.09.2011
Для sadovoya в общем вопрос и об архитектуре и об отрисовке.
288
19 октября 2013 года
sadovoya
757 / / 19.11.2005
Для отрисовки я бы взял библиотеки, поддерживающие контура и логические операции над ними. А архитектура будет зависеть от выбора библиотеки. Одно дело Qt и все ООП, другое - OpenGL и его низкоуроовневость.. Язык то какой используете?
406
19 октября 2013 года
Meander
487 / / 04.09.2011
Цитата: sadovoya
Для отрисовки я бы взял библиотеки, поддерживающие контура и логические операции над ними. А архитектура будет зависеть от выбора библиотеки. Одно дело Qt и все ООП, другое - OpenGL и его низкоуроовневость.. Язык то какой используете?


Язык C++.
То-есть в Qt и в OpenGL есть поддержка операций над контурами?

375
19 октября 2013 года
CassandraDied
763 / / 24.05.2012
Цитата: sadovoya
Для отрисовки я бы взял библиотеки, поддерживающие контура и логические операции над ними.


А такие есть?

288
19 октября 2013 года
sadovoya
757 / / 19.11.2005
Насколько помню и в Qt и в OpenGL. Название Path, если не путаю. Даже в Gdi должно быть.
CassandraDied, в .Net такого случаем нет?
288
19 октября 2013 года
sadovoya
757 / / 19.11.2005
Взгляните, не это ли надо.

A painter path is an object composed of a number of graphical building blocks (such as rectangles, ellipses, lines, and curves), and can be used for filling, outlining, and clipping. The main advantage of painter paths over normal drawing operations is that complex shapes only need to be created once, but they can be drawn many times using only calls to QPainter::drawPath().

Я бы выбрал Qt.
406
19 октября 2013 года
Meander
487 / / 04.09.2011
Цитата: sadovoya
Взгляните, не это ли надо.


Надо будет разобраться, спасибо.

89K
19 октября 2013 года
kirill222000
2 / / 19.10.2013
спасибо буду пытаться разбираться
288
19 октября 2013 года
sadovoya
757 / / 19.11.2005
Есть в Qt мало мне известная тема "анимация свойств". Видимо тоже пригодится.
375
20 октября 2013 года
CassandraDied
763 / / 24.05.2012
Цитата: sadovoya
CassandraDied, в .Net такого случаем нет?


Не знаю. Как-то никогда не приходило в голову работать с графикой через .NET. :)

Я бы вообще такую задачу над примитивами решал с помощью ООП, не используюя средств QT, GLUT, GDI и прочих подобных плюшек, потому что очевидна возможность появления какой-то нестандартной ситуации, которую не удастся решить существующими заготовками, придётся всё равно писать руками алгоритмы, работающие с массивом если не точек, то векторов.
Хороший вариант — работа с движком. Таким, как, например, unity или cryengine, или unrealengine. Для них гораздо больше вероятность, что такие плюшки уже реализованы.

303
20 октября 2013 года
Der Meister
874 / / 21.12.2007
Вам нужно булево объединение кривых (например, CGAL)
406
20 октября 2013 года
Meander
487 / / 04.09.2011
Цитата: Der Meister
Вам нужно булево объединение кривых (например, CGAL)


Спасибо, но все-таки не булево. Для наглядности приведу пример. Видели наверно капельки масла на поверхности горячего супа. Если под капельками подразумевать, только, их контур, то должна происходить трансформация этих кривых при слипании и разделении. И эта трансформация не ограничивается булевыми операциями.

288
20 октября 2013 года
sadovoya
757 / / 19.11.2005
А если к булевым операциям добавить увеличение диаметра каждой капли при их слиянии (с условием сохранения суммарной площади)?



Конечно это слишком упрощенный взгляд на вещи, реальная физическая картина гораздо сложней. Все зависит от того, какая степень достоверности требуется при моделировании.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог