我有一列需要组织成美观图形的对象。目前的方法是使用IronPython和遗传算法,但这需要太长时间。
我已经阅读了Graphviz、QuickGraph和Graph#,但我不需要可视化部分 - 我已经有一个应用程序会在给定的x/y坐标下显示节点。有人告诉我Sugiyama算法和基于力的算法族通常会输出令人满意的图形,但我似乎找不到能输出坐标而不进行一些严重的源代码修改的.NET库。
有人能推荐库、算法或类似的东西吗?
我有一列需要组织成美观图形的对象。目前的方法是使用IronPython和遗传算法,但这需要太长时间。
我已经阅读了Graphviz、QuickGraph和Graph#,但我不需要可视化部分 - 我已经有一个应用程序会在给定的x/y坐标下显示节点。有人告诉我Sugiyama算法和基于力的算法族通常会输出令人满意的图形,但我似乎找不到能输出坐标而不进行一些严重的源代码修改的.NET库。
有人能推荐库、算法或类似的东西吗?
但是,最终您应该在选择库之前确定所需的布局类型。
微软研究院有一个自动化的图形布局引擎,可能会帮助您完成这个任务。
您可以在此处阅读更多信息:
http://research.microsoft.com/en-us/downloads/f1303e46-965f-401a-87c3-34e1331d32c5/
如果有人遇到类似的问题,可以使用 GraphX for .NET 开源项目,该项目包含许多布局算法,与可视化引擎分离。因此,您可以仅使用逻辑库进行计算,并获取坐标包以在自己的可视化工具中使用。
yFiles拥有非常复杂的力导向(称为“有机”)和基于Sugiyama的(称为“分层”)布局算法实现。它们提供了Java、.net、Silverlight、Flex和Javascript的无需查看器的实现。检索坐标的API可在线获得此处。
这些算法及其质量可以在免费的yEd Graph Editor应用程序中进行测试,但库只能在商业上获得。
I had got the coordinates of nodes in this way
namespace GleeTest
{
class GleeTest
{
static void Main() {
Microsoft.Glee.GleeGraph oGleeGraph = new Microsoft.Glee.GleeGraph();
Microsoft.Glee.Splines.ICurve oCurve =
Microsoft.Glee.Splines.CurveFactory.CreateEllipse(
1, 1,
new Microsoft.Glee.Splines.Point(0, 0)
);
Microsoft.Glee.Node strNode1 = new Microsoft.Glee.Node("Circle", oCurve);
Microsoft.Glee.Node strNode3 = new Microsoft.Glee.Node("Diamond", oCurve);
Microsoft.Glee.Node strNode4 = new Microsoft.Glee.Node("Standard", oCurve);
Microsoft.Glee.Node strNode2 = new Microsoft.Glee.Node("Home", oCurve);
oGleeGraph.AddNode(strNode1);
oGleeGraph.AddNode(strNode2);
oGleeGraph.AddNode(strNode3);
oGleeGraph.AddNode(strNode4);
Microsoft.Glee.Edge oGleeEdge1 =
new Microsoft.Glee.Edge(strNode1, strNode2);
Microsoft.Glee.Edge oGleeEdge2 =
new Microsoft.Glee.Edge(strNode2, strNode1);
Microsoft.Glee.Edge oGleeEdge3 =
new Microsoft.Glee.Edge(strNode2, strNode2);
Microsoft.Glee.Edge oGleeEdge4 =
new Microsoft.Glee.Edge(strNode1, strNode3);
Microsoft.Glee.Edge oGleeEdge5 =
new Microsoft.Glee.Edge(strNode1, strNode4);
Microsoft.Glee.Edge oGleeEdge6 =
new Microsoft.Glee.Edge(strNode4, strNode1);
oGleeGraph.AddEdge(oGleeEdge1);
oGleeGraph.AddEdge(oGleeEdge2);
oGleeGraph.AddEdge(oGleeEdge3);
oGleeGraph.AddEdge(oGleeEdge4);
oGleeGraph.AddEdge(oGleeEdge5);
oGleeGraph.AddEdge(oGleeEdge6);
oGleeGraph.CalculateLayout();
System.Console.WriteLine("Circle position " + oGleeGraph.FindNode("Circle").Center.X + "," + oGleeGraph.FindNode("Circle").Center.Y);
System.Console.WriteLine("Home position = " + oGleeGraph.FindNode("Home").Center.X + "," + oGleeGraph.FindNode("Home").Center.Y);
System.Console.WriteLine("Diamond position = " + oGleeGraph.FindNode("Diamond").Center.X + "," + oGleeGraph.FindNode("Diamond").Center.Y);
System.Console.WriteLine("Standard position = " + oGleeGraph.FindNode("Standard").Center.X + "," + oGleeGraph.FindNode("Standard").Center.Y);
}
}
}
modsl系统中有一个Java实现的Sugiyama布局,使用Apache许可证。源代码在这里。
我能够相对容易地将其转换为基于digraph的混合Objective-C/Objective-C++实现。