预览地址:http://bl.ocks.org/chengquan223/raw/505d935f54bf0fe86195642464e77ce7/

<style type="text/css">canvas {margin: 20px 0;}
</style><h1>小蝌蚪模拟风场</h1>
<canvas id="canvas" width=700 height=500 style="border: 1px solid #ccc;"></canvas>

html、css

javascript

<script>$(function () {var Arrow = function (x, y, angle, speed, alive) {this.x = x;this.y = y;this.angle = angle; //游走方向this.swingAngle = 6; //尾巴摆动角度this.speed = speed || 8; //小蝌蚪长度来代表速度this.alive = alive || true; //是否活着this.liveLength = Math.random() * 10 + 20; //生命长度
        };self.init = function () {this.canvas = document.getElementById('canvas');this.ctx = canvas.getContext('2d');this.cw = this.canvas.width;this.ch = this.canvas.height;this.arrows = this.initArrows();};self.initArrows = function () {var count = 200, arrowArray = [], arrow = {};while (count--) {arrow = new Arrow(Math.random() * this.cw, Math.random() * this.ch, Math.random() * 360, 8, true);arrowArray.push(arrow);}return arrowArray;};self.createArrows = function () {this.ctx.clearRect(0, 0, this.cw, this.ch);var i = this.arrows.length;while (i--) {var arrow = this.arrows[i];arrow.reset();arrow.alive ? arrow.draw() : arrow.relive();}};Arrow.prototype.reset = function () {this.liveLength--;if (this.liveLength <= 0) {this.alive = false;}if (this.x < 0 || this.y < 0 || this.x > self.cw || this.y > self.ch) {this.alive = false;}};Arrow.prototype.draw = function () {var ex = ey = 0;ex = this.x - this.speed * Math.sin((180 - this.angle + this.swingAngle) * (Math.PI / 180)); //↓0°←90°ey = this.y - this.speed * Math.cos((180 - this.angle + this.swingAngle) * (Math.PI / 180));ctx.beginPath();ctx.translate(0, 0, 0); //坐标源点ctx.moveTo(this.x, this.y);ctx.lineTo(ex, ey);ctx.fill();ctx.stroke();ctx.save();ctx.translate(ex, ey);//我的箭头本垂直向下,算出直线偏离Y的角,然后旋转 ,rotate是顺时针旋转的,所以加个负号var ang = (ex - this.x) / (ey - this.y);ang = Math.atan(ang);ey - this.y >= 0 ? ctx.rotate(-ang) : ctx.rotate(Math.PI - ang);//加个180度,反过来ctx.lineTo(-2, -2);ctx.lineTo(0, -3);ctx.lineTo(2, -2);ctx.lineTo(0, 0);ctx.fill(); //箭头是个封闭图形ctx.restore(); //用来恢复Canvas之前保存的状态,否则会影响后续绘制
            ctx.closePath();this.x = ex; //终点当起点this.y = ey;this.swingAngle *= -1; //摆动角度正反互换
        };Arrow.prototype.relive = function () {this.alive = true;this.x = Math.random() * self.cw;this.y = Math.random() * self.ch;this.liveLength = Math.random() * 20;};var animateArrow = function () {self.createArrows();};self.init();animateArrow();var timer = setInterval(animateArrow, 170);});
</script>

转载于:https://www.cnblogs.com/my-codelife/p/5180234.html

