Форум программистов, компьютерный форум CyberForum.ru

GraphViz - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.84
SwordRight
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 6
12.05.2013, 00:16     GraphViz #1
Доброго времени суток! Нарисовалась проблема:

Имеется матрица смежности, я могу вынести в отдельный файл (типа .txt), так вот вопрос стоит в том, чтобы программно подать эту матрицу в GraphViz. Как лучше\проще это сделать? Передать напрямую в конфиг файл сабжа или для начала передать матрицу в .txt файл а потом ее оттуда считать, и собственно как это сделать.
Самая главная трудность заключается в том как подать матрицу на вход GraphVizа, мануалы что-то мало о чем мне поведали. Пожалуйста ответьте на примере вашего кода.

Да и еще, GraphViz ставил на винду.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2013, 00:16     GraphViz
Посмотрите здесь:

код для Graphviz
C# Graphviz for NET (graphviz4net)
Чтение графа из XML файла и визуализация в Graphviz C#
Graphviz + русский Java

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SwordRight
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 6
13.05.2013, 01:06  [ТС]     GraphViz #2
ребята, нужен ответ, пожалуйста подсобите!
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
13.05.2013, 02:46     GraphViz #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Да там специальный формат файла - DOT , ты в него помещай свой граф
http://ru.wikipedia.org/wiki/DOT_%28...D1%8B%D0%BA%29

А затем вызывай саму утилиту графвиза ( точно не помню какую, да и зависит от того что тебе надо ) и передавай ей параметром файл.
http://ru.wikipedia.org/wiki/Graphviz

Я неудачно пытался использовать как библиотеку Си в своей программе т.е. напрямую работать:
Визуализация графов - под линукс кстати получилось, а винде невкакую
SwordRight
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 6
13.05.2013, 09:25  [ТС]     GraphViz #4
Я как раз интересуюсь как синтаксически передать файл, а самое главное - как в .dot файл программно запихнуть (и всегда запихивать при работе моей программы) матрицу смежности\инцидентности, учитывая все нюансы синтаксиса dot.
Я предполагаю, что скорее всего придется в сей файл передавать полностью весь dot-текст формируемый в моей программе, только вот я еще не разобрался, в каком виде grafviz принимает граф(в виде матрицы или описанием связей-дуг) и как это реализовать в коде. Какие нибудь варианты еще есть?
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
13.05.2013, 15:28     GraphViz #5
Я уже ответил ...
Цитата Сообщение от SwordRight Посмотреть сообщение
Я как раз интересуюсь как синтаксически передать файл
Цитата Сообщение от Avazart Посмотреть сообщение
и передавай ей параметром файл.
Формат dot прост - читай ссылки на вики...

Добавлено через 1 минуту
Цитата Сообщение от SwordRight Посмотреть сообщение
в виде матрицы или описанием связей-дуг)
Ввиде dot -файла в котором вершины и связи дуг.
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 438
13.05.2013, 16:21     GraphViz #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
В самом простом виде можно как-то так реализовать:
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
35
36
37
38
39
40
41
42
43
44
45
#include <vector>
#include <fstream>
#include <cstdlib>
 
using namespace std;
 
typedef vector<int> adjacent_t;
typedef vector<adjacent_t> graph_t;
 
void read_graph(const char * fname, graph_t & g)
{
    ifstream inp(fname);
    int n, m;
    inp >> n >> m;
    g.clear();
    g.resize(n);
    for (int i = 0; i < m; ++i) {
        int from, to;
        inp >> from >> to;
        g[from].push_back(to);
    }
}
 
void write_dot(const char * fname, const graph_t & g)
{
    ofstream out(fname);
    out << "digraph {\n";
    for (size_t i = 0; i < g.size(); ++i) {
        out << "  " << i << ";\n";
    }
    for (size_t v = 0; v < g.size(); ++v) {
        for (auto u : g[v]) {
            out << "  " << v << " -> " << u << ";\n";
        }
    }
    out << "}\n";
}
 
