html5中canvas正弦波运动示例详解

一. 需求:

要求:让小球沿着正弦波运动。

小球的构造函数如下:

// 圆球的构造函数
function Ball(radius, color) {
    if(radius === undefined) { radius = 40; }
    if(color === undefined) { color = "#ff0000"; }
    this.x = 0;
    this.y = 0;
    this.radius = radius;
    this.rotation = 0;
    this.scaleX = 1;
    this.scaleY = 1;
    this.color = color;
    this.lineWidth = 1;
}
Ball.prototype.draw = function(context) {
    context.save();
    context.translate(this.x, this.y);
    context.rotate(this.rotation);
    context.scale(this.scaleX, this.scaleY);
    context.lineWidth = this.lineWidth;
    context.fillStyle = this.color;
    context.beginPath();
    context.arc(0, 0, this.radius, 0, Math.PI * 2, true);
    context.closePath();
    context.fill();
    if(this.lineWidth > 0) {
        context.stroke();
    }
    context.restore();
}

二. 思路分析:

正弦波的实现可以使用正弦函数Math.sin(angle)绘制。其中,angle值作为变量并递增时,即可使物体按正弦曲线运动,从而实现正弦波动画。

 


过程如下:

(function drawFrame() {
    window.requestAnimationFrame(drawFrame, canvas);
    ball.y = Math.sin(angle) * range;
    angle += speed;
    ball.draw(context);
})();

可以在控制台中输出以下代码,了解下正弦波的数值分布:

var fullRadians = Math.PI * 2;
for(var angle = 0; angle < fullRadians; angle += 0.01) {
    console.log(Math.sin(angle));
}

三. 实例:

代码:

<canvas id="canvas" width="400" height="400" style="background: #ccc;"></canvas>

window.onload = function() {
    var canvas = document.getElementById("canvas"),
        context = canvas.getContext("2d"),
        ball = new Ball(2),
        angle = 0,
        range = 50,
        speed = 0.1,
        isFoward = true;

        ball.x = 0;
        ball.y = canvas.height / 2;
        ball.lineWidth = 0;

    (function drawFrame() {
        window.requestAnimationFrame(drawFrame, canvas);
        // context.clearRect(0, 0, canvas.width, canvas.height);
        ball.y = canvas.height / 2 + Math.sin(angle) * 100;
        if(isFoward) {
            ball.x += speed * 20;
        } else {
            ball.x -= speed * 20;
        }

        if(ball.x > canvas.width) {
            isFoward = false;
            context.clearRect(0, 0, canvas.width, canvas.height);
        } else if(ball.x < 0) {
            isFoward = true;
            context.clearRect(0, 0, canvas.width, canvas.height);
        }
        angle += speed;
        ball.draw(context);
    })();
};

四. 总结:

创建正弦波的方法,就是使用正弦函数Math.sin(angle)求值,并让弧度值angle根据运动时间递增。

创建正弦波的公式如下:

/**
 * range:正选的波峰值
 * center:y轴的交点
 * speed:正弦波的运动速度
 * angle:弧度值,递增的变量
*/
(function drawFrame() {
    window.requestAnimationFrame(drawFrame, canvas);

    valeue = center + Math.sin(angle) * range;
    angle += speed;
})();

时间: 2024-10-27 00:11:38

html5中canvas正弦波运动示例详解的相关文章

HTML5中meta属性的使用详解

meta属性在HTML中占据了很重要的位置.如:针对搜索引擎的SEO,文档的字符编码,设置刷新缓存等.虽然一些网页可能没有使用meta,但是作为正规军,我们还是有必要了解一些meta的属性,并且能够熟练使用它们. 1.声明文档使用的字符编码 <meta charset='utf-8'> 2.声明文档的兼容模式 <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 指示IE以目前可用的最

HTML5中localStorage与sessionStorage使用详解

 1,Web存储介绍 HTML5的Web存储功能是让网页在用户计算机上保存一些信息.Web存储又分为两种: (1)本地存储,对应 localStorage 对象.用于长期保存网站的数据,并且站内任何页面都可以访问该数据. (2)会话存储,对应 sessionStorage 对象.用于临时保存针对一个窗口(或标签页)的数据.在访客关闭窗口或者标签页之前,这些数据是存在的,而关闭之后就会被浏览器删除. 2,本地存储与会话存储的异同 (1)本地存储和会话存储的操作代码完全相同,它们的区别仅在于数据的寿

html5中canvas脉冲运动示例

模拟球形的脉冲运动. 小球的构造函数如下: // 圆球的构造函数 function Ball(radius, color) {     if(radius === undefined) { radius = 40; }     if(color === undefined) { color = "#ff0000"; }     this.x = 0;     this.y = 0;     this.radius = radius;     this.rotation = 0;    

jQuery中ajax - post() 方法实例详解_AJAX相关

在jquery中的ajax有二个数据发送模式,一种是get,另一种是post(). jQuery Ajax 参考手册 实例 请求 test.php 网页,忽略返回值: $.post("test.php"); TIY 实例 通过 AJAX POST 请求改变 div 元素的文本: $("input").keyup(function(){ txt=$("input").val(); $.post("demo_ajax_gethint.asp

jQuery中ajax - post() 方法实例详解

在jquery中的ajax有二个数据发送模式,一种是get,另一种是post(). jQuery Ajax 参考手册 实例 请求 test.php 网页,忽略返回值: $.post("test.php"); TIY 实例 通过 AJAX POST 请求改变 div 元素的文本: $("input").keyup(function(){ txt=$("input").val(); $.post("demo_ajax_gethint.asp

JavaScript中的ajax功能的概念和示例详解_javascript技巧

AJAX即"Asynchronous Javascript And XML"(异步JavaScript和XML). 个人理解:ajax就是无刷新提交,然后得到返回内容. 对应的不使用ajax时的传统网页如果需要更新内容(或用php做处理时),必须重载整个网页页面. 示例: html代码如下 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>

JavaScript中自带的 reduce()方法使用示例详解_javascript技巧

1.方法说明 , Array的reduce()把一个函数作用在这个Array的[x1, x2, x3...]上,这个函数必须接收两个参数,reduce()把结果继续和序列的下一个元素做累积计算,其效果就是: [x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4) 2. 使用示例 'use strict'; function string2int(s){ if(!s){ alert('the params empty'); return; } if

html5视频video与声频audio详解

html5视频video与声频audio详解      在html5中出现了一些新特性: canvas 元素 视频 video 和 声频audio 元素 : 对本地离线存储(localstorage,sessionstorage)的支持 : 新增特殊内容元素:article.footer.header.nav.section : 新增表单控件: calendar.date.time.email.url.search .     今天看看视频和声频:在html5中规定了视频的标准方法:video

JavaScript中的replace()方法使用详解

  这篇文章主要介绍了JavaScript中的replace()方法使用详解,是JS入门学习中的基础知识,需要的朋友可以参考下 该方法找到一个正则表达式的字符串之间的匹配,并取代了匹配的子带的新的子串. 替换字符串可以包含以下特殊替换模式: 语法 ? 1 string.replace(regexp/substr, newSubStr/function[, flags]); 下面是参数的详细信息: regexp : 一个RegExp对象.匹配被替换参数的返回#2. substr : 一个字符串,由