/** * canvas canvas的dom对象 * bezierCtrlNodesArr 控制点数组,包含x,y坐标 * color 曲线颜色 */ var canvas = document.getElementById('canvas') //3阶之前采用原生方法实现 var arr0 = [{x:70,y:25},{x:24,y: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(canvas, arr0, 'black') var bezier1 = new BezierMaker(canvas, arr1, 'red') var bezier2 = new BezierMaker(canvas, arr2, 'blue') var bezier3 = new BezierMaker(canvas, arr3, 'yellow') var bezier4 = new BezierMaker(canvas, arr4, 'green') bezier0.drawBezier() bezier1.drawBezier() bezier2.drawBezier() bezier3.drawBezier() bezier4.drawBezier()
BezierMaker.prototype.bezier = function(t) { //贝塞尔公式调用 var x = 0, y = 0, bezierCtrlNodesArr = this.bezierCtrlNodesArr, //控制点数组 n = bezierCtrlNodesArr.length - 1, self = this bezierCtrlNodesArr.forEach(function(item, index) { if(!index) { x += item.x * Math.pow(( 1 - t ), n - index) * Math.pow(t, index) y += item.y * Math.pow(( 1 - t ), n - index) * Math.pow(t, index) } else { //factorial为阶乘函数 x += self.factorial(n) / self.factorial(index) / self.factorial(n - index) * item.x * Math.pow(( 1 - t ), n - index) * Math.pow(t, index) y += self.factorial(n) / self.factorial(index) / self.factorial(n - index) * item.y * Math.pow(( 1 - t ), n - index) * Math.pow(t, index) } }) return { x: x, y: y } }
对所有点进行遍历同时根据当前占比t的值(0<=t<=1),计算出当前在贝塞尔曲线上的点坐标x,y。t的取值作者分成了1000份,即每次运算t+=0.01。此时算出的x,y即所求的贝塞尔曲线分成了1000份之后的某一点。当t值从0~1遍历1000次后生成1000个x,y对应坐标,依次描点画线即可模拟出高阶贝塞尔曲线。
对于贝塞尔公式的推导作者会在之后的文章中专门说明,现在你只需要知道我们通过贝塞尔公式计算出实际贝塞尔曲线被等分成了1000份的各点,用直线连接各点后即可模拟出类曲线。
对于模拟场贝塞尔曲线生成动画的实现
这个部分相关代码可以参考这里
整体思路是用递归的方式来将每个一层控制点当做1阶贝塞尔函数来计算下一层控制点并对应连线。具体逻辑作者会留到深入讲解贝塞尔曲线公式原理的时候一起梳理一下试验场的动画生成原理~
相关推荐:
使用CSS做贝塞尔曲线
贝塞尔曲线的应用详解
实现canvas贝塞尔曲线效果代码演示
以上就是canvas实现高阶贝塞尔曲线的详细内容,更多请关注Gxl网其它相关文章!
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did71737