大学时候,有一段时间对flash比较感兴趣。去图书馆借了一本很厚很厚的falsh书籍。

翻了几页之后,就再没有往后看过。印象比较深的是作者说他用flash完成了一个龙卷风效果。

一直到现在我也没有看到那个效果。

我也曾经想过实现一下。但是大学时候的技术水平,也支撑不起这个想法。慢慢就忘记了。

偶尔间我看到了离心运动。突然就想到一个写法。

演示地址如下:

http://suohb.com/work/wind2.htm

点击查看效果

最终效果图如下:

龙卷风,我们可以看做一个向上旋转的气流。

风本身是不可见的,我们就用某个质点的移动轨迹画出来,表示风。

从上向下俯视,就是这样,一个质点做离心运动的路径。

从侧面看,是这样在,一个质点绕Y轴左右摇摆,摆动越来越大的的运动的路径。

我们就用这个来做为侧视图的效果,来做一个2D的龙卷风。

那么开始代码设计:

我们定义一个点,这个点Y轴上恒定速率运动,X轴上,向这中线方向有一个向心力G。一旦点运动超过这条中线,向心力倒转为-G。

这样就会画出上面侧视图的效果。

然后每个周期都新增一些这样的点,画出轨迹。如图;

基本上这样就已经完成了,我们不需要画出完整的路径,只要画出最新的一段就可以。

当到达一定高度之后,就将这条线慢慢移除出去。就得到最终效果

代码如下:

 <!doctype html>
<html>
<head>
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Cache-Control" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no" />
<style type="text/css">
html{
height: 100%;
}
html,body,ul,li,canvas{
margin: 0;
padding: 0;
}
</style>
</head>
<body bgcolor="#000000">
<canvas id="knife"></canvas>
</body>
<script>
var canvas = document.getElementById("knife");
canvas.style.position = "absolute" ;
canvas.style.top = 0 ;
var w = window.innerWidth ;
var h = window.innerHeight ;
canvas.width = w ;
canvas.height = h ;
var cxt = canvas.getContext("2d");
cxt.strokeStyle = "#FFF" ;
var list = [];
var G = 0.4 ;//向心加速度
var SPEED_Y = -1 ;//向上速度
var centerLine = w/2 ;//龙卷风中线
function addLine(){
var LEN = 2 ;
for(var i = 0 ;i < LEN ; i ++){
list.push({
x:w/2,
y:h/1.3,
g:G,
c:centerLine+2*Math.random(),
sx:(Math.random()-0.5)*4,
sy:SPEED_Y+0.5*(Math.random()-0.5),
len:Math.round(Math.random()*10+5),
list:[{x:w/2,y:h/1.3}]
});
}
}
function step(){
cxt.clearRect(0,0,w,h);
addLine();
var obj ;
for(var i = 0 ; i < list.length; i ++){
obj = list[i] ;
if(obj.y < h/2.5){//如果超过这个高度,就删除一个点
obj.len -- ;
if(obj.len == 0){
list.splice(i,1);
i -- ;
continue ;
}
}
obj.x += obj.sx ;
obj.y += obj.sy ;
obj.sx += obj.g ;
obj.g = obj.x > obj.c ? -G : G ;
obj.list.unshift({x:obj.x,y:obj.y});//记录下质点运动轨迹
obj.list = obj.list.slice(0,obj.len);//仅仅画出其中一段线就好
//画出所有点的连线
cxt.beginPath();
cxt.moveTo(obj.list[0].x,obj.list[0].y);
for(var j = 1 ; j < obj.list.length; j ++){
cxt.lineTo(obj.list[j].x,obj.list[j].y); }
cxt.stroke();
}
requestAnimationFrame(step);
}
requestAnimationFrame(step);
</script>
</html>

更多特效请关注公众号:

CANVAS模仿龙卷风特效的更多相关文章

  1. HTML5 canvas生成图片马赛克特效插件

    HTML5 canvas生成图片马赛克特效插件 简要教程 这是一款使用html5 canvas来将图片制作成马赛克效果的js插件.该插件的灵感来自于美国肖像画家Chuck Close.已经有人使用这个 ...

  2. Canvas与javaScript特效笔记

    第六章   Canvas与javaScript特效笔记 q  <canvas>标签的用途 HTML5 canvas 提供了通过 JavaScript 绘制图形的方法,此方法使用简单但功能强 ...

  3. canvas之背景特效

    需具备js基础知识以及canvas相关方法(可查阅相关文档) 下面是一篇有关js与canvas的背景特效 基于面向过程的思维 <!DOCTYPE html> <html> &l ...

  4. 结合canvas做雨滴特效

    雨滴特效 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...

  5. canvas星空背景特效+CSS旋转相册学习

    今天在看帖子的时候,看到了个有趣的css旋转相册,刚好之前做了一个星空背景dome,这里给大家分享下代码: 旋转相册参考:https://blog.csdn.net/gitchatxiaomi/art ...

  6. [ html canvas 模仿支付宝刮刮卡效果 ] canvas绘图属性 模仿支付宝刮刮卡效果实例演示

    <!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...

  7. canvas模仿微信抢红包功能

    1.原理:先创建一张img图片,用filter滤镜制作毛玻璃效果. 2.利用绝对定位,使canvas刚好盖在img上面. 3.利用canvas原生clip函数剪辑一个圆形. 地址:http://san ...

  8. canvas连线特效

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. canvas简单下雨特效

    前面做了两个简单的效果,这次就来个下雨的效果 思路简单的说一下 随机在屏幕中的位置画雨滴,moveTo(x,y) 雨滴的长度就是lineTo(x,y+len) 每次重新绘制页面,就能达到下雨的效果了 ...

随机推荐

  1. 线性代数-矩阵-【3】矩阵加减 C和C++实现

    点击这里可以跳转至 [1]矩阵汇总:http://www.cnblogs.com/HongYi-Liang/p/7287369.html [2]矩阵生成:http://www.cnblogs.com/ ...

  2. random模块函数分析(一)

    random是python产生伪随机数的模块,随机种子默认为系统时钟.下面分析模块中的方法: 1.random.randint(start,stop): 这是一个产生整数随机数的函数,参数start代 ...

  3. mysql数据库优化之开启慢查询日志

    进入mysql数据库,使用 show variables like 'slow_query_log'; 查看是否开启了慢查询日志 value值为OFF,则慢查询日志没有开启,在开启慢查询日志之前,我们 ...

  4. MySQL(七)MySQL常用函数

    前言 上一篇给大家介绍了,MySQL常用的操作符其实已经是非常的详细了,现在给大家分享的是MySQL的常用函数.希望对我和对大家都有帮助. 一.字符串函数 1.1.LOWER.lcase(string ...

  5. log4j使用和配置详解

    日志是应用软件中不可缺少的部分,Apache的开源项目Log4j是一个功能强大的日志组件,提供方便的日志记录.以下是个人经验,具体请参考Log4j文档指南. Log4j下载 在apache网站:htt ...

  6. 第3阶段——内核启动分析之prepare_namespace()如何挂载根文件系统和mtd分区介绍(6)

    内核启动并初始化后,最终目的是像Windows一样能启动应用程序,在windows中每个应用程序都存在C盘.D盘等,而linux中每个应用程序是存放在根文件系统里面,那么挂载根文件系统在哪里,怎么实现 ...

  7. makefile初步制作,arm-linux- (gcc/ld/objcopy/objdump)详解

    在linux中输入vi Makefile 来实现创建Makefile文件 注意:命令行前必须加TAB键 例如:将两个文件led.c和crt0.S汇编文件,制作一个Makefile文件 led.bin ...

  8. JQuery插件制作动态网页

    运用JQuery插件制作动态网页   前  言 JQuery 今天我给大家介绍一个运用JQuery插件制作的动态网页--iphone 5C 宣传页面.这个网页中运用到了fullpage.js和move ...

  9. oracle12之 多租户容器数据库架构

    解读: 这张幻灯片展示了三个被部署的应用程序的整合 三个不同的非cdbs成为一个单一的.幻灯片中的图形显示了一个多租户 容器数据库有四个容器:根和三个可插入的数据库.每一个 可插入数据库有它自己的专用 ...

  10. (八)、vpn-pptp部署

    中小型规模网站集群架构:VPN-PPTP : 矮哥linux运维群:93324526 前言: 你想管理机器吗? 你想更安全吗? 请安装VPN吧 部署 1.查看系统是否支持PPP [root@oldbo ...