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);
}

尽管您可能真正需要的是一种限制点之间最大距离的方法,但是如果鼠标在一帧中移动更多,您可以在两个位置之间插入点并根据需要绘制尽可能多的次数。
或者,如果您正在寻找更平滑的线条(避免尖角),您可能还需要使用贝塞尔曲线来控制生成的线条。
无论如何,这完全取决于您要寻找的图纸类型。

于 2012-11-17T13:49:51.453 回答