В ходе написания одного из курсовиков, мной был создан визуальный редактор графов, исходниками которого я и хочу поделиться.
До начала работы я провел допрос гугла, с целью найти нечто подобное в уже готовом виде. Но, к сожалению, ничего приемлемого на .Net не нашел. И это притом, что на C++ или Java таких вещей множество. Своим приложением я, надеюсь, смогу устранить данный пробел.
Итак, моя библиотека состоит из двух частей: GraphModel и VisualGraphModel.
GraphModel представляет собой простейшую реализацию графа. Позволяет добавлять и удалять вершины и дуги, а также выполнять такие операции, как поиск вершины по имени, нахождение минимального пути между 2 вершинами и т.д. Полностью все доступные операции вы сможете найти в интерфейсе IGraph. Думаю, там все будет понятно.
VisualGraphModel - библиотека, включающая 2 компонента для Windows Forms: VisualGraphComponent и EditGraph. Я рекомендую пользоваться вторым, т.к. это уже готовое решение. VisualGraphComponent - заготовка, представляющее поле для отрисовки фигур.
Сама библиотека реализует все возможности предыдущей + добавляет ряд функций для рисования фигур и взаимодействием с пользователем.
Вот общая схема классов:
Реакция на действия пользователя реализована через механизм посредника и состояний. (Состояния устанавливаются как посредником, так и другими состояниями).
Сама отрисовка происходит через GDI+.
Для использования компонента в своем приложении следует сделать так:
Подключите библиотеки GraphModel.dll и VisualGraphModel.dll
Подключите след. пространства имен:
using org.zavyalov.VisualGraphModel.Abstract; using org.zavyalov.VisualGraphModel.Concrete; using org.zavyalov.VisualGraphModel.Coordinates; using org.zavyalov.GraphModel.Concrete;
Добавьте компонент EditGraph в свой проект.
Далее в классе формы советую определить два объекта
VisualGraph vg ; Mediator mediator;
В конструкторе формы пропишите след. код:
vg = this.editGraph1.vg; mediator = this.editGraph1.mediator;
Где editGraph1 - имя компонента.
Все, компонент может использоваться.
В частности можно получить матрицу смежности:
ConnectivityMatrix connectMatrix = vg.GetConnectivityMatrix();
Сам объект класс ConnectivityMatrix включает 2 поля: int[,] matrix - саму матрицу и Vertex[] vertexs - массив вершин, с помощью которого можно определить индекс той или иной вершины в матрице смежности.
Редактировать граф можно также и из кода:
VisualVertex a1 = VisualVertex.Create(); a1.name = "V1"; CoordinatesVertex c = new CoordinatesVertex(); c.from = new PointF(100, 100); a1.setCoordinates(c); vg.AddVertex(a1); VisualVertex a2 = VisualVertex.Create(); a2.name = "V2"; CoordinatesVertex c2 = new CoordinatesVertex(); c2.from = new PointF(130, 30); a2.setCoordinates(c2); vg.AddVertex(a2); VisualPair p1 = VisualPair.Create(a1, a2); p1.value = 13; vg.AddPair(p1);
Результат будет таким:
Надеюсь, что мое приложение поможет вам сэкономить приличное количество времени.
А вот и сама библиотека, вместе с примером.