2009-08-28 5 views
3

あなたはペイントのような描画プログラムを作っています。ブラシストロークの元に戻す/やり直すことができます。これをどのように実装しますか?ラスタ描画プログラムでUndoをどのように実装しますか?

速度とメモリを最適化します。

+0

これは宿題のためのものですか? – SingleNegationElimination

+0

いいえ、ちょうどアイデアのための群衆調達。私は私の答えを置いた。他のアイデア? –

答えて

0

キャンバスのバックアップコピーを作成します。ブラシストロークを完全に囲む長方形のパッチを選択します。そのパッチに含まれているビットマップを新しいバージョンとバックアップの両方に保存します。これらの変更をblitして、ストロークを元に戻したりやり直すことができます。

多量のメモリを使用することがあります。

+0

ロングストロークを一連の短いストロークに分割すると、必要なメモリを減らすための道が大きく切り開かれます。 'U'字型を描き、U字型のパスに続くボックスと、 'U'字型の全体をカバーする1つの境界ボックスを使用することを考えてみましょう – MadCoder

2

変更されたキャンバスの以前の状態を記録するには、quadtreeを使用します。 元に戻すには、クアッドツリーからキャンバス状態を置き換えます。

関連する問題