1.绕椭圆轨道旋转的圆球

在Canvas画布中绘制一个椭圆,然后在椭圆上绘制一个用绿色填充的实心圆。之后每隔0.1秒刷新,重新绘制椭圆和实心圆,重新绘制时,实心圆的圆心坐标发生变化,但圆心坐标仍然位于椭圆曲线上。这样,可以得到绕椭圆轨道旋转的圆球动画。

编写如下的HTML代码。

<!DOCTYPE html>

<head>

<title>绕椭圆轨道旋转的圆球</title>

<script type="text/javascript">

var context;

var width,height;

var i;

function draw(id)

{

var canvas = document.getElementById(id);

if (canvas == null)

return false;

context = canvas.getContext('2d');

width=canvas.width;

height=canvas.height;

i=0;

setInterval(move,100);

}

function move()

{

context.clearRect(0,0,width,height);

var dig=Math.PI/24;

context.beginPath();

context.strokeStyle="green";

context.ellipse(150,150,120,60,0,0,Math.PI*2,true);

context.stroke();

context.closePath();

var x=120*Math.sin(i*dig)+150;

var y=60*Math.cos(i*dig)+150;

context.beginPath();

context.arc(x,y,10,0,Math.PI*2,true);

context.fillStyle = "red";

context.fill();

context.closePath();

i=i+1;

if (i>=48) i=0;

}

</script>

</head>

<body onload="draw('myCanvas');">

<canvas id="myCanvas" width="300" height="300" style="border:3px double #996633;"></canvas>

</canvas>

</body>

</html>

将上述HTML代码保存到一个html文本文件中,再在浏览器中打开包含这段HTML代码的html文件,可以看到在浏览器窗口中呈现出绕椭圆轨道旋转的圆球。

图1  绕椭圆轨道旋转的圆球

2.网的绘制

设立坐标计算公式为:

X=R*SIN(α)

Y=R*COS(α*0.9)

再用循环依次取α值为0~20(每次增量为0.02),计算出X和Y,在canvas画布中将坐标点(X,Y)用线连起来,可绘制出一个曲线图形。

编写HTML文件如下:

<!DOCTYPE html>

<head>

<title>网的绘制</title>

<script type="text/javascript">

function draw(id)

{

var canvas=document.getElementById(id);

if (canvas==null)

return false;

var context=canvas.getContext('2d');

context.fillStyle="#EEEEFF";

context.fillRect(0,0,400,300);

context.strokeStyle="red";

context.lineWidth=2;

context.beginPath();

var r=150;

for (var i=0;i<1000;i++)

{

var x = Math.sin(i*0.02)*r+200;

var y = Math.cos(i*0.02 * 0.9)*r+150;

if (i==0)

{

context.moveTo(x,y);

}

else

context.lineTo(x,y);

}

context.stroke();

}

</script>

</head>

<body onload="draw('myCanvas');">

<canvas id="myCanvas" width="400" height="300">您的浏览器不支持canvas!

</canvas>

</body>

</html>

将上述HTML代码保存到一个html文本文件中,再在浏览器中打开包含这段HTML代码的html文件,可以看到在浏览器窗口中绘制出如图2所示的图形。若修改语句“for (var i=0;i<1000;i++)”为“for (var i=0;i<3600;i++)”,保存后重新在浏览器中打开,可以看到在浏览器窗口中绘制出如图3所示的图形。

图2  连接1000个点绘制的图形

图3  连接3600个点绘制的网

3.网的编织

我们可以将网的绘制过程进行动态展示,编写HTML文件如下。

<!DOCTYPE html>

<head>

<title>网的编织(一)</title>

<script type="text/javascript">

var context;

var i;

function draw(id)

{

var canvas = document.getElementById(id);

if (canvas == null)

return false;

context = canvas.getContext('2d');

context.fillStyle="#EEEEFF";

context.fillRect(0,0,400,300);

i=0;

setInterval(go,0.1);

}

function go()

{

context.strokeStyle="red";

context.lineWidth=2;

var x = Math.sin(i*0.02)*150+200;

var y = Math.cos(i*0.02 * 0.9)*150+150;

context.beginPath();

context.arc(x, y, 3, 0, 2 * Math.PI);

context.fillStyle = "red";

context.fill();

i=i+1;

if (i>=3600)

{

i=0;

context.clearRect(0,0,400,300);

}

}

</script>

</head>

<body onload="draw('myCanvas');">

<canvas id="myCanvas" width="400" height="300" style="border:3px double #996633;"></canvas>

</body>

</html>

在浏览器中打开包含这段HTML代码的html文件,可以看到在浏览器窗口中网的编织动画,如图4所示。

图4 网的编织(一)

我们可以取系统当前时间计算点的坐标,并且圆的填充颜色进行两种颜色的切换,编写HTML文件如下。

<!DOCTYPE html>

<html>

<head>

<title>网的编织(二)</title>

<body>

<canvas id="myCanvas" width="400" height="400" style="border:3px double #996633;"></canvas>

<script type="text/javascript">

var canvas = document.getElementById('myCanvas');

var context = canvas.getContext('2d');

var flag=1;

function animate() {

window.requestAnimationFrame(animate);

draw();

}

function draw() {

var time = new Date().getTime() * 0.002;

var x = Math.sin(time)*180+200;

var y = Math.cos(time * 0.9)*180+200;

flag = !flag;

context.fillStyle = flag ? 'rgb(200,200,10)' : 'rgb(10,10,200)';

context.beginPath();

context.arc(x, y, 10, 0, Math.PI*2, true);

context.closePath();

context.fill();

}

