高效二维径向重力布局(Java)

高效二维径向重力布局(Java),java,layout,graphics,box2d,gravity,Java,Layout,Graphics,Box2d,Gravity,我在寻找一种高效的2D映射算法,我尝试了许多实现,但它们似乎都缺乏。我希望stackoverflow世界能为我提供一些可以学习的现有、经过反复测试的算法 我的目标是展示基于写作体裁的文章;对于原型,我使用哲学、编程、政治和诗歌,因为这是我仅有的四种写作风格 每个文章都基于每个类别进行加权,主视图的每个角落都将每个类别作为标题。然后,文章以“云”字的形式展开,通过“人工重力”将每个项目尽可能靠近其主要类别(或在其主要类别之间),而不重叠 目前,我使用的是一种效率低下的算法,它存储矩形数组,以便在每

我在寻找一种高效的2D映射算法,我尝试了许多实现,但它们似乎都缺乏。我希望stackoverflow世界能为我提供一些可以学习的现有、经过反复测试的算法

我的目标是展示基于写作体裁的文章;对于原型,我使用哲学、编程、政治和诗歌,因为这是我仅有的四种写作风格

每个文章都基于每个类别进行加权,主视图的每个角落都将每个类别作为标题。然后,文章以“云”字的形式展开,通过“人工重力”将每个项目尽可能靠近其主要类别(或在其主要类别之间),而不重叠

目前,我使用的是一种效率低下的算法,它存储矩形数组,以便在每次向视图中添加文章时执行命中测试和搜索(使用*搜索模式来查找要填充的空白)。通过为所有重量相同的物品近似一个目的地,并使用循环队列从每个池中挑选物品,我可以获得新的结果(数组按重量排序,然后按时间戳排序),并按相关性定位(“人工重力”)

然而,使用*来盲目搜索似乎真的很浪费,即使使用启发式方法让每一篇文章首先检查最接近它的目标标记。我需要一种更有效的方法来迭代二维空间

我想知道链表方法是否会更好;与其盲目地在各个方向上搜索空空间,我只需迭代连接的节点,询问每个节点是否有a)附近的可用空间,或b)其他连接的节点要询问(并始终首先询问最近的节点)

如果有任何更好的算法可用,或对我的方法的批评,任何和所有的帮助肯定会感谢

我在这个gui中使用gwt elemental+java,但是任何语言中的任何2D映射算法都肯定会有所帮助

[编辑(请求更多细节)]:这里的主要问题是每个新添加执行的工作量;它在ui线程中产生了明显的小故障,特别是当几乎没有剩余空间时,因为我正在给定半径内搜索许多点,以获得足够的可用空间来容纳文章

如果我过早地切断算法,我会得到本可以填补的空白点。如果我让它运行太长时间,用户界面就会出现非常严重的问题,我相信用户会讨厌它


存储和修改2D空间集合的最快/最有效的方法是什么?

您没有提供足够的信息来说明如何使算法“更好”。更快?产生的布局是“更好”的一些质量指标?能够处理更大的数据源

数组和*肯定没有什么问题。如果它们以您试图解决的问题的大小给出了可接受的结果,那么它们怎么可能是“浪费”的呢?链接数据结构只有在降低频繁需要的操作成本的情况下才是值得的

如果你把问题尖锐化,你更有可能得到一个有用的答案


无论如何,有大量关于“图形布局”和“图形绘制”的文献。请尝试搜索这些术语。如果可以将所需布局表示为节点和边的集合,则可以应用这些。许多是基于模拟弹簧系统,这似乎与您正在做的事情相似。

谢谢您的提示。我将用我特别想要解决的问题更新这个问题。可以在这里看一下:Guido to the rescue!=}事实证明,我已经在做一个原始版本,将类别存储在基于9盒的插槽中,用于我的a*启发式/边界;但我没想到会让它递归。。。谢谢。这并不是对你的具体问题的回答,但是你有没有想过在所有的文章之间使用排斥力,以及在类别中使用吸引力。因此,当您放置文章时,您将禁用碰撞,让文章自行定位(无需搜索位置)。然后几秒钟后,你打开碰撞,它会“旋转”到一个良好的未碰撞位置。你的问题基本上是一个图形布局问题,每篇文章之间的排斥力是最简单的方法,但是还有其他更有效的算法;我对这种方法的问题是,它经常产生大量的反弹;我要使用的面向用户的视图只是静态布局的项,它们是径向的、加权的模式。我目前正在开发一个八叉树系统,将图形的每一层分割成直角坐标,然后通过将项目放置在最近的父节点中来实现“重力”,从而确保它们靠近应该位于的位置。我将使用排斥+吸引来分隔包装后的物品。