我有一个绘图板,我使用quadraticCurveTo来制作所有的线条和曲线,我希望当您更快地移动鼠标时,线条会更薄。然而,如果我只是做一些事情,比如计算笔的速度并改变曲线的厚度,那么每条曲线的厚度都不同,厚度也不会平滑变化。还有另一种方法吗?
换句话说 - 可以是quadraticCurveTo只绘制一个设定厚度的曲线,而不是改变整个曲线的厚度?
如果是的话,你能想到另一种改变线条厚度的方法吗?
这是一个jsfiddle:
以下是绘制曲线的代码的主要部分 -
if (isMouseDown){
++i;
X[i] = e.pageX;
Y[i] = e.pageY;
var x1 = X[i-2];
var y1 = Y[i-2];
var x2 = X[i-1];
var y2 = Y[i-1];
var x3 = X[i];
var y3 = Y[i];
var mid1x = (x1 + x2)/2;
var mid1y = (y1 + y2)/2;
var mid2x = (x2 + x3)/2;
var mid2y = (y2 + y3)/2;
var distance = Math.pow((Math.pow(mid2x-x2,2) + Math.pow(mid2y-y2,2)),2) + Math.pow((Math.pow(x2-mid1x,2) + Math.pow(y2-mid1y,2)),2);
var velocity = distance/2;
if(i>1)
{
if (velocity<1)
{ drawQuadraticThreePoints("black", 10, mid1x, mid1y, x2, y2, mid2x, mid2y);
}
else
{ drawQuadraticThreePoints("black", 10/velocity, mid1x, mid1y, x2, y2, mid2x, mid2y);
}
}
}
function drawQuadraticThreePoints (color, thickness, x1,y1,x2,y2,x3,y3) {
context.strokeStyle = color;
context.lineWidth = thickness;
context.beginPath();
context.moveTo(x1,y1);
context.quadraticCurveTo(x2,y2,x3,y3);
context.stroke();
}
答案 0 :(得分:2)
每个context.beginPath只能获得1个context.lineWidth设置。
这意味着您的context.quadraticCurveTo只能有1个线宽。
要获得没有“粗短”宽度变化的可变宽度线,必须将二次曲线分成许多较小的线段。
对于许多线段,您可以逐渐更改每个线段之间的线宽。
以下函数沿二次曲线计算xy点。
function getQuadraticBezierXYatT(startPt,controlPt,endPt,T) {
var x = Math.pow(1-T,2) * startPt.x + 2 * (1-T) * T * controlPt.x + Math.pow(T,2) * endPt.x;
var y = Math.pow(1-T,2) * startPt.y + 2 * (1-T) * T * controlPt.y + Math.pow(T,2) * endPt.y;
return( {x:x,y:y} );
}
这些是函数的输入:
每个beginPath的1 lineWidth规则仍然适用,但是每条曲线绘制多个线段会为您提供更多的beginPath,可以逐渐调整lineWidth。