【问题标题】:Efficient 2D Radial Gravity Layout (Java)高效的 2D 径向重力布局 (Java)
【发布时间】:2012-09-14 00:48:40
【问题描述】:

我追求一种高效的 2D 映射算法,并且我尝试了许多实现,但它们似乎都缺乏。我希望 stackoverflow 世界可以提供一些指向我可以从中学习的现有、久经考验的算法的指针。

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

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

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

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

我想知道链接列表方法是否会更好;而不是盲目地在各个方向搜索空白空间,我可以遍历连接的节点来询问每个节点是否有 a) 附近的可用空间,或者 b) 其他连接的节点要询问(并且总是首先询问最近的节点) .

如果有任何更好的算法可用,或对我的方法提出批评,我们将不胜感激。

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

[EDIT (request for more details)]:这里的主要问题是每个新添加的工作量;它会在 ui 线程中产生明显的故障,尤其是当几乎没有剩余空间时,因为我正在给定半径中搜索许多点以获得足够的可用空间来容纳文章。

如果我过早关闭算法,我会得到本来可以填补的空白点。如果我让它运行时间过长,用户界面会出现非常糟糕的故障,我相信用户会讨厌它。

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

【问题讨论】:

  • 可以看这里:en.wikipedia.org/wiki/Quadtree
  • Guido 来救援! =} 原来我已经在做一个原始版本,将类别存储在基于 9 盒的插槽中,用于我的 A* 启发式/边界;没想到让它递归......谢谢。
  • 这并不完全是对您的具体问题的回答,但是您是否考虑过在所有文章之间使用排斥力,并在类别之间使用吸引力。因此,当您放置文章时,您将禁用碰撞,让文章自行定位(无需您搜索位置)。然后几秒钟后你打开碰撞,它会“突然”进入一个很好的未碰撞位置。您所拥有的基本上是一个图形布局问题,每篇文章之间的排斥力是最简单的方法,但还有其他更有效的算法。
  • 我实际上已经在 actionscript 中构建了一个令人厌恶的 + 有吸引力的词云,它正是这样做的;我对这种方法的问题是它经常会产生很多反弹;我想要的面向用户的视图只是静态布局的径向加权模式的项目。我目前正在使用 OctTree 系统将图形的每一层拆分为直角坐标,然后通过将项目放置在最近的父节点中来实现“重力”,以确保它们靠近它们应该在的位置。我会在物品打包后使用排斥力+吸引力来分隔物品。

标签: java layout graphics box2d gravity


【解决方案1】:

您没有提供足够的信息来说明什么会使算法“更好”。快点?根据某些质量指标生成“更好”的布局?能够处理更大的数据源吗?

数组当然没有错,A* 也没有。如果他们在你试图解决的问题的规模上给出了可接受的结果,他们怎么可能是“浪费的”?链接数据结构只有在减少经常需要的操作的成本时才有价值。

如果你把问题变得尖锐,你就更有可能得到有用的答案。

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

【讨论】:

  • 感谢您的提示。我会用我特别想解决的问题来更新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多