有没有一个可从C++调用的好的图形布局库?

18

这些(有向)图表示有限自动机。到目前为止,我的测试程序一直在编写用于测试的点文件。这对于回归测试(将已验证的输出文件保留在Subversion中,询问是否有更改)和可视化都很好。但是,存在一些问题...

基本上,我想要一个可以从 C++ 中调用并规划状态和转换布局的工具,但让绘图交给我——这样我就可以根据自己的需求进行绘制并在 GUI (wxWidgets) 窗口上绘图。

我还希望有一个允许商业使用的许可证——目前我不需要,也许我会以开放源代码的形式发布,但我不想在此时限制自己的选择。

GraphViz 的问题在于:(1) 在 Windows 上构建源代码时出现的警告,(2) 渲染和解析所需的所有不必要的依赖项,以及 (3) 假定缺乏专门且纯粹用于布局的文档 API。

基本上,我想能够指定我的状态(带有边界矩形大小)和转换,并读取出状态的位置和每个转换的航路点,然后基于这些坐标进行绘制。我还没有真正弄清楚如何处理转换上的注释,但应该有某种方式来指定这些注释的界限框大小,将它们与转换相关联,并读取位置。

是否有人知道可以处理这些要求的库?

我不一定反对自己实现某些内容,但在这种情况下,如果可能的话,我宁愿避免。


对于一个出色、清晰表述的问题点赞。不幸的是,我没有答案。 - aib
Boost有图形算法:http://www.boost.org/doc/libs/1_42_0/libs/graph/doc/index.html 我认为可视化不在其范围内。 - Mauricio Scheffer
Boost图形模块中有布局算法,但遗憾的是它们不适用于有向图。请参见此处的第22.12节:http://www.boost.org/doc/libs/1_42_0/libs/graph/doc/table_of_contents.html - Kim
5个回答

2

OGDF 是在 GPL 许可证下发布的。

Pigale 也是在 GPL 许可证下发布的。

GoVisual 是商业软件,但看起来至少需要 $1800 购买一个开发者许可证。


虽然商业使用有些尴尬,但是还是可以+1的,比如将GPL代码分离成一个动态链接二进制文件,与闭源代码分开。 - user180247
将GPL代码分离成动态链接二进制文件并不能帮助。整个程序仍然是GPL代码的派生作品。 - Ken Bloom
真的吗 - 如果我使用GPL代码编写Photoshop插件,整个Photoshop突然变成了GPL代码的派生作品?Adobe对此肯定不会很高兴!还是说Adobe不允许在开源Photoshop插件中使用GPL代码,但我可以? - user180247
这就像泥一样不清楚。例如,那个使用GPL代码的Photoshop插件怎么办?有双向调用和数据结构共享,但这会使我的插件成为Photoshop的一部分吗?显然不是。FAQ中的这部分谈到了许可证的豁免针对 插件,因此即使GNU在深处也清楚它与主机应用程序是分开的。而且别忘了-每个应用程序只是操作系统插件,具有双向调用和数据结构与主程序共享-这并不意味着每个GPL应用程序都是Windows或其他东西的“一部分”。 - user180247
我明白你的观点。显然,我不能冒使用GPL库的风险——如果我决定采用这种方法,我无法保证能够安全地销售自己的代码。你可以保留+1,因为GoVisual可能是一个选项,尽管对于我可能永远不会从中获得收入的东西来说,价格有点高,而且我将支付一些我不想要的东西和我想要的东西。 - user180247

2
嗯,GDToolkit(或GDT)看起来还不错:tutorial中的许多图像看起来相当不错,而且它似乎并不是非常复杂的使用。
编辑:但是检查许可证后,发现它是商业软件 :-(。糟糕!

商业许可证可能比GPL更好,这取决于成本,所以再次+1。 - user180247

1

我今年早些时候也遇到了类似的问题。然而,决策的一个重要输入参数是预期的节点数。

我决定使用浏览器作为GUI,因此寻找了一些不错的Javascript库,其中一个我发现的是wireit,它非常适合技术布局(并且还支持拖放和“即时”布局编辑)。您可以通过在线程中运行小型web服务器将其轻松连接到c++(无论如何,您都需要某种事件循环/线程处理图形用户界面)。

以上仅供参考。


这比实际应用更具有思考性。要求使用Web服务器不是一个选项,但使用支持Javascript的HTML控件可能也不是,还有嵌入Javascript引擎或仅翻译代码的选项。再次+1。 - user180247
我认为嵌入Web服务器比嵌入Javascript引擎更容易(http://code.google.com/p/mongoos/wiki/EmbeddingMongoose)。特别是将所有与图形相关的内容分解到浏览器中,可以节省很多依赖关系。但我也不会隐瞒JavaScript自身的怪癖。但我认为使用javascipt + jQuery UI(或其他库)进行GUI开发更容易(也更易于维护)--感谢+1。 - snies
还有一个评论:当使用(X)HTML和JavaScript时,您目前没有解决所有主要浏览器都支持的“自由绘图”的解决方案。另一方面,如果您愿意使用Firefox、Safari、Chrome、Opera(除IE外的所有浏览器),则可以使用SVG。Graphviz可以直接生成SVG输出(或轻松转换),然后您可以直接通过javascript控制和动画化。因此,您可以重用当前的某些设置。(http://code.google.com/p/svgweb/也允许在IE中支持svg) - snies
我可能误解了,但我认为在我的应用程序中嵌入服务器意味着我的应用程序正在处理网络相关的事情,即使只是在本地主机上。这意味着防火墙问题,以及其他一些问题。在我看来,这是属于“我没有权利决定如何配置其他人的计算机,因为他们运行我的程序,并不代表我拥有他们的计算机”的类别之一。值得一提的是,我曾经抛弃过软件,尽管没有充分的理由需要网络访问,但它要求我安装一个环回设备并更改我的防火墙。 - user180247

1

虽然迄今为止的答案都值得点赞,但我实际上不能接受其中任何一个。不过我还在继续搜索。

我找到的一个东西是AGLO。代码是GPL v1,但有论文描述算法,所以如果必要的话,从头重新实现应该很容易。

还有Gansner、Koutsofios、North和Vo的论文——“一种绘制有向图的技术”——可以从Graphviz网站这里获得。

我还仔细研究了BSD许可证(但是Java)的JGraph

无论如何,看起来我可能会重新实现轮子,即使不是重新发明它。


除非该库在市场上有一个非常大的利基,否则人们并不总是那么有动力编写一个GPL库的BSD替代品。 - Ken Bloom

0

1
很不幸,这个链接已经失效了,而且似乎也没有新的位置。 - Kim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接