mycircle

  预览地址->mycircle

  应该是最简单的canvas动画的制作,主要难点是画布的旋转,这里要用到save和restore方法。主要思路是画出一个圆,然后旋转画布,递增坐标,产生动的效果。

  碰撞后的轨迹没有进行计算。

  1 <!DOCTYPE html>
  2 <html>
  3   <head>
  4     <script type="text/javascript">
  5       window.onload = function() {
  6         var canvas = document.getElementById(‘myCanvas‘);
  7         var c = canvas.getContext(‘2d‘);
  8
  9         var len = 0;
 10         var r = 30;
 11         var x = [];
 12         var y = [];
 13         var deg = [];
 14         var addx = [];
 15         var addy = [];
 16         var adddeg = [];
 17         var allcolor = [];
 18
 19         getCircle();
 20         document.getElementById(‘btn‘).addEventListener(‘click‘, getCircle);
 21         window.setInterval(function() {gameStart();}, 1);
 22
 23         function getCircle() {
 24           len++;
 25           x.push(35);
 26           y.push(35);
 27           addx.push(1);
 28           addy.push(1);
 29           adddeg.push(1);
 30           deg.push(0);
 31           allcolor.push(getGrd());
 32         }
 33
 34         function gameStart() {
 35           c.clearRect(0, 0, 1000, 500);
 36           for(var i = 0; i < len; i++) {
 37             moving(i);
 38           }
 39           judge();
 40         }
 41
 42         function moving(i) {
 43           if(x[i] + 35 > 1000 || x[i] - 35 < 0) {
 44             addx[i] *= -1,  adddeg[i] *= -1;
 45           }
 46
 47           if(y[i] + 35 > 500 || y[i] - 35 < 0) {
 48             addy[i] *= -1, adddeg[i] *= -1;
 49           }
 50
 51           c.save();
 52           c.translate(x[i], y[i]);
 53           c.rotate(deg[i] * Math.PI / 180);
 54           c.strokeStyle = allcolor[i];
 55           c.beginPath();
 56           c.arc(0, 0, r, 0, Math.PI * 2, true);
 57           c.lineWidth = 5;
 58           c.stroke();
 59           x[i] += addx[i], y[i] += addy[i], deg[i] += adddeg[i];
 60           c.restore();
 61         }
 62
 63         function judge() {
 64           for(var i = 0; i < len; i++)
 65             for(var j = i + 1; j < len; j++) {
 66               if(getDis(x[i], y[i], x[j], y[j]) <= r * 2) {
 67                 addx[i] *= -1, addy[i] *= -1, adddeg[i] *= -1;
 68                 addx[j] *= -1, addy[j] *= -1, adddeg[j] *= -1;
 69               }
 70             }
 71         }
 72
 73         function getRandomColor() {
 74           while(true) {
 75             var a = Math.random();
 76             // case
 77             if(a < 0.2) continue;
 78             var mycolor = ‘#‘ + parseInt(a * 0xffffff).toString(16);
 79             return mycolor;
 80           }
 81         }
 82
 83         function getGrd() {
 84           var grd = c.createLinearGradient(-r, -r, r, r);
 85           grd.addColorStop(0, getRandomColor());
 86           grd.addColorStop(0.2, getRandomColor());
 87           grd.addColorStop(0.4, getRandomColor());
 88           grd.addColorStop(0.6, getRandomColor());
 89           grd.addColorStop(0.8, getRandomColor());
 90           grd.addColorStop(1, getRandomColor());
 91           return grd;
 92         }
 93
 94         function getDis(x1, y1, x2, y2) {
 95           var res = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
 96           return Math.sqrt(res);
 97         }
 98       };
 99     </script>
