如何“;分散”;使用Graphsharp和WPF从图中提取节点
本文关键字:提取 节点 WPF Graphsharp 分散 使用 如何 | 更新日期: 2023-09-27 18:07:40
每个人。我使用GraphSharp和WPF来构建一个包含许多节点的图。
问题是:节点通常被一个接一个地布置,看起来像一个"粗体"命名的节点(见图,红色框http://postimg.org/image/tl6gt3cfz/)。
我想通过窗口分散节点,避免节点一个接一个。有办法做到这一点吗?
这是Xaml:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:graphsharp="clr-namespace:GraphSharp.Controls;assembly=GraphSharp.Controls"
xmlns:zoom="clr-namespace:WPFExtensions.Controls;assembly=WPFExtensions"
Title="MainWindow"
Height="350"
Width="525"
x:Name="root">
<Grid>
<zoom:ZoomControl>
<graphsharp:GraphLayout x:Name="graphLayout"
Graph="{Binding ElementName=root,Path=GraphToVisualize}"
LayoutAlgorithmType="FR"
OverlapRemovalAlgorithmType="FSA"
HighlightAlgorithmType="Simple"/>
</zoom:ZoomControl>
</Grid>
这是.cs
public partial class MainWindow : Window
{
public IBidirectionalGraph<object, IEdge<object>> _graphToVisualize;
public IBidirectionalGraph<object, IEdge<object>> GraphToVisualize
{
get { return _graphToVisualize; }
}
public MainWindow(int[,] matrix, string[] names)
{
CreateGraphToVisualize(matrix, names);
InitializeComponent();
}
public void CreateGraphToVisualize(int[,] matrix, string[] names)
{
var g = new BidirectionalGraph<object, IEdge<object>>();
//add the vertices do the graph
string[] vertices = new string[matrix.GetLength(0)];
for (int i = 0; i < matrix.GetLength(0); i++)
{
vertices[i] = names[i];
g.AddVertex(vertices[i]);
}
for (int i = 0; i < matrix.GetLength(0); i++)
{
for (int j = 0; j < matrix.GetLength(1); j++)
{
if (i == j) break;
if(matrix[i,j]==1) g.AddEdge(new Edge<object>(vertices[i], vertices[j]));
}
}
_graphToVisualize = g;
}
}
非常感谢。
图形使用力导向算法(您指定LayoutAlgorithmType="FR"(布局算法采用FRLayoutParametersBase类型的参数,该参数具有吸引乘数和排斥乘数。调整这些数字将导致节点的空间不同。我不熟悉GraphSharp,以前也从未使用过它,所以不确定什么是最合适的方法。