帆布如何实现高阶贝塞尔曲线

  介绍

这篇文章主要介绍帆布如何实现高阶贝塞尔曲线,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

<强>为什么需要一个试验场?

在绘制复杂的高阶贝塞尔曲线时无法知道自己需要的曲线的控制点的精确位置。在试验场中进行模拟,可以实时得到控制点的坐标值,将得到的点坐标变为对象数组传递进BezierMaker类就可以生成目标曲线

效果图

帆布如何实现高阶贝塞尔曲线”>,<br/>, </p> <p> <img src=

<强>功能

<李>

[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个后,由我们自己实现的函数进行描点绘制。

<强>核心原理

绘制贝塞尔曲线

绘制贝塞尔曲线的核心点在于贝塞尔公式的运用:
,

帆布如何实现高阶贝塞尔曲线”>,<br/>, </p> <p>这个公式中的P0-Pn代表了从起点到各个控制点再到终点的各点与占比t的各种幂运算。</p> <pre类= 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

帆布如何实现高阶贝塞尔曲线