这篇文章主要介绍帆布如何实现高阶贝塞尔曲线,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
<强>为什么需要一个试验场? 强>
在绘制复杂的高阶贝塞尔曲线时无法知道自己需要的曲线的控制点的精确位置。在试验场中进行模拟,可以实时得到控制点的坐标值,将得到的点坐标变为对象数组传递进BezierMaker类就可以生成目标曲线
效果图
<强>功能强>
- <李>
[x]试验场可添加任意数量控制点
李> <李>[x]试验场支持展示曲线绘制的形成动画
李> <李>[x]控制点可自由拖拽
李> <李>[x]支持显示贝塞尔曲线形成过程的切线
李> <李>[x] 3阶及以下贝塞尔曲线的绘制采用原生API
李><强>引入强>
& lt; script src=https://www.yisu.com/zixun/薄?bezierMaker.js "> 脚本>
<强>绘制强>
上面的效果图为试验场的使用,当你通过试验场获得控制点的准确坐标之后,就可以调用bezierMaker.js进行曲线的直接绘制。
/* * ,* canvas 画布的dom对象 ,* bezierCtrlNodesArr 控制点数组,包含x, y坐标 ,* color 曲线颜色 ,*/var canvas =, . getelementbyid(& # 39;帆布# 39;)//3阶之前采用原生方法实现 var arr0 =, [{x: 70 y: 25}, {y: x: 24日,51}] var arr1 =, [{x: 233 y: 225}, {x: 170 y: 279}, {x: 240 y: 51}] var arr2 =, [{x: 23, y: 225}, {x: 70 y: 79}, {x: 40 y: 51}, {x: 300,, y: 44}] var arr3 =, [{x: 333 y: 15}, {x: 70 y: 79}, {x: 40 y: 551}, {x: 170 y: 279}, {x: 17, y: 239}] var arr4 =, [{x: 53, y: 85}, {x: 170 y: 279}, {x: 240 y: 551}, {x: 70 y: 79}, {x: 40 y: 551}, {x: 170 y: 279}] var bezier0 =, new BezierMaker(画布,,arr0,, & # 39;黑色# 39;) var bezier1 =, new BezierMaker(画布,,arr1,, & # 39;红色# 39;) var bezier2 =, new BezierMaker(画布,,arr2,, & # 39;蓝# 39;) var bezier3 =, new BezierMaker(画布,,arr3,, & # 39;黄色# 39;) var bezier4 =, new BezierMaker(画布,,arr4,, & # 39;绿色# 39;) bezier0.drawBezier () bezier1.drawBezier () bezier2.drawBezier () bezier3.drawBezier () bezier4.drawBezier ()
绘制结果
当控制点少于3个时,会适配使用原生的API接口。当控制点多于2个后,由我们自己实现的函数进行描点绘制。
<强>核心原理强>
绘制贝塞尔曲线
绘制贝塞尔曲线的核心点在于贝塞尔公式的运用:
,
BezierMaker.prototype.bezier =,函数(t),{,//贝塞尔公式调用 ,,,var x =, 0, ,,,,,,,y =, 0, ,,,,,,,bezierCtrlNodesArr =, this.bezierCtrlNodesArr, ,,,,,,,//控制点数组 ,,,,,,,n =, bezierCtrlNodesArr.length 作用;1, ,,,,,,,self =, ,,,bezierCtrlNodesArr.forEach(函数(项目,,指数),{ ,,,,,,,如果索引(!),{ ,,,,,,,,,,,x +=, item.x *, Math.pow((, 1个女人;t ),, n 作用;指数),*,Math.pow (t),指数), ,,,,,,,,,,,y +=, item.y *, Math.pow((, 1个女人;t ),, n 作用;指数),*,Math.pow (t),指数), ,,,,,,,},{else ,,,,,,,//的阶乘为阶乘函数 ,,,,,,,,,,,x +=, self.factorial (n),/, self.factorial(索引),/,self.factorial (n 安康;指数),*,item.x *, Math.pow((, 1个女人;t ),, n 作用;指数),*,Math.pow (t),指数), ,,,,,,,,,,,y +=, self.factorial (n),/, self.factorial(索引),/,self.factorial (n 安康;指数),*,item.y *, Math.pow((, 1个女人;t ),, n 作用;指数),*,Math.pow (t),指数), ,,,,,,,} ,,,}) ,,,return { ,,,,,,,x, x,: ,,,,,,,y, y ,,,} null