高效的2D径向重力布局(Java)

时间:2012-09-14 00:48:40

标签: java layout graphics box2d gravity

我正在使用有效的2D映射算法,并且我尝试了许多实现,但它们似乎都缺乏。我希望stackoverflow世界可以帮助我们学习现有的,经过试验验证的算法。

我的目标是根据写作类型展示文章;对于原型,我使用的是哲学,编程,政治和诗歌,因为这些是我唯一的四种写作风格。

每篇文章都根据每个类别进行加权,主视图将每个类别作为每个角落的标题。然后这些文章以类似云的格式排列,“人工引力”将每个项目尽可能地放置在其主要类别(或主要类别之间),而不会重叠。

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

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

我想知道链接列表方法是否可以更好地工作;而不是盲目地在所有方向上搜索空的空间,我可以迭代连接的节点,询问每个人是否有a)附近的自由空间,或b)要求的其他连接节点(并且总是首先询问最近的节点)

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

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

[编辑(要求更多细节)]:这里的主要问题是每个新增加的工作量;它会在ui线程中产生明显的毛刺,特别是当几乎没有剩余空间时,因为我在给定半径内搜索许多点以获得足够的自由空间以适应文章。

如果我过早地关闭算法,我会得到可能已填充的空白点。如果我让它运行得太久,ui就会出现问题,我相信用户会讨厌它。

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

1 个答案:

答案 0 :(得分:0)

您没有提供足够的信息来说明什么会让算法“变得更好”。快点?通过一些质量标准生成“更好”的布局?能够处理更大的数据源吗?

阵列肯定没有问题,也没有A *。如果他们根据您要解决的问题的大小给出可接受的结果,那么他们怎么会“浪费”?只有当它们降低了经常需要的操作的成本时,链接的数据结构才是值得的。

如果你解决问题,你更有可能得到一个有用的答案。

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