以本图为例,要做这张图,需要一些数学知识(三角函数sin,cos),有canvas的基础知识

Html

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<meta charset="utf-8" />
<script src="Script/jquery-1.10.2.js"></script>
<script src="Script/testStudy.js"></script>
</head>
<body style="width:100%; height:100%;">
<canvas id="study" width="600" height="360">您的浏览器不支持 HTML5 canvas 标签。</canvas>
<script>
curve();
</script>
</body>
</html>

JavaScript

var curve = function () {
var c = document.getElementById("study");
var ctx = c.getContext("2d"); //线条主色
var mianColor = "#e2dedb" //画图函数
var Drawing = {
line: function (starxy, endxy, lineWidth, color) {
ctx.strokeStyle = color;
ctx.lineWidth = lineWidth;
ctx.beginPath();
ctx.moveTo(starxy[0], starxy[1]);
ctx.lineTo(endxy[0], endxy[1]);
ctx.stroke();
},
ract: function (starxy, ractWH, color) {
ctx.fillStyle = color;
ctx.fillRect(starxy[0], starxy[1], ractWH[0], ractWH[1]);
},
ractBorder: function (starxy, ractWH, color, lineWidth) {
ctx.lineWidth = lineWidth;
ctx.strokeStyle = color;
ctx.strokeRect(starxy[0], starxy[1], ractWH[0], ractWH[1]);
}, /*Drawing.triCurve(triangle, star, cp, color)
triangle:三角函数
star:{x:开始x坐标,y:开始的y坐标}
cp:{xw:控制x的宽度,yh:控制y的高度,s:位移}
color:线条颜色
*/
triCurve: function (triangle, star, cp, color) {
ctx.strokeStyle = color;
ctx.beginPath();
ctx.moveTo(star.x, star.y);
//中心判断
var change = false;
//中点计算
var count = cp.yh;
for (var i = cp.s; i * cp.xw - cp.xw * cp.s + star.x < 600 ; i += 0.1) {
count += 0.5;
}
var center = parseInt(count / 2);
//三角函数曲线
for (var i = cp.s; i * cp.xw - cp.xw * cp.s + star.x < 600; i += 0.1) {
if (change === false && cp.yh < center) { cp.yh += 0.5; }
if (change === false && cp.yh === center) { change = true; cp.yh -= 0.5; }
if (change === true && cp.yh < center) { cp.yh -= 0.5; }
var x = i * cp.xw - cp.xw * cp.s + star.x;
var y = Math[triangle](i * cp.angle) * cp.yh + star.y;
ctx.lineTo(x, y);
}
ctx.stroke();
ctx.closePath(); },
} //背景填充
Drawing.ract([0, 0], [600, 360], "#333333"); //播放条
var play = function (btn) {
ctx.clearRect(0, 0, 600, 130);
Drawing.ract([0, 0], [600, 130], "#333333");
var playLineStar = [93, 105];
var playLineWH = [494, 105];
var playBtnWH = [11, 21];
Drawing.line(playLineStar, playLineWH, 4, mianColor);
var playBtnStarX;
var playBtnStarY = playLineWH[1] - playBtnWH[1] / 2;
btn == undefined ? playBtnStarX = (playLineWH[0] + playLineStar[0]) / 2 - playBtnWH[0] / 2 : playBtnStarX = 4 * btn + playLineStar[0];
Drawing.ractBorder([playBtnStarX, playBtnStarY], playBtnWH, "#9d9996", 1);
Drawing.ract([playBtnStarX += 1, playBtnStarY += 1], [playBtnWH[0] - 2, playBtnWH[1] - 2], mianColor);
}
play(); //鼠标滚动控制播放条
var waveGo;
var distance = 0;
var scrollFunc = function (e) {
e = e || window.event;
var mouseMove;
e.wheelDelta ? mouseMove = e.wheelDelta : mouseMove = e.detail;
if (mouseMove > 0) {
distance += 5;
if (distance >= 100) distance = 100;
}//up
if (mouseMove < 0) {
distance -= 5;
if (distance <= 0) distance = 0;
}//down
play(distance);
clearInterval(waveGo);
waveGo = setInterval(function () {
wave(distance);
}, 100)
}
if (document.addEventListener) {//firefox
document.addEventListener('DOMMouseScroll', scrollFunc, false);
}
window.onmousewheel = document.onmousewheel = scrollFunc;//IE/Opera/Chrome //三角函数曲线动画
var dong = 1, time = 1000 / 60, cango;
var wave = function (ad) {
var adjust;
ad == undefined ? adjust = 28 : adjust = ad + 15 >= 100 ? 100 : ad + 15;
console.log(adjust);
ctx.clearRect(0, 130, 600, 360);
Drawing.ract([0, 130], [600, 360], "#333333");
if (dong === 1) { cango = false; }
if (!cango && dong < 3) { dong += 1; }
if (dong === 3) { cango = true; }
if (cango && dong <= 3) { dong -= 1; }
time++;
Drawing.triCurve("sin", { x: 0, y: 238 }, { xw: adjust, yh: 5 * (1 + dong / 10), angle: Math.PI / 2, s: time / 10 }, "#ffffff");
Drawing.triCurve("cos", { x: 0, y: 238 }, { xw: adjust + 12, yh: 5 * (1 + dong / 10), angle: Math.PI / 2, s: time / 10 }, "#424242");
Drawing.triCurve("sin", { x: 0, y: 238 }, { xw: adjust + 22, yh: 5 * (1 + dong / 10), angle: Math.PI / 2, s: time / 10 }, "#5e5e5e");
Drawing.triCurve("cos", { x: 0, y: 238 }, { xw: adjust + 22, yh: 5 * (1 + dong / 10), angle: Math.PI / 2, s: time / 10 }, "#a2a2a2");
Drawing.triCurve("sin", { x: 0, y: 238 }, { xw: adjust, yh: 5 * (1 + dong / 10), angle: Math.PI / 2, s: time / 10 }, "#9a9a9a");
}
waveGo = setInterval(wave, 100)
}