animate();

</script>

</body>

</html>

在浏览器中打开包含这段HTML代码的html文件,可以看到在浏览器窗口中网的编织另一种动画,如图5所示。

图5  网的编织(二)

JavaScript动画实例:旋转的圆球的更多相关文章

  1. JavaScript动画实例:李萨如曲线

    在“JavaScript图形实例:阿基米德螺线”和“JavaScript图形实例:曲线方程”中,我们学习了利用曲线的方程绘制曲线的方法.如果想看看曲线是怎样绘制出来的,怎么办呢?编写简单的动画,就可以 ...

  2. JavaScript动画实例:递归分形图动态展示

    在“JavaScript图形实例:SierPinski三角形” 和“JavaScript图形实例:Levy曲线及其变形”等文章中我们介绍了通过递归生成分形图形的方法.我们可以将绘制的分形图形每隔一定的 ...

  3. JavaScript动画实例:曲线的绘制

    在“JavaScript图形实例:曲线方程”一文中,我们给出了15个曲线方程绘制图形的实例.这些曲线都是根据其曲线方程,在[0,2π]区间取一系列角度值,根据给定角度值计算对应的各点坐标,然后在计算出 ...

  4. JavaScript动画实例:旋转的正三角形

    给定一个正三角形的重心坐标为(x0,y0),高为h,可以用如下的语句绘制一个底边水平的正三角形. ctx.beginPath(); ctx.moveTo(x0,y0-h*2/3); ctx.lineT ...

  5. CSS动画实例:小圆球的海洋

    CSS背景属性用于定义HTML元素的背景,在CSS提供的背景属性中, background-image:指定要使用的一个或多个背景图像: background-color:指定要使用的背景颜色: ba ...

  6. JavaScript动画实例:动感小球

    已知圆的坐标方程为: X=R*SIN(θ) Y=R*COS(θ)     (0≤θ≤2π) 将0~2π区间等分48段,即设定间隔dig的值为π/24.θ初始值从0开始,按曲线方程求得坐标值(x,y), ...

  7. JavaScript动画实例:螺旋线

    数学中有各式各样富含诗意的曲线,螺旋线就是其中比较特别的一类.螺旋线这个名词来源于希腊文,它的原意是“旋卷”或“缠卷”.例如,平面螺旋便是以一个固定点开始向外逐圈旋绕而形成的曲线.在2000多年以前, ...

  8. JavaScript动画实例:沿五角星形线摆动的小圆

    五角星形线的笛卡尔坐标方程式可设为: r=10+(3*sin(θ*2.5))^2  x=r*cos(θ) y=r*sin(θ)              (0≤θ≤2π) 根据这个曲线方程,在[0,2 ...

  9. JavaScript动画实例:运动的字母特效

    已知圆的坐标方程为: X=R*SIN(θ) Y=R*COS(θ)     (0≤θ≤2π) 给定初始坐标位置(X,Y),按照圆的坐标方程,从角度angle = 0开始,每间隔angleSpeed = ...

随机推荐

  1. AE ArcEngine10.4+vs2012安装配置

    准备内容 安装环境:win10*64位专业版,ArcGIS_Desktop_1041_151727,C#语言环境,visual studio2012 安装文件:ArcGIS_Engine_1041_1 ...

  2. 20191107-5 beta week 2/2 Scrum立会报告+燃尽图 04

    此作业的要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9957 一.小组情况 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 韩 ...

  3. element 根据某一个属性合并列

    通过 span-method 绑定方法 objectSpanMethod方法 this.getSpanArr(this.tableData); //this.tableData 指接口取到的数据 // ...

  4. Oracle 分区表管理之组合分区(分区索引失效与性能比较)

    整体结构如下: Oracle  分区表管理之组合分区(分区索引失效与性能比较) 虽然老早就使用了分区表,终于有时间写有关分区表的内容:不是所有的场景数据量变大需要用到分区表,一般单表数据超过2g可以考 ...

  5. vue学习笔记(九)vue-cli中的组件通信

    前言 在上一篇博客vue学习笔记(八)组件校验&通信中,我们学会了vue中组件的校验和父组件向子组件传递信息以及子组件通知父组件(父子组件通信),上一篇博客也提到那是对组件内容的刚刚开始,而本 ...

  6. day 39 盒模型 display 浮动

    一.盒模型 属性: width:内容的宽度 height:内容的高度 padding:内边距 内容到边框的距离 border:边框 margin:外边距 另一个边到另一个边的距离 盒模型的计算: 总结 ...

  7. diff()函数的使用

    1.diff():返回略微迭代(lagged)的或滞后的不同(iterated diferences). > x<-cumsum(cumsum(1:10)) > x [1] 1 4 ...

  8. Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题【转】

    Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题 http://blog.didispace.com/Spring-Boot-And-Feign- ...

  9. shell脚本sed awk

    删除第一行 sed '1d' test.txt 假装执行 sed -i '1d' test.txt 执行 从第二行删除到行尾 sed '2,$d' test.txt sed -i '2,$d' tes ...

  10. 面试官:如果 http 响应头中 ETag 值改变了,是否意味着文件内容一定已经更改

    本篇文章由我的 一日一题 中的四个 Issue 组合而成 [Q111]http 响应头中的 ETag 值是如何生成的 [Q112]如果 http 响应头中 ETag 值改变了,是否意味着文件内容一定已 ...