6

我想可视化两种不同的算法,它们决定Java平面中的圆圈集合是否重叠:

  • 一个 O(n²) 算法,检查每个圆的组合
  • 使用扫描线的 O(nlogn) 算法

有没有办法让可视化类的对象“监听”算法类的对象,例如它可以看到算法何时在一对圆之间执行重叠检查并知道何时更新可视化?

其他示例:我可以将活动圆列表(与扫描线相交的圆)保留为扫描线算法的变量,并让另一个类(可视化类)获取该变量。但是该类如何知道列表何时更新并且必须更新可视化?

这正是我想到的策略。也许有更好的方法...

4

3 回答 3

1

也许阅读观察者模式可以帮助你:https ://en.wikipedia.org/wiki/Observer_pattern

您可以实现java.util.Observer或给算法一个回调函数/对象。

您可以将任意数据交给观察者,足以让它决定算法何时执行重叠检查。

于 2012-04-05T23:04:30.080 回答
1

我不确定这是否会对您有所帮助,但如果您无法更改算法的代码以支持观察者,那么一个(有趣的)选择是研究面向方面的编程。

例如,在 AspectJ(例如参见http://en.wikipedia.org/wiki/AspectJ)中,您可以指定(使用称为“切入点”的东西)位置(称为“连接点”),其中一些额外的代码(称为“建议”) ') 应该运行。您可以使用它来检测算法正在执行的重叠检查,并在您认为合适的情况下对其进行响应。

当然,以这种方式做事将涉及使用 AspectJ,因此仅使用普通 Java 是不可能的 - 但这是您可能想要研究的有趣的东西。

于 2012-04-05T23:15:03.703 回答
0
  1. 具有代表圆(以及此问题/算法中存在的任何其他对象)的类并包含每个操作的方法。
  2. 将算法实现为对 (1) 中的对象的操作 - 作为对方法的调用。
  3. 创建一个可视化类,它检查 1 中的对象并在每个Update()方法上可视化它们的状态。
  4. 创建 (1) 中所有类的子类,除了它们的原始行为外,它们还调用Visualization.Update()每个操作。

用 (4) 个类而不是 (1) 个类构建“你的世界”以进行可视化。

于 2012-04-05T22:40:30.843 回答