Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 56, средняя оценка - 4.98
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,044
Записей в блоге: 17
#1

Визуализация графов - C++

10.02.2013, 19:55. Просмотров 8540. Ответов 38
Метки нет (Все метки)

В общем есть такой пакет http://ru.wikipedia.org/wiki/Graphviz

С помощью него можно вводить граф ввиде dot файла и получать её визуализацию
( вершины графа располагаются оптимальным образом )

Описание утилит на русском тут http://rus-linux.net/nlib.php?name=/...-ru-10-16.html

Оф. сайт http://www.graphviz.org/ Тут же можно скачать и установить, причем как пакет с утилитами и dll -ками, инклюдами так и сами соры.

Сама библиотека написана на Си. Никак не могу понять как использовать эту либу в своих программах.
Пытаюсь скомпилить примеры из доки но без успешно то ли программа завершается крахом то ли требует несуществующие dll.

Возможно кто-то имел дело с этой библиотекой и знает как её использовать?
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.02.2013, 19:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Визуализация графов (C++):

Теорие графов. Композиция двух неор. графов. - C++
Здравствуйте. Прошу помощи уже здесь :| (old topic)... Прошу помочь с составлением алгоритма "Композиции двух неориентированных графов". ...

Реализация графов - C++
Помогите пожалуйста!!!!! как написать программу на Си ++ на эту тему :реализация различных типов графов и операций над ними. спасибо...

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

Представление графов С++ - C++
#include <iostream> #include <vector> using namespace std; int n; int m; vector<int> *adj; vector<bool>...

Теория графов - C++
Есть задание. найти максимальное и среднее расстояние между центральными вершинами неориентированного графа. 1 Что такое центральные...

Представление графов С++ - C++
Считывания графу из входного файла. На вход подается текстовый файл следующего вида: n m v1 u1 v2 u2 .... vm um

38
alex_x_x
17.02.2013, 03:40     Визуализация графов
  #16

Не по теме:

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

0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,044
Записей в блоге: 17
17.02.2013, 05:21  [ТС] #17
Цитата Сообщение от alex_x_x Посмотреть сообщение
я использовал непосредственно dot
Ну да можно так, но как к примеру сделать свой редактор, что бы пользователь мог "двигать" узлы, а не имел просто статическую картинку?

Добавлено через 1 час 25 минут
Смотрю пример demo.c
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <graphviz/gvc.h>
int main(int argc, char **argv)
{
  Agraph_t *g;
  Agnode_t *n, *m;
  Agedge_t *e;
  Agsym_t *a;
  GVC_t *gvc;
  /* set up a graphviz context */
  gvc = gvContext();
  /* parse command line args - minimally argv[0] sets layout engine */
  gvParseArgs(gvc, argc, argv);
  /* Create a simple digraph */
  g = agopen("g", AGDIGRAPH);
  n = agnode(g, "n");
  m = agnode(g, "m");
  e = agedge(g, n, m);
   /* Set an attribute - in this case one that affects the visible     rendering */
  agsafeset(n, "color", "red", "");
  /* Compute a layout using layout engine from command line args */
  gvLayoutJobs(gvc, g);
  /* Write the graph according to -T and -o options */
  gvRenderJobs(gvc, g);
  /* Free layout data */
  gvFreeLayout(gvc, g);
 
  /* Free graph structures */
  agclose(g);
  /* close output file, free context, and return number of errors */
return (gvFreeContext(gvc));
}
И никак не могу вьехать какие параметры надо передавать в командную строку

Пытаю так:
Bash
1
./prog dot Tpng -otest.png
Получаю
There is no layout engine support for "prog"
Use one of: circo dot fdp neato nop nop1 nop2 osage patchwork sfdp twopi
В место передачи консольных параметров подставляю пример из доки
C++
1
2
3
4
5
6
7
8
char* args[] = {
"dot",
"-Tgif",
/* gif output */
"-oabc.gif"
/* output to file abc.gif */
};
gvParseArgs (gvc, sizeof(args)/sizeof(char*), args);
Получаю дамп памяти...

Добавлено через 9 минут
И походу связано это с количеством аргументов... если написать
C++
1
gvParseArgs (gvc,2, args);
То в терминале вижу кракозябы - вывело в двоичном файл изображения . Т.е. есть без дампа, но третий параметр не передался и файла изображения в папке не появилось.
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
17.02.2013, 05:43 #18
Avazart, я знаю енто только на уровне dot
те например так

