2016-08-24 3 views
0

カウンターを使用してダグラス・ピーッカーライン単純化アルゴリズムを実行して、実行を一時停止して個々の処理ステップを表示することは可能ですか? 可能かどうかわかりません。もしそうなら、特定のデータ構造 がこれを行うことが推奨されます。私は再帰的な解法しか見ていませんが、これが実現可能かどうかは分かりません。カウンターを使用したダグラス・ピーッカーアルゴリズム

答えて

1

はい、これは可能です。ほとんどの場合、アルゴリズムが完了した後のステップを表示することに興味がある場合は、アルゴリズムの各ステップでポイントリストのコピーを保持するのが最も簡単です。アルゴリズムが完了したら、中間ステップのリストを印刷することができます。あなたは、リスト内のポイントを格納している場合

は、たとえば、あなたが各繰り返しでリストをコピーできます。これは、配列の浅いコピーであることを

class DouglasPeucker { 
    private List<Point[]> steps = new ArrayList<>(); 

    public Point[] compute(Point[] points) { 
     steps.add(points.clone()); 
     // perform normal recursive steps 
    } 

    public void printSteps() { 
     for (Point[] points: steps) { 
      ... 
     } 
    } 
} 

注 - ポイント、つまりオブジェクトではありませんクローン化された。ポイントオブジェクトが不変(おそらくそうであるはずです)の場合、これはうまく動作します。

また、各ポイントで停止して変数の状態を調べる場合は、適切な場所にブレークポイントを持つ対話式デバッガを使用する必要があります。

+0

ありがとう、スプリンター。これを知っていることは良いことです。ある時点では、コードの適切な場所にコピーを取っていることを確認する必要があると思われる出力のコピーを保持しようとしていました。返されたポイントがマージされる前に、実装に2つの再帰呼び出しがあります。私は自分の問題は、再帰呼び出し後のポイントデータのコピーを取ろうとしていたこと、つまり結果として得られたラインデータがマージされた後であると思う。再帰呼び出しの前にコピーが行く方法です – daveb

関連する問題