canvas画小蝌蚪模拟气象风场相关推荐

  1. html5用canvas画小黄人

    初学者,用canvas画小黄人 <script>window.onload=function(){var c=document.getElementById("people&qu ...

  2. canvas画小黄人

    效果 1.准备画布 <canvas id="canvas" width="1200" height="1000"></ca ...

  3. 用HTML5图形拼成的画房子,canvas画小房子(补充:简陋的小房子)

    小房子 #cvs{ background:pink; } 您的浏览器不支持canvas标签! var canvas=document.getElementById("cvs"); ...

  4. 微信小程序中base64格式的小程序码通过canvas画出来无效

    使用场景 小程序中的文章详情页面有一个分享功能:用户点击分享按钮,生成一张分享图片(包括封面图,简介以及带有文章ID的小程序码),方便用户保存在本地. 问题说明 小程序码通过后台接口获取,格式如下:' ...

  5. 关于星空的java小程序_[Java教程]小程序使用Canvas画饼图_星空网

    小程序使用Canvas画饼图 2018-10-24 0 先上效果图 -------------------------------------------------------------w --- ...

  6. 【修复日常bug】微信小程序canvas画商品海报出现个别用户无法生成的情况

    微信小程序,在使用canvas画海报的时候,会导致个别用户无法生成的情况,你们可以尝试把绘画某些块的代码注释掉再进行扫码调试,我前几天就遇到个别客户无法生成商品海报的情况,刚开始是以为上一个同事留的坑 ...

  7. 微信小程序canvas画价格走势图(三)

    今天继续更新在微信小程序上用canvas画价格走势图.上一篇讲了图上主要的部分,也就是折线图的绘制.假如我在我的绘图主函数中只调用了绘制折线图的函数,效果是这样的: 可以说除了作为坐标背景的<i ...

  8. 微信小程序canvas画价格走势图(一)

    今天是周二,今天来开一个新坑吧.最近花了整整两个工作日的时间画了一个微信小程序端的价格走势图,现在来分享一下经验. 因为内容比较多,所以打算这次分为多篇博客来写,这样一篇博客的内容就会更少.更清晰.下 ...

  9. 微信小程序canvas画价格走势图(五)

    最近比较忙,所以趁着今年的最后一个周末,来把最后两篇完结掉.这是倒数第二篇了,这一篇的内容很简单,讲的是细节的绘制,也就是底部的刻度线和日期的绘制,以及一个小小的总结. 目前我们完成了canvas的准 ...

最新文章

  1. 科研文献|圈养和类人猿微生物组的共同多样化
  2. 网络管理员在预先分配和识别作为_14个网络管理员必备的最佳网络流量分析工具,收藏了...
  3. php if语句的缩写 实例
  4. 进程调度优先级JAVA_进程调度算法之短进程优先(Java)
  5. JavaScript之 函数
  6. 判断某一点是否在三角形内
  7. 416. Partition Equal Subset Sum
  8. Dijkstra算法python可视化实现
  9. 数字信号处理的fpga实现_数字信号处理的卷积运算实现
  10. 傅立叶变换变换matlab,希尔伯特变换和傅里叶变换MATLAB仿真
  11. 【渝粤教育】电大中专电商运营实操 (2)_1作业 题库
  12. Ubuntu虚拟机如何与主机复制粘贴?
  13. 1374:铲雪车(snow)
  14. riser服务key/value服务介绍-基于leveldb
  15. 计算机数据库三级考模拟试题,计算机三级考试《数据库技术》试题与答案
  16. telegraf 使用 inputs.exec插件收集监控数据
  17. ES(三)es查询语法
  18. JAVA我的世界给op_我的世界手机版op指令大全 op指令怎么用
  19. vivado基本使用流程(六、下载到开发板并且调用ILA抓信号)
  20. #分治#poj 2083 Fractal

热门文章

  1. 任正非:发展芯片,光砸钱不行,还要砸人
  2. Exceptional C++ 目录
  3. 微软开发者系列讲座下载
  4. [万字专访] 揭秘“加密猫”背后的故事和”Flow”的杀手锏
  5. 物联网新产品 | 凸版推出可远距离通讯的有源标签“ZETag”
  6. 查看AppStore中App的Appid
  7. 零基础入门PostgreSQL
  8. 《塞尔达传说:天空之剑》模拟器更新操控优化
  9. mysql连接池测试_Tomcat+mysql连接池的配置与测试
  10. C# 字体对话框 颜色对话框