Bash
1
printf 'digraph "name" { \n "A" -> "B" \n "B" -> "C" \n "C" -> "A" \n }' | dot -Tpng | display -
видимо она это и ест
Цитата Сообщение от Avazart Посмотреть сообщение
Ну да можно так, но как к примеру сделать свой редактор, что бы пользователь мог "двигать" узлы, а не имел просто статическую картинку?
не знаю, не уверен, что это возможно
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,044
Записей в блоге: 17
17.02.2013, 17:51  [ТС] #19
Вроде ошибка из-за ф-ций:
C++
1
2
3
4
/* Compute a layout using layout engine from command line args */
  gvLayoutJobs(gvc, g);
  /* Write the graph according to -T and -o options */
  gvRenderJobs(gvc, g);
http://en.usenet.digipedia.org/thread/16985/352/

А если нужно сохранять в файл то так работает :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <graphviz/gvc.h>
 
int main(int argc, char **argv)
{
    GVC_t *gvc;
    graph_t *g; 
    FILE *fp;
    gvc = gvContext();
 
    /* Загрузка графа с файла */ 
    //if (argc > 1)
    //    fp = fopen(argv[1], "r");
    //else
    //    fp = stdin;
    //g = agread(fp); 
 
    /* Создание графа вручную */
    Agnode_t *n, *m;
    Agedge_t *e;
     
    g = agopen("g", AGDIGRAPH);
    n = agnode(g, "n");
    m = agnode(g, "m");
    e = agedge(g, n, m);
      
     /* *** */
   
    gvLayout(gvc, g, "dot");
    gvRenderFilename(gvc, g, "png", "test.png");
    gvFreeLayout(gvc, g); 
    agclose(g);
 
return (gvFreeContext(gvc));
}
Добавлено через 1 минуту
Остается понять какого в Винде работать не хочет....

Добавлено через 11 часов 30 минут
В общем код приведенный выше пытаюсь скомпилить под Windows в VC++:

1. В доке написано что нужно линковать с gvc, graph, cdt но дело в том что если линковать с graph.lib
то начинает требовать graph.dll а её в папках пакета GraphViz нет...
- Пробую линковать с cgraph.lib

C++
1
2
3
#pragma comment(lib,"gvc.lib")
#pragma comment(lib,"cdt.lib")
#pragma comment(lib,"cgraph.lib")
2. Приложение запускается и в консоли вижу:
Error: Layout type: "dot" not recognized. Use one of:
Error: renderer for png is unavailable
Оказывается рядом exe-ником должен лежать файл config6

3. Все запустилось, работает и файл изображения png появился, но вот только он пустой - маленький белый квадратик, графа на нем нет.

Добавлено через 7 минут
4. Проверяю :
C++
1
2
    g = agopen("g", AGDIGRAPH);
    n = agnode(g, "n"); // почему  n=NULL ???
Оказывается после второй строчки n == NULL, а значит вершина графа не добавилась - вот почему граф пустой.
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,044
Записей в блоге: 17
18.02.2013, 21:10  [ТС] #20
5. Это так в дебаге выдает NULL, а в релизе - ошибка памяти
Необработанное исключение в "0x100053f6" в "test.exe": 0xC0000005: Нарушение прав доступа при чтении "0x2808a487".
с указанием на строчку
C++
1
 g = agopen("g", AGDIGRAPH);
6. Думал проблема lib файлах, решил попробовать грузить dll явно, но та же ошибка...
Посмотрел что импортирует dot.exe - gvc.dll и cgraph.dll идр импортирует ф-ции с теми же именами что и я в том числе agopen()

Задается вопрос как он это делает ?
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.02.2013, 22:33 #21
Цитата Сообщение от Avazart Посмотреть сообщение
но как к примеру сделать свой редактор, что бы пользователь мог "двигать" узлы, а не имел просто статическую картинку?
QGraphicsScene позволяет "двигать" графические элементы сцены

Не по теме:

а вообще господа пишущие на js посмеются над таким заданием

0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,044
Записей в блоге: 17
18.02.2013, 22:51  [ТС] #22
Цитата Сообщение от Jupiter Посмотреть сообщение
QGraphicsScene позволяет "двигать" графические элементы сцены
Это чЁ такое?
Qt класс или обвертка Qt над тем же GraphViz ?

Добавлено через 1 минуту
Цитата Сообщение от Jupiter Посмотреть сообщение
а вообще господа пишущие на js посмеются над таким заданием
А какое тут задание ?
Тут вопрос прикрутки либы ... думаю использовать было бы не проблема...
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,044
Записей в блоге: 17
20.02.2013, 22:52  [ТС] #23
Хорошо если нельзя получить координаты напрямую с помощью прикрутки либы к С++ программе то как ?

