LINUX.ORG.RU

dot, ну как так

 , , , ,


0

2

Люди, прошу помощи в борьбе с GraphViz`oм, ибо гугл не помог (какую-ту доту предлагает), а мне срочно надо...
В общем, есть более 300 состояний графа в *.dot (да, на каждое состояние свой .dot), из которых надо сделать визуализацию процесса aka анимашку в простом .gif. Сложность в том, что он (т.е. dot) никак не хочет конвертировать мне в *.png с фиксированным размером и расположением графа на изображении. Т.е. на выходе получается картинки во первых разного размера, во вторых - с несовпадающами центрами (что более страшно). Ну наверняка же у dot'a должны быть параметры размера выходного изображения... Ну или хотя бы GraphViz должен иметь какие-либо средства для представления графа.
В общем печаль, думал имея Png-ки за считанные минуты соберу gif, но блин уже 3 часа читаю документашки, упорно гуглю - и ничего(.
PS height, weight пробовал, size пробовал, dpi пробовал. Ресайз изображений пробовал (получается мыло+ скачут слайды)
P.P.S А вообще есть истории успеха по анимированию выхлопа дота?

★★★★

Ноды добавляются новые? Если только связи меняются, то рисуешь один (базовый). Потом обрабатываешь dot -Tdot. На выхлопе будут ноды с позициями. Это будет твой новый базовый граф. Дальше рулишь своими связями как хочешь.

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

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

Кстати размеры самого графа тоже показал:

graph test {
...
        graph [bb="0,0,54,180"];
        A [pos="27,162", width="0.75", height="0.5"];
}

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

Попробовать-попробую, но результат заранее предугадываю: видишь ли уже между 10й и 150й итерацией размер изображения уже различается в 10раз. А элементы там нелинейно растут, так что дальше размер изображения будет только расти. таким способом я лишь добьюсь, что соседние изображения будут отличаться незначительно,, что сделает изменение размера не таким резким, но в конечном итоге изменения размера все равно будет ( причем огромным). Надо как-то заставить dot уже первое изображение экспортировать в больших размерах, не обрезая по размеру графа.

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

Отрендерь картинку с максимальным кол-вом нод. И влепи её bb во все. Я ж специально показа, что у графа тоже есть размер!

ziemin ★★
()

Была подобная задача. Рисовал сразу весь финальный граф, просто часть ребер и вершин делал невидимыми. При этом раскладка графа не меняется, а только появляются новые части.

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

Хм, получилось что-среднее: само полотно увеличилось, но что бы размер нодов остался неизменным, пришлось использовать ratio=«fill», что привело к растяжке нодов по всей поверхности полотна. При большом код-вке элементов выглядит еще нормально, но при малом как-то странно. ЧЯДНТ?

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

У меня граф строится интерактивно, т.е. на момент создания первого изображения, еще даже не известно сколько их всего будет

comp00 ★★★★
() автор топика
Последнее исправление: comp00 (всего исправлений: 1)
Ответ на: комментарий от ziemin

Спасибо, это уже ближе, но все равно: тут каждый .dot придется подгонять. Придется велосипедить на каком-нибудь OpenGL.

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

Поищи gource на ютубе. К нему можно кастомный протокол прикрутить.

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

Не могу скрывать ноды, ибо нет их еще в графе, на момент создания

Как же тогда рисовать граф фиксированного размера, если при создании первого кадра неизвестно, сколько будет нод?

Или речь только о том, чтобы PNG имели строго один и тот же размер рисунка? Так это можно каким-нибудь ImageMagick сделать белую кайму вокруг.

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

Ну не по центру получается...

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

Или речь только о том, чтобы PNG имели строго один и тот же размер рисунка?

Да, речь именно об этом. Но что бы еще все было ровненько и все ноды были одинакового размера.

Так это можно каким-нибудь ImageMagick сделать белую кайму вокруг.

Хмм.. подробнее...Я не очень силен в обработке графики, и IM знаю на уровне convert :)

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

А вообще , как то сложно получается: у меня основная программа, занимающаяся вычислениями на Java, конфигурирует 100500 исходников дота, которые в свою очередь баш-скриптом конвертируются дотом в png, а потом еще изменяют в im. Как-то все плачебно.

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

переход за несколько кадров к новому графу

Если я тебя правильно понял: потому что лишние движения структуры не нужны, движение одних нодов и то сложноуловимо, а уж если сама структура прыгать будет...

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

Хмм.. подробнее...Я не очень силен в обработке графики, и IM знаю на уровне convert :)

Я, на самом деле, тоже не специалист по IM, но там cookbook на многие случаи жизни.

Вот тут написано, как сделать рамку: http://www.imagemagick.org/Usage/crop/#border

А вот тут про то, как прямо задать размер изображения, чтобы рамка подогналась сама: http://www.imagemagick.org/Usage/crop/#extent

Проблема только в том, что если ты хочешь все png одинакового размера, то тебе, получается, надо иметь размер наибольшего рисунка, а он может быть еще не сгенерирован. Как это решить, я не знаю. Хотя раз тебе потом их надо будет объединять в gif, то ведь все равно у тебя в какой-то момент до выдачи пользователю будут все рисунки, так?

Кстати, чем делается объединение в gif? Если IM, то, может быть, не делать padding для каждого по отдельности, а сразу при сведении?

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

А вообще , как то сложно получается: у меня основная программа, занимающаяся вычислениями на Java, конфигурирует 100500 исходников дота, которые в свою очередь баш-скриптом конвертируются дотом в png, а потом еще изменяют в im. Как-то все плачебно.

UNIX way...

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

http://www.imagemagick.org/Usage/crop/#extent

Спасибо, конечно костыль, но к желанному результат привел

Хотя раз тебе потом их надо будет объединять в gif, то ведь все равно у тебя в какой-то момент до выдачи пользователю будут все рисунки, так?

Так. Объединение , да и вообще работа с изображениями не в ходит в функционал программы, и делается, в соседней вкладке терминала ручками, как правило, после выполнения основной программы. Хотя возможность работать у же полученными изображениями имеется.

Если IM, то, может быть

Им

не делать padding для каждого по отдельности, а сразу при сведении?

не делать что, простите? Это как? я делаю так:

convert *.png  -delay 105 -loop 0 exmpl.gif

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

иначе будет получаться скопление нод на малом пространстве

нет, те движения, которые делает GraphViz лаконичны, понятны и ненавязчивы. Я думал про явное изменение положения нодов.

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

convert *.png -delay 105 -loop 0 exmpl.gif

Можно попробовать так:

convert *.png  -background <цвет> -gravity <north/south/center/куда надо> -extent <1000x1000/или сколько надо> -delay 105 -loop 0 exmpl.gif
Вот только не знаю, как заставить IM автоматически подогнать анимацию под наибольший размер изображения, если они разные. Можно, конечно, взять identify и с помощью скрипта найти нужный размер,просмотрев все изображения, но, я думаю, найдется кто-нибудь, кто умеет это делать проще.

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