4

まず第一に..私の英語が下手だったらごめんなさい。私の3番目の言語は
、画像を描画して再度保存するペイントソフトウェアに取り組んでいます(コメントの提案のために)
私はパイルとwxpythonを使用しています。しかし、私はまだいくつかの機能に問題があります..
元に戻すオプションを作成する理想的な方法は何ですか?
別の質問..ユーザーが(描画フレームを拡大して)画像を拡大縮小すると、線は拡大縮小されません。どうすればそれを実現できますか。

ユーザーが行を終了するたびに一時画像をハードディスクに保存し、その新しい画像(行のある古い画像)をフレームに割り当てることで、これらの問題をすべて取り除きました。元に戻すとやり直しは、これらの画像を切り替えることによって行われます...したがって、ユーザーが画像をスケーリングすると、線もスケーリングされます。しかし、それは多くの HDD スペース (1000 線を描画するとき) を必要とし、ユーザーが線を描画するたびに新しい画像を割り当てるため遅いため、これは悪いことです。

私の考えが明確であることを願っています

誰かがより良い解決策を持っていますか?

4

2 に答える 2

13

標準的な戦略は、コマンド パターンを使用することです。コマンド オブジェクトとして実行できることを表し、各オブジェクトはスタックに配置されます。次に、アプリケーションの状態は、初期状態とスタックに含まれるすべてのものによって定義されます。したがって、「元に戻す」操作は、一番上のスタック項目をポップし、残りの項目を初期状態に再適用するだけです。

実際には、現在の状態を生成するためにこれらの操作を初期状態に適用し続けると、コストがかかる場合があります。たとえば、これは、Photoshop で見られるような一連の複雑な画像調整のようなものに当てはまります。そのような場合、交互の状態スタック シリーズをメモリに保持するのが一般的です。

+---------+
| state_0 |
+---------+       +---------+
| next   -------> | stack_0 |
+---------+       +---------+
                  | data    |       +---------+
                  | next   -------> | state_1 |
                  +---------+       +---------+
                                    | next   ----- ...
                                    +---------+

それぞれstack_iが、あらかじめ設定された複雑さ (たとえば、コマンドが計算コストを超えるX) または序数 (たとえば、スタックが保持Xするコマンドまたはそれ以上のコマンド) の制限を超えるまで、コマンドを保持します。その時点で、状態をカプセル化するために新しい中間状態オブジェクトが作成され、新しいコマンドを保持するために新しいstate_i+1空のスタックが作成されます。stack_i+1

このように、現在の状態を取得するには、最後のスナップショットの状態に一連のコマンドを適用するだけで済みます。これは状態全体を記憶するという犠牲を伴いますが、これは非常に大規模なアプリケーションには適していない可能性がありますが、最適化する状態のセットのみをスナップショットすることを選択できます。

于 2010-01-05T13:58:23.930 に答える
9

また、Python の関数は第一級のオブジェクトであり、コマンド パターンの実装を非常にスムーズにすることができることに注意してください。

actions = []

def do_action1(arg1, arg2):
    # .. do the action ..

    # remember we did the action:
    actions.append(do_action1, (arg1, arg2))

def do_action2(arg1, arg2):
    # .. do the action ..
    actions.append(do_action2, (arg1, arg2))

def replay_actions():
    for fn, args in actions:
        fn(*args)
于 2010-01-05T16:53:06.827 に答える