Вызывать dot.exe и парсить dot - файл который получается на выходе вытаскивая координаты ?

Или возможно есть готовый редактор который позволяет редактировать и передвигать узлы ?
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,044
Записей в блоге: 17
24.02.2013, 18:10  [ТС] #24
Для того что бы попробовать реализовать алгоритм визуализации самому создал новую тему Визуализация графа (реализация алгоритма)
0
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 443
13.05.2013, 15:38 #25
Цитата Сообщение от Avazart Посмотреть сообщение
Или возможно есть готовый редактор который позволяет редактировать и передвигать узлы ?
Если просто попользоваться, то довольно удобен yEd. А для встраивания в программу я бы тоже раскладку делал на основе graphviz, он умеет отдавать координаты для вершин и для контрольных точек сплайнов, через которые ребра представляются.
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,044
Записей в блоге: 17
13.05.2013, 15:44  [ТС] #26
Цитата Сообщение от kamre Посмотреть сообщение
то довольно удобен yEd
Чет не видел там варианта для С++, а внешне можно и GraphViz использовать только это порождает другие проблемы.

Цитата Сообщение от kamre Посмотреть сообщение
А для встраивания в программу я бы тоже раскладку делал на основе graphviz, он умеет отдавать координаты для вершин и для контрольных точек сплайнов, через которые ребра представляются.
Под Windоws, GraphViz не получается использовать как библиотеку в том то и проблема !!!

Читай тему сначала ...
0
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 443
13.05.2013, 16:31 #27
Цитата Сообщение от Avazart Посмотреть сообщение
Чет не видел там варианта для С++
Так это "готовый редактор который позволяет редактировать и передвигать узлы", сам им периодически пользуюсь. А на чем он написан не важно.

Цитата Сообщение от Avazart Посмотреть сообщение
Под Windоws, GraphViz не получается использовать как библиотеку в том то и проблема
Можно вызывать как подпроцесс и парсить его выход, если уж совсем все так плохо.
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,044
Записей в блоге: 17
13.05.2013, 16:38  [ТС] #28
Цитата Сообщение от kamre Посмотреть сообщение
Так это "готовый редактор который позволяет редактировать и передвигать узлы", сам им периодически пользуюсь. А на чем он написан не важно.
И что оно оптимально расставляет узлы как graphviz ?

Цитата Сообщение от kamre Посмотреть сообщение
Можно вызывать как подпроцесс и парсить его выход, если уж совсем все так плохо.
А нафига такое щастье, если для этого нужно садится и писать парсер dot ?
0
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 443
13.05.2013, 17:02 #29
Цитата Сообщение от Avazart Посмотреть сообщение
И что оно оптимально расставляет узлы как graphviz ?
Умеет автоматическую раскладку, там в ролике показывается.


Цитата Сообщение от Avazart Посмотреть сообщение
А нафига такое щастье, если для этого нужно садится и писать парсер dot ?
Ну раз dot не подходит, можно еще в svg получать раскладку, для него уже готовые парсеры есть. А лучше всего собрать из исходников самому и вызывать напрямую.
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,044
Записей в блоге: 17
13.05.2013, 17:07  [ТС] #30
Цитата Сообщение от kamre Посмотреть сообщение
Ну раз dot не подходит, можно еще в svg получать раскладку, для него уже готовые парсеры есть. А лучше всего собрать из исходников самому и вызывать напрямую.
Ха собрать ... под Windows ? по мойму сильно оптимистично. К тому же там вроде исходники только старых версий...
Вопрос в том что под Ubuntu все работает без проблем ...
Да и сами утилиты как-то работают же ?

Насчет готовых парсеров не слышал вообще, в любом это через десятую дорогу.
0
13.05.2013, 17:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2013, 17:07
Привет! Вот еще темы с ответами:

Визуализация - C++
Добрый день, подскажите пожалуйста, чем лучше отображать 2d графику - хочу поиграться с алгоритмами генерирования карт и хочется видеть...

Визуализация - C++
Здравствуйте, уважаемые форумчане. Хотелось бы узнать, возможно ли визуализировать(создать несколько членов, которые будут отвечать за...

Методы обхода графов - C++
Всем привет! Есть задание : Обойти граф, используя заданный алгоритм ( Обход в глубину по матрице инцидентности ). Все что касается...

Генерирование особых графов - C++
кто может привести какой-либо тест(пример в текстовом файле) или алгоритм генерирования тестов для создания произвольного графа с...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru