微信小程序 使用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 相关文章推荐
HTML页面如何象ASP一样接受参数
Feb 07 Javascript
Javascript注入技巧
Jun 22 Javascript
JQuery选择器、过滤器大整理
May 26 Javascript
jQuery ui autocomplete选择列表被Bootstrap模态窗遮挡的完美解决方法
Sep 23 Javascript
JavaScript实现Java中Map容器的方法
Oct 09 Javascript
Angular2下使用pdf插件的方法详解
Apr 29 Javascript
js轮播图无缝滚动效果
Jun 17 Javascript
javascript  删除select中的所有option的实例
Sep 17 Javascript
详解如何使用node.js的开发框架express创建一个web应用
Dec 20 Javascript
JS正则表达式封装与使用操作示例
May 15 Javascript
详解将微信小程序接口Promise化并使用async函数
Aug 05 Javascript
微信小程序聊天功能的示例代码
Jan 13 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批量生成缩略图的代码
2008/07/19 PHP
调整优化您的LAMP应用程序的5种简单方法
2011/06/26 PHP
Chrome Web App开发小结
2014/09/04 PHP
PHP获取当前所在目录位置的方法
2014/11/26 PHP
PHP的Yii框架中YiiBase入口类的扩展写法示例
2016/03/17 PHP
PHP数组的定义、初始化和数组元素的显示实现代码
2016/11/05 PHP
PHP bin2hex()函数基础实例讲解
2019/02/11 PHP
IE DOM实现存在的部分问题及解决方法
2009/07/25 Javascript
返回页面顶部top按钮通过锚点实现(自写)
2013/08/30 Javascript
解决JS中乘法的浮点错误的方法
2014/01/03 Javascript
jquery的attr方法禁用表单元素禁用输入内容
2014/06/23 Javascript
5个书写JavaScript代码的坏习惯,看看你中枪了没?
2014/11/06 Javascript
jquery的总体架构分析及实现示例详解
2014/11/08 Javascript
分享js粘帖屏幕截图到web页面插件screenshot-paste
2020/08/21 Javascript
jQuery树形控件zTree使用小结
2016/08/02 Javascript
JavaScript队列、优先队列与循环队列
2016/11/14 Javascript
微信小程序 数据遍历的实现
2017/04/05 Javascript
详谈js原型继承的一些问题
2017/09/06 Javascript
bootstrap模态框弹出和隐藏,动态改变中间内容的实例
2018/08/10 Javascript
微信小程序地图导航功能实现完整源代码附效果图(推荐)
2019/04/28 Javascript
Vue Echarts实现可视化世界地图代码实例
2019/05/07 Javascript
微信小程序代码上传、审核发布小程序
2019/05/18 Javascript
JavaScript中的类型检查
2020/02/03 Javascript
进一步探究Python中的正则表达式
2015/04/28 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
2018/07/02 Python
python数据批量写入ScrolledText的优化方法
2018/10/11 Python
python 实现音频叠加的示例
2020/10/29 Python
用Python实现定时备份Mongodb数据并上传到FTP服务器
2021/01/27 Python
FLIR美国官网:热成像, 夜视和红外摄像系统
2018/07/13 全球购物
What's the difference between deep copy and shallow copy? (深拷贝与浅拷贝有什么区别)
2015/11/10 面试题
项目副经理岗位职责
2013/12/30 职场文书
计算机专业毕业生求职信
2014/04/30 职场文书
入党积极分子学习优秀共产党员先进事迹思想汇报
2014/09/13 职场文书
“四风”问题的主要表现和危害思想汇报
2014/09/19 职场文书
机关干部四风问题自查报告及整改措施
2014/10/26 职场文书