Последнее обновление 22.11.2005
Компонент для отображения графов.
Компонент TGrInput является графическим редактором, позволяющим рисовать простые неориентированные графы. Каждая вершина создается в виде объекта TVertex, а ребро в виде объекта THeel.
Класс TGrInput является наследником TPanel Для создания объекта типа TGrInput необходимо к проекту подключить модуль UGraph.pas и переписать в ту же папку все bitmap-ы.Пример создания объекта :
var gr : TGrInput;
Begin
gr := TGrInput.CreateParented(form1);
gr.Width := 600;
gr.Height := 400;
end;
Текущая операция отменяется правой кнопкой!
Редактирование графа осуществляется в четырех режимах:
1)
Режим создания цепей
Каждый новый клик создает новый элемент цепи.
В этом режиме циклы создавать (в текущей версии) нельзя.
2)
Режим
добавления отдельных вершин и ребер
Каждый клик по свободному пространству создает новую вершину.
Клик по вершине выделяет ее (зеленым) и позволяет провести операцию удаления (клавиша Delete)
Для удаления ребра необходимо выделить инцидентную ему вершину и нажимая кнопку Tab
выделить нужную вершину и затем ее удалить (клавиша Delete)
Повторный клик по вершине позволяет создавать новые ребра (или ребра с вершинами)
3)
Режим
перемещения
Перемещаемый элемент во время перемещения выделяется зеленым.
4)
Является режимом "не редактирования" в этом режиме осуществляется программная
обработка полученного графа в этом режиме перенумеровываются вершины и ребра
(если порядок нумерации изменился в результате операций удаления),
пересчитываются матрицы инцидентности и смежности.
TMatrixType = array of packed array of Byte;
public
matrixI : TMatrixType;
matrixS : TMatrixType;
Базовые свойства и методы классов.
Все ребра и вершины объединены в два списка
pBegV : TVertex;
pBegH : THeel;
но доступ к ним легко осуществляется при помощи свойств:
Property
Vertexes [i : integer] : TVertex ...
Property Heels[i :
integer] : THeel ...
-----------------------------------------------------------------------------
THeel = Class
.........
public
p1, p2 : Pointer;
........
Index : Integer;
CurrentColor : TColor;
Property weight : AnsiString ...
.......
end;
-------------------------------------------------------------------------------------------------
б) Класс TVertex
TVertex = Class
Private
Findex : Integer;
.......
FNHeels : integer;
.......
Public
..........
Heels : TpHeels;
CurrentColor : TColor;
..........
Property NHeels : Integer Read FNHeels;
..........
Property Vindex : Integer Read Findex Write Findex default 0;
.........
end;
Heels - Динамический список элементов содержащий ребра инцидентные данной вершине (использовать не рекомендую (построен запутано и не логично)).
FNHeels - число ребер инцидентных данной вершине.
Vindex - Индекс вершины.
CurrentColor - аналогично THeel.
------------------------------------------------------------------------------------
в) Класс TGrInput
TGrInput = Class(TPanel)
..........
public
matrixI : TMatrixType;
matrixS : TMatrixType;
Constructor CreateParented(AOwner: TWinControl); overload;
.......
Property Heels[i : integer] : THeel ....
Property Vertexes [i : integer] : TVertex ....
Property VisibleHeelsIndex : boolean ....
Property Blocked : boolean ...
Property NV : Integer ...
Property NH : Integer ...
Function SeekVertex(x, y : Integer) : TVertex;
Function GetHeel(v1, v2 : integer) : THeel; overload;
Function GetHeel(v1, v2 : TVertex) : THeel; overload;
Procedure ClearAll;
Procedure RepaintAll;
end;
Все базовые операции проводятся именно с этим классом!!!
Индексация для всех элементов производится от единицы!!!
Property NV : Integer ... - Общее число вершин.
Property NH : Integer ... - Общее число ребер.
Function SeekVertex(x, y : Integer): TVertex - Поиск вершины по индексам инцидентных ребер
Function GetHeel(v1, v2 : integer) : THeel; - Поиск ребра по индексам инцидентных вершин
Function GetHeel(v1, v2 : TVertex) : THeel; - Поиск ребра по адресам инцидентных вершин
Procedure ClearAll; - Уничтожение текущего графа
Procedure RepaintAll; - Перерисовка графа.
Важно!!! Выделение цветом ребер и вершин производится следующим образом
пример:
---------------------------------------------------------------------------------------------------------------------------------
P.S.
Среди достоинств данного компонента, хочется отметить, быстроту работу графики, а среди недостатков
нерациональное использование списков (хотелось как лучше, а получилось как всегда!!!)