Java JUNG:如何通过动态调整顶点形状的大小来正确放置箭头? 简介

Java JUNG:如何通过动态调整顶点形状的大小来正确放置箭头? 简介,java,graphics,jung,jung2,Java,Graphics,Jung,Jung2,我正在做一个项目,它以不同的大小(根据它们的相对工作量)渲染图形中的顶点 问题 我多么希望它能起作用 这就是关闭顶点动态调整大小时发生的情况: 所以这里一切都是正确的。连接圆正好位于圆环形状的边界上 这个结果是由清单1中的代码实现的 动态调整大小时实际会发生什么 在这里您可以看到,连接圆位于边界附近的某个位置,但始终缺少正确的位置 清单2中的代码实现了这个结果 清单1-无需调整大小 清单2-调整大小 事实上,我只是懒洋洋地预先计算了10种不同大小的顶点形状。但是这个代码片段更清晰,并且实现了

我正在做一个项目,它以不同的大小(根据它们的相对工作量)渲染图形中的顶点

问题 我多么希望它能起作用 这就是关闭顶点动态调整大小时发生的情况:

所以这里一切都是正确的。连接圆正好位于圆环形状的边界上

这个结果是由清单1中的代码实现的

动态调整大小时实际会发生什么 在这里您可以看到,连接圆位于边界附近的某个位置,但始终缺少正确的位置

清单2中的代码实现了这个结果

清单1-无需调整大小 清单2-调整大小 事实上,我只是懒洋洋地预先计算了10种不同大小的顶点形状。但是这个代码片段更清晰,并且实现了相同的结果(尽管没有那么好的性能)

我已经试过看的东西 这一切都发生在
edu.uci.ics.jung.visualization.renders
包中

  • 检查了
    BasicEdgeArrowRenderingSupport
    类,了解我可以用来纠正此问题的任何内容
  • 检查它是否是
    基本GearRowRenderingSupport中
    路径迭代器的“平坦度”
  • 检查它是否为
    箭头位置Tolerance
    参数
问题: 如何实现清单1所示的预期结果,但如清单2所示动态调整形状的大小

我猜这个问题的答案将导致:

  • 我做了一些基本的失败(逻辑上或程序上)
  • 或者,这是边箭头渲染支持的一个基本问题

这很难。与“默认”设置相比,您似乎重新配置了渲染。很久以前,我深入研究了JUNG的源代码以了解他们在那里做了什么,IIRC,他们实际上在计算边和顶点形状的交点,但不记得这里所有的影响因素。你能提供一个MCVE(我的意思是,一个非常小的,比如)来允许通过编译时标志在这两种行为之间切换吗?实际上这就是JUNG支持的。添加用于定义特定形状(以及颜色、笔划等)的自定义变换器。下周我将创建一个MCVE,但不会花费太多时间。它只是在JUNG中创建一个
,并将一个方法
getWorkLoad()
添加到
MyNode
类中。在此之后,我将从JUNG创建一个
VisualizationViewer
实例,并添加我在Listing1和Listing2中描述的变形金刚。顺便说一句:它们在JUNG中执行此操作,从我在代码中读取的内容开始:在Edgeshapes的路径上删除,直到迭代器的坐标点位于destinationvertex形状内(将此点命名为P2)。之后,他们从迭代的最后一点到P2创建一条线2D,并将该线传递给另一个变换器,该变换器将找到实际边上的位置。。。在此阶段,
arrowPlacementTolerance
开始发挥作用。。。因此,该值越小,箭头正好位于边缘的结果越准确。但这一切都只适用于静态大小,我不知道为什么。”这是JUNG支持的“当然,这没有什么错(它的目的是这样使用的)——但很难找出边缘端点的计算在哪里(以及为什么)可能会被特定的
转换器
搞砸。这主要是关于隔离不受欢迎行为的根本原因。好的,感谢您提出的创建MVCE的明显建议。我创造了一个,这是完美的工作。。。我不知道为什么它在我所说的应用程序中不起作用。。。可能是因为我使用javafx,可能是因为有几个后台线程在做大量的工作,而且有些东西正在干扰。。。将不得不尝试和错误。无论如何,连接到MVCE的链接:
viewer.getRenderContext().setVertexShapeTransformer(vertex -> {
    return vertex.getShape();
});
viewer.getRenderContext().setVertexShapeTransformer(vertex -> {
    double localWorkload = vertex.getLocalWorkload();
    double globalWorkload = graph.getGlobalWorkload();
    double relation = local / global;
    return AffineTransform.getScaledInstance(relation, relation).createTransformedShape(vertex.getShape());
});