最终一开始出来呈现的图像应该是,播放条居中,曲线图与实例图相似。

而我们的播放条,简单实现了利用鼠标滚动去控制曲线图的弯曲幅度。

作者:leona

原文链接:http://www.cnblogs.com/leona-d/p/6369905.html

版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接

Canvas-三角函数曲线图的更多相关文章

  1. canvas三角函数应用

    这个是圆圈旋转的简单案例 var canvas=document.getElementById("canvas"); var cxt=canvas.getContext(" ...

  2. canvas三角函数模拟水波效果

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

  3. canvas三角函数直线运动

    var canvas = document.getElementById("canvas"); var cxt = canvas.getContext("2d" ...

  4. canvas三角函数做椭圆运动效果

    <canvas id="canvas" width="800" height="400" style="background ...

  5. 安卓用canvas画曲线图

    1.新建一个常变量类Constant.java package com.rain.db; import android.graphics.Point; public class Constant { ...

  6. Android 绘制动态图

    最近准备技能大赛,需要将从传感器中读出的数据在移动客户端以图的形式绘制出来,因为平时很少绘图,于是各种查资料,算是勉强做出来了. 以下是大赛理论效果图(左)和实际效果图(右),真的是理想很丰满,现实很 ...

  7. canvas 五角星之回顾【初中三角函数】

    当程序中遇到三角函数的时候我是懵逼的,于是百度了“初中三角函数”, 忘了这几个公式的,自己打脸. 目的是通过Canvas画一个五角星, 突破口:只要能通过给定的两个外圈点的半径,和内圈点的半径,借助上 ...

  8. canvas 连线曲线图封装

    $.fn.hChart=function (opt) { var setting=$.extend({ className:'', data:[] },opt); var tbody=this; va ...

  9. canvas 连线曲线图

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name=& ...

  10. HTML5之Canvas绘图实例——曲线图

    实现正弦.余弦和正切函数画图(如下图):调试环境:Firefox

随机推荐

  1. python selenium --命令之文字范本匹配

    文字范本匹配 ======================================= 文字范本匹配其实可以理解为通配符.我想大家都用过windows 系统自带的搜索功能. *   星号代表一个 ...

  2. weblogic stuck实验2014-11-14

         以往对weblogic stuck认识是: 1.会造成系统总体慢. 2.在weblogic console中线程监控中会有显示. 3.weblogic使用队列处理线程.隔一段时间会扫描线程队 ...

  3. 【VBA研究】利用DateAdd函数取上月或上年同期的日期

    作者:iamlaosong DateAdd函数返回一个日期.这一日期加上了一个时间间隔.通过这个函数能够计算非常多我们须要的日期,比方上月上年同期日期等. 语法 DateAdd(interval, n ...

  4. cisco asa5510 配置

    anyconnect 查看vpn链接 ASA版本8.4(7)    anyconnect版本3.1  亲测sh vpn-sessiondb anyconnect  查看登录用户详情sh vpn-ses ...

  5. win 7 下vim的使用

    1.gVim74.exe ftp://ftp.vim.org/pub/vim/pc/gvim74.exe 2.vimcdoc-1.9.0-setup.exe 中文说明文档 http://211.147 ...

  6. PHP 时间与日期

    PHP提供了大量的内置函数,使开发者在时间的处理上游刃有余,大大提高了工作效率. 介绍一些常见的PHP日期和时间函数以及日期和时间的处理. 经常使用的日期和时间处理函数 函 数 说  明 checkd ...

  7. ArgumentException: Getting control x's position in a group with only x controls when doing KeyDown Aborting解决方法

    标题有点长,做Editor工具时遇到的问题.最后解决了,总结下 有可能你在界面中用了键盘事件或者其他事件,导致这个报错.官方论坛有个解释比较给力LINK 我在渲染Layout和Repaint的时候加上 ...

  8. iOS开发多线程篇 08 —GCD的常见用法

    iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...

  9. Linux svn仓库备份到Windows机器上

    Linux svn仓库备份到Windows机器上 1,需求说明,Linux作为主库(A),Windows作为本地备份库(B),要求每天将Linux库中的代码备份到本地 2,B机器上安装svn服务端 3 ...

  10. 有效提升大数据量写入excel的效率

    在开发过程中经常会有需要将数据导出到 excel 的需求,当数据量很大,达到几万甚至几十万.几百万级别的时候,如何加快生成 excel 的速度呢?首先普及一下知识背景:Excel2003 及以下版本一 ...