int main()
{
    graph_t g;
    read_graph("input.txt", g);
    write_dot("g.dot", g);
    system("dot g.dot -Tpng -og.png");
}
Цитата Сообщение от input.txt
8 9
0 1
0 2
0 3
0 4
1 5
2 6
6 5
6 7
6 4
Цитата Сообщение от g.dot
digraph {
0;
1;
2;
3;
4;
5;
6;
7;
0 -> 1;
0 -> 2;
0 -> 3;
0 -> 4;
1 -> 5;
2 -> 6;
6 -> 5;
6 -> 7;
6 -> 4;
}
Миниатюры
GraphViz  
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
13.05.2013, 16:25     GraphViz #7
Кстати с помощью boost::graph можно выводить граф в формате graphviz
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 438
13.05.2013, 19:33     GraphViz #8
Цитата Сообщение от Avazart Посмотреть сообщение
Кстати с помощью boost::graph можно выводить граф в формате graphviz
А как там куча специфических для graphviz атрибутов обрабатывается?

Вот мне, например, нужно какие-то вершины раскрасить в определенные цвета. Когда сам пишу dot, это все не сложно делается. А как в boost::graph это можно сделать?
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
13.05.2013, 19:35     GraphViz #9
Цитата Сообщение от kamre Посмотреть сообщение
А как там куча специфических для graphviz атрибутов обрабатывается?
Вот мне, например, нужно какие-то вершины раскрасить в определенные цвета. Когда сам пишу dot, это все не сложно делается. А как в boost::graph это можно сделать?
Не имел дело ... просто увидел простой пример в интернете и попробовал его под Ubuntu - рабочий.
SwordRight
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 6
16.05.2013, 21:26  [ТС]     GraphViz #10
Цитата Сообщение от kamre Посмотреть сообщение
В самом простом виде можно как-то так реализовать:
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
35
36
37
38
39
40
41
42
43
44
45
#include <vector>
#include <fstream>
#include <cstdlib>
 
using namespace std;
 
typedef vector<int> adjacent_t;
typedef vector<adjacent_t> graph_t;
 
void read_graph(const char * fname, graph_t & g)
{
    ifstream inp(fname);
    int n, m;
    inp >> n >> m;
    g.clear();
    g.resize(n);
    for (int i = 0; i < m; ++i) {
        int from, to;
        inp >> from >> to;
        g[from].push_back(to);
    }
}
 
void write_dot(const char * fname, const graph_t & g)
{
    ofstream out(fname);
    out << "digraph {\n";
    for (size_t i = 0; i < g.size(); ++i) {
        out << "  " << i << ";\n";
    }
    for (size_t v = 0; v < g.size(); ++v) {
        for (auto u : g[v]) {
            out << "  " << v << " -> " << u << ";\n";
        }
    }
    out << "}\n";
}
 
int main()
{
    graph_t g;
    read_graph("input.txt", g);
    write_dot("g.dot", g);
    system("dot g.dot -Tpng -og.png");
}
У меня что-то не получается передать файл в Grafiz, создается .dot файл, а что потом? куда и как его пихать?
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
16.05.2013, 22:40     GraphViz #11
В утилиту передавать параметром ...
SwordRight
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 6
18.05.2013, 21:04  [ТС]     GraphViz #12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 FILE * fo;
   fo = fopen("g.dot","wt");
   fprintf( fo, "digraph Graf {\n");
  
    for (j=1; j<8; j++)
 
        for (i=1; i<8; i++)
 
            if (StringGrid3->Cells[i][j]==1)
            {
             fprintf( fo, " A%d", i);
             fprintf( fo, "->");
             fprintf( fo, "B%d \n", j);
            }
 
 
        fprintf( fo, "}");
     fclose(fo);
g.dot получает следующее:

digraph Graf {
A1->B1
A2->B1
A2->B2
A3->B2
A3->B3
A4->B3
A5->B4
A6->B5
A6->B6
A7->B7
}

Однако матрица инцидентности такая:
В1 В2 В3 В4 В5 В6 В7
А1 1 1 0 0 0 0 0
А2 0 1 1 0 0 0 0
А3 0 0 1 1 0 0 0
А4 0 0 0 0 1 0 0
А5 0 0 0 0 0 1 0
А6 0 0 0 0 0 1 0
А7 0 0 0 0 0 0 1

Где я впорол чушь, что наполняется неверными параметрами? Как это должно правильно выглядеть?
SwordRight
0 / 0 / 0
Регистрация: 12.05.2013
Сообщений: 6
21.05.2013, 21:27  [ТС]     GraphViz #13
Ребята нужен ответ! Не бросайте на произвол судьбы!))
Yandex
Объявления
21.05.2013, 21:27     GraphViz
Ответ Создать тему
Опции темы

Текущее время: 07:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru