1

マトリックス関数を使用してシェイプ ブラシを使用して描画するペイント プログラムを作成しています。まったくスムーズではないという事実を除けば、すべてがうまく機能します。マウスを高速で動かすと、絵に隙間ができます。

私はいたるところを見てきましたが、解決策を見つけることができませんでした。

コードは基本的に次のようになります。

    //Press mouse within container. Uses Matrix to draw instances of the brush.
    private function handleMouseDown_drawContainer(e:MouseEvent):void
    {   
            _matrix.identity();
            _matrix.translate(mouseX - 10, mouseY - 30);
            _layout.bitmapData.draw(_layout.brush, _matrix);

            _layout.drawContainer.addEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove_drawContainer);
            _layout.drawContainer.addEventListener(MouseEvent.MOUSE_UP, handleMouseUp_drawContainer)

    }

    //Move mouse within container. Uses Matrix to draw instances of the brush.
    private function handleMouseMove_drawContainer(e:MouseEvent):void
    {
            _matrix.identity();
            _matrix.translate(mouseX - 10, mouseY - 30);
            _layout.bitmapData.draw(_layout.brush, _matrix);
    }

誰かが図面を滑らかにする方法を理解するのを手伝ってくれたら、私は永遠に感謝します! =p

前もって感謝します。

4

1 に答える 1

0

マウスの位置の間で何らかの補間が必要になる可能性があります...もちろん多くの方法があります。実装は非常に簡単ですが、微調整が少し難しい方法について説明します。基本的に、各マウス位置で描画する代わりに、マウスに少し遅れて従うイージング方程式を使用します...このように、記述された線は少し滑らかになり、各マウス位置の間に数回描画されます。
したがって、(擬似コード)を実行する代わりに:

onMouseMove {
  draw(mouseX, mouseY);
}

あなたは次のようなことをします:

x = 0;
y = 0;
onEnterFrame {
  x += (mouseX - x) * 0.2;
  y += (mouseY - y) * 0.2;
  draw(x, y);
}

おそらく本当に必要なのは、ポイント間の最大距離を制限する方法です。したがって、マウスが1つのフレーム内でさらに移動する場合は、2つの位置の間のポイントを補間し、必要な回数だけ描画します。
または、より滑らかな線を探している場合(鋭い角を避けてください)、結果の線を制御するためにベジエを使用する必要があるかもしれません。
とにかく、それはすべてあなたが探している絵の種類に依存します。

于 2012-11-17T13:49:51.453 に答える