微信小程序 使用canvas制作K线实例详解


Posted in Javascript onJanuary 12, 2017

微信小程序 使用canvas制作K线

实现效果图:

微信小程序 使用canvas制作K线实例详解

前言:

我们目的是想要一条平滑的曲线来表示均线等,而不是一条转折点明显的折线。因此还得继续探索api。我们发现,在canvas API中,能够画出曲线的有2个

beZierCurveTo(num1, num2, num3, num4, x, y)
quadraticCurveTo(num1, num2, x, y)

这两个api都是通过贝塞尔曲线来绘制路径。好在学习PS的时候,对贝塞尔曲线的具体表现也是有一定的熟练程度的,因此知道要确定一条由多个点组成的曲线路径,每一个转折点都得有2个控制点来控制曲线的表现

而在曲线的起点和终点,就只能有一个控制点了。因此,我们在绘制起点和终点时,得使用quadraticCurveTo,绘制中间的点,则使用beZierCurveTo。

现在的难点是,如何通过已知的要经过的点,计算出他们的控制点?

为了找到一个行之有效的公式,于是草稿走起。画了一个只有自己看得懂的草稿。

微信小程序 使用canvas制作K线实例详解

没想到告别高中数学那么多年,凭着一点点的记忆,花了一上午,强行搞了一个公式出来,我想如果我还是高中的数学水平的话,估计也就10分钟就能怼出来了,汗!

不知道大家还记不记得切线的概念,如果我们要画一条贝塞尔曲线,M[i-1]是起点,M[i]是终点,另外的两个控制点为A1, A2,这2个控制点一定会在某一个曲面的切线上,而切线则可以由三个点来确定,如我的草稿中,最上面橘黄色的线条就是切线,我们只需要在这条切线上,随意取2个点,分别作为前后曲线的控制点即可

于是,经过我长时间的思考,总结了一个公式如下

A1[M[i-1][0] + a*(M[i][0] - M[i-2][0]), M[i-1][1] + b*(M[i][1] - M[i-2][1])]

A2[M[i][0] - b*(M[i+1][0] - M[i-1][0]), M[i][1] - b*(M[i+1][1] - M[i-1][1])]

其中系数a, b是一个根据情况我随意取的一个值,我试过,建议在0.3附近取值并调试,试试看具体效果再确定

第一个点和最后一点因为无法通过这种方式取得2个控制点,因此我就在点集合的前后各加了一个随意自定自定的点,在实际遍历的时候忽略他们即可。

整理了思路,具体实现如下

bezierLine (canvasId, options) {
let windowWidth = 0
wx.getSystemInfo({
 success (result) {
  windowWidth = result.windowWidth
 }
})
let a = windowWidth / (options.xAxis.length-1)
let data = []
options.xAxis.map((item, i) => {
 data.push([i * a, 200 - options.yAxis[i]])
})
data.unshift(data[0])
data.push(data[data.length - 1])

const ctx = wx.createCanvasContext(canvasId)
ctx.beginPath()
data.map((item, i) => {
 const a = 0.25
 const b = 0.25
 if (i == 0 || i == data.length - 1) {
  // do nothing
 } else if (i == 1) {
  ctx.moveTo(item[0], item[1])
 } else {
  const a1 = data[i - 1][0] + a * (data[i][0] - data[i - 2][0])
  const a2 = data[i - 1][1] + b * (data[i][1] - data[i - 2][1])
  const b1 = data[i][0] - b * (data[i + 1][0] - data[i - 1][0])
  const b2 = data[i][1] - b * (data[i + 1][1] - data[i - 1][1])
  ctx.bezierCurveTo(a1, a2, b1, b2, item[0], item[1])
 }
})
ctx.setLineWidth(1)
ctx.setStrokeStyle('red')
ctx.stroke()
ctx.draw()
}
// 在onLoad中调用
this.bezierLine('stage', {
 xAxis: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30],
 yAxis: [11, 33, 22, 32, 14, 15, 20, 60, 23, 44, 77, 122, 133, 89, 156, 122,128, 143, 111, 101, 132, 99, 98, 44, 62, 74, 111, 13, 42, 55]
})

