private void UpdateMsaglNodeBold(MsaglGraphs.Node node, SgvlGraphs.Vertex vertex) { if (vertex.Bold) { node.Attr.LineWidth = defaultLineWidth * boldCoefficient; } else { node.Attr.LineWidth = defaultLineWidth; } }
private void UpdateMsaglNodeLabel(MsaglGraphs.Node node, SgvlGraphs.Vertex vertex) { // Если метка пустая - номер вершины, если непустая, то ставим метку рядом с номером (иначе никак) if (string.IsNullOrEmpty(vertex.Label)) { node.LabelText = node.Id.ToString(); } else { node.LabelText = $"{node.Id} {vertex.Label}"; } }
private void UpdateMsaglNode(MsaglGraphs.Node node, SgvlGraphs.Vertex vertex) { // Идентификатор вершины не меняется - обновлять не надо // Метка UpdateMsaglNodeLabel(node, vertex); // Цвет границ вершины UpdateMsaglNodeBorderColor(node, vertex); // Цвет заливки вершины UpdateMsaglNodeFillColor(node, vertex); // Выделение жирным UpdateMsaglNodeBold(node, vertex); }
// ----Методы private void UpdateMsaglNodeId(MsaglGraphs.Node node, SgvlGraphs.Vertex vertex) { node.Id = vertex.Number.ToString(); }
private void OnVertexBoldChanged(SgvlGraphs.Vertex vertex) { var node = MsaglGraph.FindNode(vertex.Number.ToString()); UpdateMsaglNodeBold(node, vertex); }
private void UpdateMsaglNodeFillColor(MsaglGraphs.Node node, SgvlGraphs.Vertex vertex) { node.Attr.FillColor = new MsaglGraphs.Color(vertex.FillColor.A, vertex.FillColor.R, vertex.FillColor.G, vertex.FillColor.B); }
// ----Конструкторы /// <summary> /// Конструктор /// </summary> /// <param name="adjacencyMatrix">Матрица смежности графа, на пересечении строки и столбца - флаг присутствия соответствующего ребра</param> /// <param name="type">Тип графа - ориентированный ли он</param> public Graph(bool[,] adjacencyMatrix, bool isDirected) { IsDirected = isDirected; int verticesCount = adjacencyMatrix.GetLength(0); // количество вершин в графе (матрица квадратная) // Создаём вершины графа vertices = new Vertex[verticesCount]; for (int vertexIndex = 0; vertexIndex < verticesCount; vertexIndex++) { int vertexNum = vertexIndex + 1; // Строим объект вершины и добавляем его в список вершин var vertex = new Vertex(vertexNum); vertex.VertexChainged += GraphPartChaingedHandler; vertices[vertexIndex] = vertex; } // Создаём рёбра графа, заполняем матрицу рёбер и список рёбер matrix = new Edge[verticesCount, verticesCount]; var edgesList = new List <Edge>(); // Если граф ориентированный, придётся проходиться по всей матрице if (isDirected) { for (int rowIndex = 0; rowIndex < verticesCount; rowIndex++) { int rowNum = rowIndex + 1; for (int columnIndex = 0; columnIndex < verticesCount; columnIndex++) { int columnNum = columnIndex + 1; if (adjacencyMatrix[rowIndex, columnIndex]) { // Создаём ребро и добавляем его в список и в матрицу var edge = new Edge(vertices[rowIndex], vertices[columnIndex]); edge.EdgeChanged += GraphPartChaingedHandler; matrix[rowIndex, columnIndex] = edge; edgesList.Add(edge); } } } } // Если граф неориентированный, матрица симметрична else { for (int rowIndex = 0; rowIndex < verticesCount; rowIndex++) { int rowNum = rowIndex + 1; for (int columnIndex = 0; columnIndex <= rowIndex; columnIndex++) { int columnNum = columnIndex + 1; if (adjacencyMatrix[rowIndex, columnIndex]) { // Создаём ребро и добавляем его в список и в матрицу var edge = new Edge(vertices[rowIndex], vertices[columnIndex]); edge.EdgeChanged += GraphPartChaingedHandler; matrix[rowIndex, columnIndex] = matrix[columnIndex, rowIndex] = edge; edgesList.Add(edge); } } } } edges = edgesList.ToArray(); }