我正在编写一个使用形状画笔通过矩阵函数绘制的绘图程序。 一切都很好,除了它根本不光滑的事实。如果鼠标高速移动,绘画中会有间隙。
我到处寻找,但未能找到任何解决方案。
代码基本上如下所示:
//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
提前致谢。
答案 0 :(得分:0)
您可能需要在鼠标位置之间进行某种插值...当然有很多方法,我将描述一个非常容易实现但有点难以微调的方法。基本上不是在每个鼠标位置绘图,而是使用跟随鼠标的缓动方程有一些延迟...这样所描述的线条会更平滑,并且会在每个鼠标位置之间绘制几次。 所以不要做(伪代码):
onMouseMove {
draw(mouseX, mouseY);
}
你做的事情如下:
x = 0;
y = 0;
onEnterFrame {
x += (mouseX - x) * 0.2;
y += (mouseY - y) * 0.2;
draw(x, y);
}
虽然你真正需要的是一种限制点之间最大距离的方法,但是如果鼠标在一帧中移动得更多,你可以在两个位置之间插入点并绘制所需数量的点数。
或者,如果您正在寻找更平滑的线条(避免尖角),您可能还需要使用贝塞尔曲线来控制结果线。
无论如何,这一切都取决于你正在寻找的绘画类型。