oh yeah! 效果还可以,以后再也不用担心曲线的绘制了,理我们的k线图又近了一步

ps: 数据的组织形式可以多种多样,可以是数组,可以是二位数组,也可以是对象,这并不是最主要的点,只要能正确处理就行了

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
jquery 插件 任意位置浮动固定层
Dec 25 Javascript
Javascript 跨域访问解决方案
Feb 14 Javascript
基于JavaScript 数据类型之Boolean类型分析介绍
Apr 19 Javascript
express的中间件cookieParser详解
Dec 04 Javascript
javascript操作表格排序实例分析
May 06 Javascript
学习JavaScript设计模式(多态)
Nov 25 Javascript
Bootstrap表单使用方法详解
Feb 17 Javascript
在javaScript中检测数据类型的几种方式小结
Mar 04 Javascript
js上下视差滚动简单实现代码
Mar 07 Javascript
移动端触摸滑动插件swiper使用方法详解
Aug 11 Javascript
使用ef6创建oracle数据库的实体模型遇到的问题及解决方案
Nov 09 Javascript
浅谈React高阶组件
Mar 28 Javascript
JS实现仿百度文库评分功能
Jan 12 #Javascript
移动端基础事件总结与应用
Jan 12 #Javascript
微信小程序 PHP后端form表单提交实例详解
Jan 12 #Javascript
简单的渐变轮播插件
Jan 12 #Javascript
那些精彩的JavaScript代码片段
Jan 12 #Javascript
JavaScript实现星级评分
Jan 12 #Javascript
angular2倒计时组件使用详解
Jan 12 #Javascript
You might like
提高PHP编程效率的方法
2013/11/07 PHP
php基于jquery的ajax技术传递json数据简单实例
2016/04/15 PHP
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
PHP实现浏览器中直接输出图片的方法示例
2018/03/14 PHP
jQuery在html有效在jsp无效的原因及解决方法
2013/08/02 Javascript
整理的比较全的event对像在ie与firefox浏览器中的区别
2013/11/25 Javascript
jQuery 无限级菜单的简单实例
2014/02/21 Javascript
javascript使用正则表达式实现去掉空格之后的字符
2015/02/15 Javascript
JQuery实现鼠标滚轮滑动到页面节点
2015/07/28 Javascript
JS如何实现文本框随文本的长度而增长
2015/07/30 Javascript
Bootstrap每天必学之下拉菜单
2015/11/25 Javascript
探讨JavaScript标签位置的存放与功能有无关系
2016/01/15 Javascript
理解js对象继承的N种模式
2016/01/25 Javascript
JavaScript File API文件上传预览
2016/02/02 Javascript
node.js路径处理方法以及绝对路径详解
2021/03/04 Javascript
Bootstrap导航条学习使用(二)
2017/02/08 Javascript
JavaScript无操作后屏保功能的实现方法
2017/07/04 Javascript
Angular中点击li标签实现更改颜色的核心代码
2017/12/08 Javascript
vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)
2018/11/05 Javascript
node.js中module模块的功能理解与用法实例分析
2020/02/14 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
2020/05/26 Javascript
微信小程序input抖动问题的修复方法
2021/03/03 Javascript
用Python编写一个简单的俄罗斯方块游戏的教程
2015/04/03 Python
最基础的Python的socket编程入门教程
2015/04/23 Python
python assert的用处示例详解
2019/04/01 Python
Python从入门到精通之环境搭建教程图解
2019/09/26 Python
Python 线程池用法简单示例
2019/10/02 Python
Python+OpenCV实现图像的全景拼接
2020/03/05 Python
python 实现的车牌识别项目
2021/01/25 Python
Blue Nile蓝色尼罗河香港官网:世界最大在线钻石珠宝销售商
2020/05/07 全球购物
初中学习计划书范文
2014/09/15 职场文书
私用公车造成事故检讨书
2014/11/16 职场文书
亲属关系公证书样本
2015/01/23 职场文书
《这片土地是神圣的》教学反思
2016/02/16 职场文书
Python Django搭建文件下载服务器的实现
2021/05/10 Python
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
2022/04/30 Vue.js