Graph viz

Program umożliwia wizualizacje oraz interaktywne modyfikowanie grafów, a także uruchamianie różnych algorytmów w formie pluginów które w prosty sposób można przyłączać do aplikacji.

Aplet uruchamia się klikając poniższy przycisk. Wymaga JDK 1.3. Dostępna jest także wersja w postaci aplikacji, która umożliwia zapis i odczyt plików w formacie gd0 oraz serializowanych klas.

Wersja standalone aplikacji
Kod źródłowy aplikacji

Obsługa programu

Graf buduje sie wybierając odpowiednie radio buttony na listwie po lewej stronie a następnie poprzez klikanie na panelu centralnym. Klikając prawym przyciskiem myszy na wybranym wierzchołku można zawsze go przesunąć. Dodawanie krawędzi polega na wybraniu najpierw odpowieniego radio buttona a następnie na kliknięciu na dwóch wierzchołkach w kolejności w kaliej ma wskazywać rządana krawędź. Aby zmienić wartość zmiennych wierzchołków należy wybrać odpowiedni radio button a następnie kliknąć na wybranym wierzchołku. Podobnie należy zmieniać wartości krawędzi, tu należy klikać na cyfry określające wartość krawędzi znajdujące się przy odpowiedniej ze strzałek.

Przycisk relax umożliwia automatyczne pozycjonowanie wierzchołków grafu, odległości pomiedzy wierzchołkami określa się przy pomocy slidebaru.

Górna listwa umożliwia utworzenie nowego grafu, zapis/odczyt (w wersji standalone), oraz sterowanie wybranym pluginem.

Aby uruchomić algorytm grafowy należy najpierw przygotować graf. Następnie należy wybrać plugin z listy. W górnej listwie znajduje się pięć przycisków umożliwiających sterowanie pluginem. Nie każdy z nich może być akurat dostępny dla danego algorytmu, zawsze jednak działa przycisk play - '>>', oraz 'init' powodujący inicjalizacje pluginu. Przyciski '<<' - cofnięcie kroku, '||' - pauza, '>>' - krok do przodu, są wykorzystywane przy pracy krokowej algorytmu o ile plugin implementuje taką funkcjonalność.

Pisanie pluginów

Wersja standalone, umożliwia napisanie własnego pluginu a następnie po umieszczeniu go w katalogu plugins można uruchomić go z aplikacji dla zadanego grafu. Każdy plugin powinien implementować interfejs AGR.Plugin. Należy zaimplementować następujące metody :

public void start(Graph g, Vertex v);
Jest wywoływana gdy użytkownik kliknie przycisk play :'>'. Zmienna g zawiera aktualnie pokazywany graf. Zmienna v określa zaznaczony wierzchołek, może być równa null, jeśli żaden wierzchołek nie został zaznaczony (prawym kliknięciem na wierzchołku).

public String toString();
Zwraca nazwę pluginu, pojawi się ona w na liście pluginów.

public void setStartStep();
Jeśli plugin implementuje możliwość pracy krokowej algorytmu, wówczas ta metoda jest wywoływana gdy użytkonik kliknie przycisk'<<'

public void incStep();
Wywoływana gdy plugin wykonywany jest w trybie krokowym. Metoda ta jest wywoływana albo gdy użytkownik kliknieprzycisk '>>' - krok do przodu, albo gdy uruchomiono algorytm poprzez'>', wówczas będzie ona wywoływana co 1s.

public void decStep();
Podobnie jak incStep().

public boolean isFinished();
Zwraca informacje czy algorytm już zakończył swoje działanie. Jest wymagane w przypadku zarówno algorytmów wykonujących się krokowo jak i tych nie implementujących tej funkcjonalności.

public boolean canDoForward();
Informuje wizualizator o tym że algorytm może krokowo przechodzić do przodu , zwraca wówczas true, false w przeciwnym przypadku.

public boolean canDoBackward();
Podobnie jak w canDoForward().

public boolean canPause();
Czy plugin można zapauzować.

Dostęp do grafu z poziomu pluginu

Plugin rozpoczyna swoje działanie w metodzie start(Graph g, Vertex v), graf można pobrać w postaci tablicy list sąsiedztwa albo reprezentacji macierzowej. Jest także możliwość pobrania tablicy gd0 reprezentującej graf.

Pobieranie grafu

Różne metody :

List adjList[] = graph.getAdjacencyListRepresentation();//zwraca tablice list sąsiedztwa dla grafu.
try{
    int arr[] = graph.saveGD0ToArray();// zwraca graf w postaci tablicy gd0
}catch(IOException e){
    e.printStackTrace();
}
int matRep[][]=graph.getMatrixRepresentation(); //pobiera reprezentacje macierzową

Operacje na różnych reprezentacjach grafu

Po pobraniu grafu w postaci jednej z powyższych reprezentacji można na nim wykonać różne operacje modyfikujące go. W przypadku reprezentacji listowej albo gd0 można dodawać nowe wierzchołki alob usuwać już istniejące. W reprezentacji gd0 dla wierzchołka o zadanym identyfikatorze id można pobrać odpowiadający mu wierzchołek metodą : Vertex vert = graph.findVertex(id); Obiekt vert umożliwia pobranie zmiennych skojarzonych z tym wierzchołkiem poprzez wywołanie:
k.setFloatVar("k", 12);
k.setFloatVar("1", 17);
float f = k.getFloatVar("k"); // f = 12
W tablicy sąsiedztwa można odszukać wierzchołek o żądanym identyfikatorze id korzystając ze statycznej metody Graph.findVertexInAdjTable() :
Vertex vert = Graph.findVertexInAdjTable(adjList, id);
Do listy sąsiedztwa można dodawać nowe wierzchołki :
    Vertex vert = new Vertex();
    vert.setId(Vertex.getNextFreeId());
    adjList[0].add(vert);

Indeksy w tablicy sąsiedztwa odpowiadają identyfikatorom - id - wierzchołków.

poniżej znajduje się krótki przykład oparacji na grafie z pomocą tablicy gd0.

                                
try{
    int arr[] = graph.saveGD0ToArray();//pobież tablice
        
    int arr2[] = new int[arr.length+3]; //dodaj do niej jeden wierzchołek i krawędź
    System.arraycopy(arr, 0, arr2, 0, arr.length);
    arr2[arr2.length-3]=10;
    arr2[arr2.length-2]=1;
    arr2[arr2.length-1]=2;         
    
        graph.loadGD0FromArray(arr2); //zapisz nową tablice
}
catch(IOException e)
        {e.printStackTrace();}
                
                

Uaktualnianie grafu w wizualizatorze

Po wykonaniu algorytmu, należy przypisać obiektowu graph (parametrowi metody start() pluginu) nową reprezentacje grafu :
graph.applyNewListRepresentation(adjList);//w przypadku tablicy list sąsiedztwa
try{            
    graph.loadGD0FromArray(arr); //w przypadku tablicy gd0
}catch(IOException e){
    e.printStackTrace();
}
graph.applyNewMatrixRepresentation(matRep);//w przypadku reprezentacji macierzowej
Należy pamiętać że po zakończeniu algorytmu a przed wyjściem z metody start należy sprawić aby metoda isFinished() zwracała true. Pluginy mogą wypisywać różne komunikaty na konsole korzystając ze statycznej metody MainWindow.printToConsole();
    MainWindow.printToConsole("komunikat w jednej lini\n");   
Więcej o pisaniu pluginów najlepiej jest się dowiedzieć z zamieszczych przykładach, znajdujących się w źródle programu.
Marcin Jędrzejewski, 2003 - ostatnia aktualizacja 28 XII 2003