Cocoa的图形库

6

有没有一些好的图形应用程序库?我想创建节点,添加加权边缘等。

编辑

我需要一个图形(如下面的图像)而不是绘图。

enter image description here


你需要什么样的布局策略?我猜你问的不是关于图形部分的,因为这在好的2D库CoreGraphics中已经很容易实现了。 - Lothar
@Lothar也许我对CoreGraphics还不是很熟悉,但是如果有一些触摸事件处理程序与顶点连接,一些边缘的权重设置等等,那将会非常好。 - Uko
3个回答

9
根据GraphViz文档,以下代码可完成布局任务:
- (void) testGraph {

    Agraph_t* G;
    GVC_t* gvc;
    gvc = gvContext();

    char* testGraph = "\
        digraph G {\
        subgraph cluster_c0 {a0 -> a1 -> a2 -> a3;}\
        subgraph cluster_c1 {b0 -> b1 -> b2 -> b3;}\
        x -> a0;\
        x -> b0;\
        a1 -> a3;\
        a3 -> a0;\
    }";

    G = agmemread((char*)testGraph);
    [self dumpGraph:G];

    gvLayout (gvc, G, "dot");
    NSLog(@"after layout:");

    [self dumpGraph:G];

    gvFreeLayout(gvc, G);
    gvFreeContext(gvc);

}

- (void) printNode:(Agnode_t*) node {
    NSLog(@"Node: %s {{%f,%f},{%f,%f}}",node->name,
          node->u.coord.x,
          node->u.coord.y,
          ND_width(node),
          ND_height(node));
}

- (void) dumpGraph:(Agraph_t*)graph {
    if (!graph)
        return;
    Agnode_t *n = NULL;
    Dict_t *dict = graph->nodes;
    for (n= dtfirst(dict); n ; n = dtnext(dict, n)) {
        [self printNode:n];
    }
}

不要使用logNode:你应该编写一些绘图代码。

日志输出:

GraphTest[32319:303] Node: a0 {{0.000000,0.000000},{0.000000,0.000000}}
GraphTest[32319:303] Node: a1 {{0.000000,0.000000},{0.000000,0.000000}}
GraphTest[32319:303] Node: a2 {{0.000000,0.000000},{0.000000,0.000000}}
GraphTest[32319:303] Node: a3 {{0.000000,0.000000},{0.000000,0.000000}}
GraphTest[32319:303] Node: b0 {{0.000000,0.000000},{0.000000,0.000000}}
GraphTest[32319:303] Node: b1 {{0.000000,0.000000},{0.000000,0.000000}}
GraphTest[32319:303] Node: b2 {{0.000000,0.000000},{0.000000,0.000000}}
GraphTest[32319:303] Node: b3 {{0.000000,0.000000},{0.000000,0.000000}}
GraphTest[32319:303] Node: x {{0.000000,0.000000},{0.000000,0.000000}}
GraphTest[32319:303] after layout:
GraphTest[32319:303] Node: a0 {{83.000000,250.000000},{0.750000,0.500000}}
GraphTest[32319:303] Node: a1 {{63.000000,178.000000},{0.750000,0.500000}}
GraphTest[32319:303] Node: a2 {{43.000000,106.000000},{0.750000,0.500000}}
GraphTest[32319:303] Node: a3 {{83.000000,34.000000},{0.750000,0.500000}}
GraphTest[32319:303] Node: b0 {{161.000000,250.000000},{0.750000,0.500000}}
GraphTest[32319:303] Node: b1 {{161.000000,178.000000},{0.750000,0.500000}}
GraphTest[32319:303] Node: b2 {{161.000000,106.000000},{0.750000,0.500000}}
GraphTest[32319:303] Node: b3 {{161.000000,34.000000},{0.750000,0.500000}}
GraphTest[32319:303] Node: x {{122.000000,322.000000},{0.750000,0.500000}} 

2
谢谢这个,这被证明是非常有帮助的。首先,我发现你必须在向图形添加任何内容之前创建gvContext。尝试稍后创建它会导致一些“EXC_BAD_ACCESS”崩溃,原因很奇怪。 - Dave DeLong

5

它不是非常适用于Cocoa,但是Graphviz可能会满足您大部分的需求,或者为您自己的工作提供很好的基础。也就是说,graphviz库可以处理所有图形布局逻辑,并告诉您在哪里放置图形,然后使用您最喜欢的图形API进行绘制。例如,这就是OmniGraffle自动布局功能的工作原理。


这看起来很有前途。看起来Graphviz有一个C API。你能详细说明如何插入自己的绘图API吗? - Dave DeLong
抱歉,不是很了解。对我来说更多是“知道”而不是“知道如何做”......实际上尝试它是我一直没有时间去涉足的那些副业之一。 :) 但是他们有很多文档! - rickster
1
有一个名为AutoGraf的开源Cocoa应用程序(源代码在此处),它包装了GraphViz。它非常古老,但可能会提供一些建议。 - Amy Worrall

0

如果你可以限制自己只使用Mountain Lion及以上版本,那么SceneKit似乎是一个很有前途的起点。你需要自己管理布局几何(节点/边缘的实际位置),但你可以免费获得命中测试和几何基元。属性和纹理是可动画化的:你可以通过你喜欢的Core Animation样式调用来放大节点、变暗边缘、改变数字或颜色等。


在我的情况下,我正在寻找相反的东西:我想要一个能够为我做布局的工具;我可以自己处理渲染。 - Dave DeLong

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