我正在尝试将布局从CircleLayout更改为StaticLayout,保持Vertex的位置,使用以下代码执行此操作:
it_name
其中currentVV是VisualizationViewer,布局是CircleLayout。 setX(double)和setY(double)是我的术语Vertex的方法,默认情况下,顶点初始化为x = 0.0和y = 0.0。 在这个阶段,我用teh println来检查所有顶点是否正确地获得它们的位置并且它正在工作。 下一步是使用GraphmlWritter保存图形:
StaticLayout<VertexType, EdgeType> sLayout = new StaticLayout<VertexType, EdgeType>(graph,
new Transformer<VertexType, Point2D>() {
public Point2D transform(VertexType vertex) {
vertex.setX(layout.getX(vertex));
vertex.setY(layout.getY(vertex));
System.out.println(vertex.toString());
System.out.println(vertex.getX());
System.out.println(vertex.getY());
Point2D p = new Point2D.Double(vertex.getX(), vertex.getY());
return p;
}
}, dimension);
currentVV.setGraphLayout(sLayout);
问题在于,虽然大多数顶点都是成功保存的,但是一些顶点的默认值保存为X和Y(0.0),我不明白为什么。如果我尝试直接从CircleLayout保存图形,从布局中获取X和Y值:
GraphMLWriter<VertexType, EdgeType> graphWriter = new GraphMLWriter<VertexType, EdgeType>();
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(fileName)));
graphWriter.addEdgeData("label", null, "0", new Transformer<EdgeType, String>() {
@Override
public String transform(EdgeType v) {
return v.toString();
}
});
graphWriter.addVertexData("x", null, "0", new Transformer<VertexType, String>() {
public String transform(VertexType v) {
return Double.toString(v.getX());
}
});
graphWriter.addVertexData("y", null, "0", new Transformer<VertexType, String>() {
public String transform(VertexType v) {
return Double.toString(v.getY());
}
});
graphWriter.save(graph, out);
虽然这个解决方案有助于我更喜欢在顶点上保存X和Y值,因为它将用于将来的实现。 谁知道我在哪里错过了位置信息? 感谢。
答案 0 :(得分:0)
我不能立即确定代码中的错误在哪里。
第一个问题:您为什么要尝试将CircleLayout
转换为StaticLayout
?这会给你带来什么?
假设这实际上是你需要做的,你根本不需要序列化它;您可以使用任何其他AbstractLayout
实例的位置初始化任何Layout
子类,因为Layout
是Function<V, Point2D>
(其中包括AbstractLayout
,这意味着您可以将其传递给CircleLayout<V, E> circleLayout = ...
...
StaticLayout<V, E> staticLayout = new StaticLayout(graph, circleLayout);
实例作为&#34;初始化程序&#34;。因此,例如:
firstName