2012-04-05 38 views
6

我想可視化決定是否有重疊的圓圈集合在一個平面上的Java兩種不同的算法:如何在不改變算法代碼的情況下直觀顯示算法?

  • 的O(N²)算法來檢查圈
  • 的O(nlogn的每個組合)算法使用掃描線

有沒有辦法讓一個vizualization類的對象「偵聽」算法類的對象,例如它可以看到算法執行重疊檢查一對圓圈之間並知道何時更新可視化?

其他示例: 我可以將活動圓(與掃掠線相交的那些圓)的列表作爲掃掠線算法的變量,並讓另一個類(可視化類)獲取該變量。但是該類如何知道列表何時更新並且必須更新可視化?

這就是我正在考慮的策略。也許有更好的方法...

+0

我不知道你是否考慮過它,但我只想記住一個詞:多線程。一個算法線程和一個可視化線程? – 2012-04-05 22:20:59

+0

我肯定會需要多個線程。主要問題是:可視化線程如何知道它需要刷新? – aerod 2012-04-05 22:32:03

+0

繪製圖片。 (是否可視化,不會修改代碼。) – 2012-04-05 23:16:46

回答

0
  1. 有表示圓(和任何其他對象存在於此問題/算法中)幷包含每個操作的方法的類。
  2. 將算法作爲對(1)中的對象的操作 - 作爲對方法的調用。
  3. 創建一個可視化類,它檢查1中的對象並在每個對象上可視化其狀態 - 比如說說Update()方法。
  4. 創建(1)中所有類的子類,除了它們的原始行爲外,每個操作都調用Visualization.Update()

建立「你的世界」出(4)類而不是(1)有一個可視化。

1

我不確定這是否會對您有所幫助,但如果您無法更改算法的代碼以支持觀察者,那麼一個(有趣的)選項就是查看面向方面的編程。例如,在AspectJ中(例如參見http://en.wikipedia.org/wiki/AspectJ),您可以指定(使用稱爲'連接點')的位置(稱爲'連接點'),其中應該運行額外代碼位(稱爲'建議')。您可以使用它來檢測算法執行的重疊檢查,並在您認爲合適的情況下對其進行響應。

當然,這樣做會涉及到使用AspectJ,所以用普通的Java是不可能的 - 但這可能是一些有趣的事情,您可能需要研究一下。

相關問題