上一篇文章小汪写到用canvas实现画板的功能,但是思前想后在曲线上有一定的问题,点我去看上篇canvas画板。由于我把自己代入了角色,但作为用户的感官不应该是这样子的。
二次贝塞尔曲线canvas手册在描述中讲出:
也就是需要得到起始点,控制点,结束点,从而自动绘制出相切切角的曲线。
而小汪在上篇的案例中实际效果为:
也就是说 用户在一开始可能并不知道这是贝塞尔曲线,即便给出相应点位也应该把操作点2通过计算改变位置才对。
所以我做出了修改,改成用户拖拽画贝塞尔曲线。
思路:起始点在用户手指/鼠标点击时记录,在拖拽的过程中记录“touchmove”事件的返回位置并存入一个全局数组中。在用户结束触摸是正式绘制。
理论语法为:
this.ctx.moveTo(x1, y1); //起始点
this.ctx.quadraticCurveTo(x2, y2, x3, y3); //操作点与结束点
this.ctx.stroke();//封闭路径进行绘制
x1,y1 点位我们在触摸时获得,x3,y3 点位我们在结束触摸时获得,重点讲x2,y2 获得方式;
x2,y2 由于我们在拖拽的过程中向全局的一个数组存入鼠标/手指 移动的位置,然后我们取数组的中间那一个为操作点,然后计算出绘制这条曲线的实际操作点为:(这里贴出代码片段,提供思路)
setMoveTo() {
this.ctx.moveTo(this.sX, this.sY