2012-04-05 11 views
6

は、私はJavaで面内で重複が円の集合であるかどうかを決定二つの異なるアルゴリズムを視覚化したい:アルゴリズムのコードを変更せずにアルゴリズムを視覚化するにはどうすればよいですか?

  • O(nlognのすべての組み合わせをチェックするO(n²)アルゴリズム)アルゴリズムを使用するアルゴリズム

vizualizationクラスのオブジェクトをアルゴリズムクラスのオブジェクトに「リッスン」させる方法があります。たとえば、アルゴリズムがオーバーラップを実行しているときに参照できます一対の円の間をチェックし、視覚化を更新する時期を知っていますか?

他の例: アクティブなサークル(スイープラインと交差するもの)のリストをスイープラインアルゴリズムの変数として保持し、別のクラス(ビジュアルクラス)でその変数を取得させることができます。しかし、リストが更新され、視覚化を更新する必要があるとき、そのクラスはどのように知っていますか?

これは私が考えていた戦略です。多分良い方法があります...

+0

あなたがそれを考慮しているかどうかはわかりませんが、私は念頭に置いています:マルチスレッド。 1つのアルゴリズムスレッドと1つの視覚化スレッド? –

+0

私は間違いなく複数のスレッドが必要になります。主な問題は、ビジュアライゼーションスレッドがリフレッシュする必要があることをどのように知るかです。 – aerod

+0

画像を描画します。 (可視化しますが、コードは変更しません)。 –

答えて

0
  1. サークル(およびこの問題/アルゴリズムに存在する他のオブジェクト)を表し、各操作のメソッドを含むクラスを持ちます。
  2. (1)からオブジェクトへの操作としてアルゴリズムを実装し、メソッドの呼び出しとして使用します。
  3. オブジェクトを1から検査し、それぞれの状態、たとえばUpdate()メソッドを視覚化する視覚化クラスを作成します。
  4. 元の動作とは別に、各操作でVisualization.Update()を呼び出す、(1)のすべてのクラスのサブクラスを作成します。

視覚化するために、(1)ではなく(4)のクラスから "your world"を構築します。おそらく、Observerパターン上に読ん

1

はあなたを助けることができる:https://en.wikipedia.org/wiki/Observer_pattern

あなたはjava.util.Observerを実装またはアルゴリズムにコールバック関数/オブジェクトを与えることができます。

アルゴリズムがオーバーラップチェックを実行しているときに判断できるように、オブザーバに任意のデータを渡すことができます。

1

これが役立つかどうかはわかりませんが、オブザーバーをサポートするアルゴリズムのコードを変更できない場合は、アスペクト指向プログラミングを検討することをお勧めします。

例えば、AspectJ(例えば、http://en.wikipedia.org/wiki/AspectJ参照)では、余分なコード(アドバイス)のビットを実行する場所(「結合ポイント」と呼ばれる)を指定することができます。これを使用して、アルゴリズムによって実行されるオーバーラップチェックを検出し、適切と思われるときにそれらに応答することができます。

もちろん、このようにするにはAspectJを使用する必要があるため、通常のJavaでは不可能ですが、面白いことがあります。