FastNetMon

Sunday 16 September 2007

Отрисовка графов и схем посредством Graphviz и Perl

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

Ставим пакет graphviz любым доступным способом (Yast, rpm -ihv), потом устанавливаем модуль поддержки Графвиза для Перла посредством команды cpan GraphViz, ну вот вроде и все, площадка для тестов готова.

Так, а что такое мы наставили, а? ЧТо за графиз и что такое вообще графы? Да, вопросов много, давайте разберём их по пунктам.

graphviz - программа, предназначенная для отрисовки графов и схем, а также для их расположения их на "холсте" (для этого присутствует несколько алгоритмов). На оффсайте приведены различные примеры использования, среди них - визуализация выполнения программ (видел в сети проект, который рисовал все системные вызовы программы, собраных через gcc), блок-схемы, схемы сетей и маршрутов, визуализация конечных автоматов, генетические структуры и многое многое другое.

Вот примеры изображений, полученных с помощью graphviz:




Почти все изображения, генерируемые графвизом, по сути представляют собой графы. Граф - это, грубо говоря, совокупность узлов, соединённых между собой линиями. Линии могут иметь направление - это уже ориентированные (орграфы) графы, а без направления - соответственно неориентированные. Можно, конечно, дать строгие математические определения, но я не буду этого делать, ведь в данный момент практика важнее теории.

Графвиз имеет несколько способов описания графов, среди которых есть специализированные языки описания графов. Но мы пока не будем про них. Ну что? Давайте же рассмотрим пример отрисовки графов (пример взят из man graphviz и я настоятельно советую Вам с ним ознакомиться). Открываем любимый текстовый редактор и набиваем следующее:

#!/usr/bin/perl

use strict;
use warnings;
use GraphViz;

my $g = GraphViz->new();

$g->add_node('Москва');
$g->add_node('Paris', label => 'City of\nlurve');
$g->add_node('New York');

$g->add_edge('Москва' => 'Paris');
$g->add_edge('Москва' => 'New York', label => 'Far');
$g->add_edge('Paris' => 'Москва');

my $fl = $ARGV[0] || 'result.svg';

open my $z, '>', $fl;
print {$z} $g->as_svg; # или $g->as_png; но оно Вам надо?))
close $z;


Потом сохраняем это в кодировке utf8 (иначе на схеме никакой Москвы не будет) под именем graphviz.pl и запускаем:
perl graphviz.pl result.svg


Если никаких ошибок не выведено, любуемся результатом - файлом result.svg, ну вот для начала и все)

Смотреть сие творение очень удобно в программе svgdisplay, входящей в пакет ksvg.

обновлено: Срд Дек 3 06:37:27 SAMT 2008 (исправил ссылки + почистил текст)

2 comments :

  1. Занятная программа, буду иметь в виду, если что. Графов пока нет, но схем довольно много, а осваивать MetaPost времени нет :-)

    За статью спасибо.d

    ReplyDelete
  2. Занятная штука этот MetaPost, спасибо за наводку, может пригодится в каком-нить проекте.

    ReplyDelete

Note: only a member of this blog may post a comment.