LINUX.ORG.RU

Библиотека для простой векторной графики

 , ,


0

2

Здравствуйте. Хочу написать программу для визуализации одного формата файлов. Программа должна будет рисовать такие и такие рисунки. Сейчас на С++ пишу код для работы с форматом файла. Хотел графическую часть делать через Qt, где для этого, скорее всего, нужен будет QPainter, но недавно читал одну тему, где выбирали между QML и виджетами и наткнулся на такой комментарий. И задумался, какое будущие у виджетов (не дропнут ли их совсем?), можно ли сделать на qml то что я хочу или, вообще, быть может, стоит посмотреть в сторону другой библиотеки? Что посоветуете?

QML поддерживает HTML5 Canvas, либо проброс отрисовки в C++ и тот же QPainter — так что в крайнем случае можно будет перенести.

CrossFire ★★★★★
()

если графики не надо анимировать то QML Canvas хватит.

dib2 ★★★★★
()

Это не вектор, а растр. Пиши на виджетах, их не дропнут

XMs ★★★★★
()
Ответ на: комментарий от RazrFalcon

И XMs.

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

flyshoot
() автор топика
Ответ на: комментарий от flyshoot

Тогда расскажите нам, что вы подразумеваете под вектором? Если формат хранения - то не вариант. Для такого ада нужен растр. Если способ отрисовки - то они все векторные.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

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

flyshoot
() автор топика
Ответ на: комментарий от flyshoot

Вы путаете понятия. QPainter/Cairo работают с примитивами, а не с пикселями. А вот при выводе они генерирует или пиксели или SVG.

Но при отображении на экран - вам не важно вектор это или раст. Ибо в данном случае это роли не играет.

RazrFalcon ★★★★★
()
Ответ на: комментарий от flyshoot

Чего-то я не врубаюсь в твои представления. Может быть, ты путаешь со сценическим графом, называя его почему-то «векторным форматом»? Правильно понял тебя?

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

dave ★★★★★
()
Ответ на: комментарий от flyshoot

Растровый или векторный формат - это способы представления графика или рисунка. Обычно векторный формат подразумевает следующее: нарисовать линию от (0,1) до (100, 10), а потом в (50, 50) вывести текст «Привет, мир!» по направлению вниз и лево. Растровый же формат обычно выглядит иначе: в пикселе (0, 1) нарисовать цветом таким-то, в пикселе (0, 2) нарисовать другим цветом и т.д. Обычно лакмусовой бумажкой служит то, что картинка, представленная в векторном формате, легко поддается изменению масштаба, но при очень маленьких размерах изображение получается размытым и здесь уже растровый формат становится более предпочтительным. Поэтому ничья.

Это было о способе представления информации.

Теперь о способе вывода. В настоящее время есть два основных способа вывести изображение.

Первый способ простой и проверенный временем. В Qt это будет QPainter. Здесь ты просто посылаешь команды: нарисуй здесь то и то-то. Наименьшие требования к ресурсам. Будет работать на самых примитивных устройствах, но требует более серьезного программирования, а иногда хорошей математики. Выводить можно как в растр, например, на экран, так и в векторном формате, например, на принтер или в файл EMF / SVG / PDF. Что интересно, вывод картинки можно менять в зависимости от режима, устройства, размеров и прочих параметров, что хорошо и плохо одновременно.

Второй способ новомодный через «сценический граф». С QML совершенно не знаком, но сильно подозреваю, что это к нему именно и относится. В других средах это HTML 5 Canvas, WPF, JavaFX, в общем новая волна. Здесь ты задаешь граф, который будет представлять твою картинку. Да, это чем-то ближе к векторному формату со всеми вытекающими, как то размытость и размыленность изображения, с чем еще можно было бы бороться при первом способе (например, принудительно преобразовывая координаты устройства к целым), но здесь увы, ахиллесова пята сценических графов. Фактически твоя картинка будет хранится в векторном представлении, а потом это все загрузится в видеокарту. Поэтому высокие требования к аппаратуре, но сейчас это, видимо, уже не проблема

dave ★★★★★
()
Ответ на: комментарий от RazrFalcon

Ну вообще-то я это и написал: «в случае векторной графики изображение состоит из примитивов» и «в обоих случаях на устройство изображение выводится как набор пикселей».

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

flyshoot
() автор топика
Ответ на: комментарий от dave

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

но сейчас почти везде OpenGL

Вот это и смущает, есть куча технологий и не понятно, адекватный ли выбор я сделал в плане Qt и QPainter. Может правльнее (перспективнее) было бы использовать какую-то библиотеку-обёртку над OpenGL или сам OpenGL.

flyshoot
() автор топика
Ответ на: комментарий от dave

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

За сценический граф спасибо, надо поизучать QML.

flyshoot
() автор топика
Ответ на: комментарий от fluorite

Хорошо, но что в итоге лучше использовать QML или виджеты? Какой путь наметили разработчики Qt, будущее за QML?

flyshoot
() автор топика
Ответ на: комментарий от flyshoot

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

Ну, у тебя же в самом тексте читается «векторный рисунок». А графика - это немного другое. Ну, ладно. Оставим эту тему.

Вот это и смущает, есть куча технологий и не понятно, адекватный ли выбор я сделал в плане Qt и QPainter. Может правльнее (перспективнее) было бы использовать какую-то библиотеку-обёртку над OpenGL или сам OpenGL.

Много зависит от того, насколько удачно твои графики можно выразить через примитивы. Если у тебя там на самом высоком уровне идут прямоугольники, или кривые Безье, или текст, то замечательно.

А ты рассматривал то, как должен вести себя график в зависимости от масштаба и размеров картинки? Если при изменении масштаба твои примитивы сохраняются (т.е. твоя картинка инварианта относительно масштаба и размеров), то вполне можно взять сценический граф.

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

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

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

dave ★★★★★
()

Будь мужиком, напиши свой простой рендер, который работает с твоими простыми векторными примитивами, используя инструмент QPainter.

А вам куда сударь выводить надо? На экран, на принтер, в html файл, или на звуковые колонки?

pathfinder ★★★★
()
Ответ на: комментарий от flyshoot

Я считаю, что не будет большой разницы с точки зрения трудозатрат на написание кода между схемой:

[Примитивы] --(1)--> [Растр]
и схемой:
[Примитивы] --(1)--> [Примитивы библиотеки] --(2)--> [Растр]
Где:
(1) - код, который пишем сами
(2) - код сторонней библиотеки.

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

А QPainter тоже может создать векторные примитивы (см. QSvgGenerator).

Так, что если очень хочется, то можно:

[Примитивы] --(1)--> [SVG] --(2)--> [Растр]

pathfinder ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.