使用矩阵使用画笔的Actionscript 3 bitmapdata.draw

时间:2012-11-17 12:54:32

标签: actionscript-3 actionscript matrix draw bitmapdata

我正在编写一个使用形状画笔通过矩阵函数绘制的绘图程序。 一切都很好,除了它根本不光滑的事实。如果鼠标高速移动,绘画中会有间隙。

我到处寻找,但未能找到任何解决方案。

代码基本上如下所示:

    //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

提前致谢。

1 个答案:

答案 0 :(得分:0)

您可能需要在鼠标位置之间进行某种插值...当然有很多方法,我将描述一个非常容易实现但有点难以微调的方法。基本上不是在每个鼠标位置绘图,而是使用跟随鼠标的缓动方程有一些延迟...这样所描述的线条会更平滑,并且会在每个鼠标位置之间绘制几次。 所以不要做(伪代码):

onMouseMove {
  draw(mouseX, mouseY);
}

你做的事情如下:

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

虽然你真正需要的是一种限制点之间最大距离的方法,但是如果鼠标在一帧中移动得更多,你可以在两个位置之间插入点并绘制所需数量的点数。
或者,如果您正在寻找更平滑的线条(避免尖角),您可能还需要使用贝塞尔曲线来控制结果线。
无论如何,这一切都取决于你正在寻找的绘画类型。