100   </head>
101
102   <body>
103     <canvas id=‘myCanvas‘ width=1000 height=500 style=‘background-color:black‘>
104     </canvas>
105     <input type=‘button‘ value=‘add‘ id=‘btn‘ />
106   </body>
107 </html>

  这里有几个case要解释。

  • save和restore方法以及translate和rotate方法的应用。将另写一篇说明。&& 第三点
  • 去掉第55行代码,画布将会绘制之前的所有circle。我的理解是,画布在第58行stroke时,因为没有55行的beginPath,画布会自动去寻找,默认找到第一次开始画。所以我觉得最好每次绘图前都加上beginpath以免不必要的错误出现。
  • 去掉第77行代码,报错如下:Uncaught SyntaxError: An invalid or illegal string was specified,寻找后也就是addColorStop的第二个参数异常。这个错误我百思不得,之前加上这行代码是因为怕取色跟黑色太近看不清,没想过语法上的错误,思考后暂时觉得是当random出的数字跟0无限接近时出现的错误。

  

时间: 2024-11-09 06:02:40

mycircle的相关文章

C++传智笔记(5):C++完整demo

MyPoint.h #pragma once class MyPoint { private: double x0, y0; //点坐标 public: void setPoint(double x, double y); double getX0(); double getY0(); }; MyPoint.cpp #include "MyPoint.h" void MyPoint::setPoint(double x, double y) { x0 = x; y0 = y; } do

类的封装和访问控制

#include <iostream> #define pi 3.14 using namespace std; class myCircle { // 修饰的属性和方法只能在类的内部访问,不能在类的外部访问 private: int m_r; double m_s; // 修饰的属性和方法可以在类的内部访问,也可以在类的外部访问 public: int getR(){ return m_r; } void setR(int r){ m_r = r; } double getS(){ retu

【C/C++学院】(5)面向对象编程练习--h和cpp分开编写

抽象一个点,一个圆,并判断点与圆的关系.(在圆内还是圆外) h文件进行类的声明: cpp文件为类的实现细节:主要注重的细节为: ================================================================================================================================= 工程代码如下: //MyCircle.h #pragma once #include"MyPoint.h&quo

C#程序设计----&gt;计算圆面积windows程序

值得说的就是添加一个回车事件, http://blog.csdn.net/nanwang314/article/details/6176604 private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { if(e.KeyCode==Keys.Enter) { MessageBox.Show("您在textBox1里按下了回车键"); } } 这个样子就可以添加一个回车事件…………

网易云课堂_C++程序设计入门(下)_第8单元:年年岁岁花相似– 运算符重载_第8单元 - 作业2:OJ编程 - 重载数组下标运算符

第8单元 - 作业2:OJ编程 - 重载数组下标运算符 查看帮助 返回 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩. 练习数组下标运算符重载 依照学术诚信条款,我保证此作业是本人独立完成的. 1 练习数组下标运算符重载(6分) 本题目具体内容请参见 [第8单元 - 单元作业2说明] 时间限制:500ms内存限制:32000kb #include <iostream> #in

[Node.js] Exporting Modules in Node

In this lesson, you will learn the difference between the exports statement and module.exports. Two examples are demonstrated, each accomplishing the same task but one using export statements and one using module.exports. You will also learn the basi

三天学会HTML5——SVG和Canvas的使用

在第一天学习了HTML5的一些非常重要的基本知识,今天将进行更深层学习 首先来回顾第一天学习的内容,第一天学习了新标签,新控件,验证功能,应用缓存等内容. 第2天将学习如何使用Canvas 和使用SVG 实现功能 Lab1—— 使用Canvas Canvas 是指定了长度和宽度的矩形画布,我们将使用新的HTML5 JavaScript,可使用HTML5 JS API 来画出各种图形. 初始化 1. 创建HTML页面 <html> <head></head> <bo

ANDROID L——Material Design详解(视图和阴影)

转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: 昨天凌晨Google刚刚确认Android L就是Android Lollipop(5.0). Google之前就已经提前推出了Android L Developer Preview(开发者预览版)来帮助开发者更快的了解Android特性,而不久前也推出了64位的模拟器镜像,而且首次搭载Android L系统的Nexus 6和 Nexus 9也即将上市. 相信And

16java任务一

1.需要掌握的技术 php,html,css,dreamweaver,mycircle数据库,以及环境的配置 2.程序源代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/