Java 绘制高子父比图形的算法

Java 绘制高子父比图形的算法,java,algorithm,recursion,graph-algorithm,graphstream,Java,Algorithm,Recursion,Graph Algorithm,Graphstream,我正在为一个包含大量业务需求(70个数据元素)的excel文档开发一个可视化工具 其目的是显示数据的某些内部结构,这些结构在查看excel文件时并不明显。结构看起来像这样: 根-->( (组成部分1)-->( 子组件a)--->(数据元1、数据元2、…、数据元30) (组成部分2)-->( 子组件a)--->(数据元1、数据元2、…、数据元30) (组成部分3)-->( 子组件a)--->(数据元2、数据元2、…、数据元30) ) 我注意到的是: 图形在显示结构方面很出色,但在显示数据方面却很差

我正在为一个包含大量业务需求(70个数据元素)的excel文档开发一个可视化工具

其目的是显示数据的某些内部结构,这些结构在查看excel文件时并不明显。结构看起来像这样:

根-->(

(组成部分1)-->( 子组件a)--->(数据元1、数据元2、…、数据元30)

(组成部分2)-->( 子组件a)--->(数据元1、数据元2、…、数据元30)

(组成部分3)-->( 子组件a)--->(数据元2、数据元2、…、数据元30)

)

我注意到的是:

图形在显示结构方面很出色,但在显示数据方面却很差劲。 表在显示数据方面很出色,但在显示结构方面却很差劲

此时,我无法再使用GraphStream的默认自动布局。由于连接到单个子组件的数据元素数量很大,因此自动布局无法以不重叠且无法读取的方式定位这些元素。所发生的是一种花效应,其中数据元素就像围绕其父元素的重叠花瓣

如果禁用自动布局,则必须自己定位节点。Graphstream说:

您可以根据需要固定坐标。您使用的单位称为“图形单位”。但是,正如您稍后将看到的,查看器支持两个其他单位:像素和百分比

好吧,事实证明,要么这是个难题,要么我速度慢。我一直无法以可读的方式定位节点

我尝试过的事情:

  • 相对于其父节点定位子节点:使用for循环遍历节点(回想起来,为了支持n个级别,可能值得递归实现),从root开始。确定根的子级数除以2(3/2=1,整数除法)调用此中间值。将组件1 X位置设置为i-中间。将y位置设置为根y位置-1。通过这种方式,我可以创建一个“树”结构,其中父对象位于其子对象的顶部
别人的孩子是这个世界的错

不幸的是,这在实践中并不奏效。任何单个组件都可以,但如果在同一级别上有其他父级,则其子级与其他父级的子级重叠。这种情况的发生是因为孩子们的位置是相对于他们的父母的,他们不知道,事实上,他们想要进入的位置已经被其他人的孩子占据了

所以现在我不知道该怎么办。我无法将节点的位置考虑到尚不存在的节点。我有一些想法片段,但它们似乎都很复杂

所以在我进入地狱代码之前,我提出了这个问题,因为我觉得我不可能是第一个绘制可读图形的人,而且可能有现成的方法来做这件事

以下是创意片段供参考:

  • 让单个图形元素负责自己的位置,并让它们相对于其子元素或缺少子元素来定位自己

    • 结合一些定位解决方案来操作相机。限制在给定时间可以看到的节点数量(如果节点太多,请杀死其他人的孩子)。根据单击的组件使用缩放和平移

    • 递归。这是我知道的一个词。别开玩笑了,我以前用过递归,我觉得图,特别是像我这样没有循环结构的图,实际上需要递归解决方案。实际上,我在另一个项目中使用了递归方法来绘制图形,但我最终还是遇到了同样的情况。我如何知道绘制其他父级的子级的递归路径?我还是应该集思广益地想出一些递归方法

    • 创建表示视口中相对不动产的新数据结构。分段为区域,节点占据相对区域,2个节点不能占据相同的相对区域。想想当有人试图坐在别人的孩子身上时该怎么办。我是在写这篇文章的时候想到的

我就这些,你们怎么看?是否有一些众所周知的节点定位算法已经解决了我的问题?我的哪一个想法听起来最有希望