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

我们可以将曲线的绘制过程动态展示出来。

例如,对于星形线的绘制,编写如下的HTML代码。

<!DOCTYPE>

<html>

<head>

<title>星形线的绘制</title>

</head>

<body>

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

</canvas>

<script>

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

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

ctx.clearRect(0,0,300,300);

var theta=0;

var dig=Math.PI/256;

function motion()

{

ctx.beginPath();

var x = 80*Math.cos(theta)*Math.cos(theta)*Math.cos(theta)+150;

var y = 80*Math.sin(theta)*Math.sin(theta)*Math.sin(theta)+150;

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

ctx.closePath();

ctx.fillStyle = "red";

ctx.fill();

theta=theta+dig;

if (theta>2*Math.PI)

{

theta=0;

ctx.clearRect(0,0,300,300);

}

}

setInterval('motion()',20);

</script>

</body>

</html>

在浏览器中打开包含这段HTML代码的html文件,可以在浏览器窗口中看到星形线的动态绘制过程,如图1所示。

图1  星形线的绘制

将上面程序中的语句

var x = 80*Math.cos(theta)*Math.cos(theta)*Math.cos(theta)+150;

var y = 80*Math.sin(theta)*Math.sin(theta)*Math.sin(theta)+150;

改写为:

x = 8*(16*Math.pow(Math.sin(theta),3))+150;

y= 150-8*(13*Math.cos(theta)-5*Math.cos(2*theta)-2*Math.cos(3*theta)-Math.cos(4*theta));

就可以在画布中看到如图2所示的心型线的动态绘制过程。

图2  心型线的绘制

对于更多的曲线,均可以如同心型线一样,根据其参数方程,适当修改坐标位置(x,y)的计算语句即可。

为此,编写如下的HTML代码。

<!DOCTYPE>

<html>

<head>

<title>曲线的绘制</title>

</head>

<body>

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

</canvas>

<form><br/>

<input id="R1" name="spiral" type="radio" checked onclick="go()" />星形线<br/><br/>

<input id="R2" name="spiral" type="radio" onclick="go()" />心型线<br/><br/>

<input id="R3" name="spiral" type="radio" onclick="go()" />玫瑰线<br/><br/>

<input id="R4" name="spiral" type="radio" onclick="go()" />太阳线<br/><br/>

<input id="R5" name="spiral" type="radio" onclick="go()" />六瓣花型线<br/><br/>

</form>

<script>

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

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

var a=0;

function motion()

{

if(document.getElementById('R1').checked)

{

dig=Math.PI/128;

x = 80*Math.cos(a)*Math.cos(a)*Math.cos(a)+150;

y = 80*Math.sin(a)*Math.sin(a)*Math.sin(a)+150;

}

if(document.getElementById('R2').checked)

{

dig=Math.PI/128;

x = 8*(16*Math.pow(Math.sin(a),3))+150;

y= 150-8*(13*Math.cos(a)-5*Math.cos(2*a)-2*Math.cos(3*a)-Math.cos(4*a));

}

if(document.getElementById('R3').checked)

{

dig=Math.PI/400;

x=150+100 * Math.sin(4*a)*Math.cos(a);

y=150+100 * Math.sin(4*a)*Math.sin(a);

}

if(document.getElementById('R4').checked)

{

dig=Math.PI/720;

r=15*Math.cos(30*a)+12;

x = 150+5*r*Math.cos(a);

y = 150+5*r*Math.sin(a);

}

if(document.getElementById('R5').checked)

{

dig=Math.PI/512;

r=100*(1+Math.sin(18*a)/5)*(0.5+Math.sin(6*a)/2);

x=150+r*Math.cos(a);

y=150+r*Math.sin(a);

}

ctx.beginPath();

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

ctx.closePath();

ctx.fillStyle = "red";

ctx.fill();

a=a+dig;

if (a>2*Math.PI)

{

a=0;

ctx.clearRect(0,0,300,300);

}

}

function go()

{

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

a=0;

setInterval('motion()',30);

}

go();

</script>

</body>

</html>

在浏览器中打开包含这段HTML代码的html文件,可以在浏览器窗口中看到5种曲线绘制的动画效果,如图3所示。更多曲线的绘制,大家可以根据选定的曲线方程自行添加相应代码即可。

图3  曲线绘制动画

JavaScript动画实例:曲线的绘制的更多相关文章

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

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

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

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

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

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

  4. JavaScript动画实例:旋转的圆球

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

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

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

  6. JavaScript动画基础:canvas绘制简单动画

    动画是将静止的画面变为动态的艺术.实现由静止到动态,主要是靠人眼的视觉残留效应.视觉残留也叫视觉暂留现象,物体在快速运动时, 当人眼所看到的影像消失后,人眼仍能继续保留其影像0.1~0.4秒左右的图像 ...

  7. JavaScript动画实例:螺旋线

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

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

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

  9. JavaScript动画实例:炸开的小球

    1.炸开的小球 定义一个小球对象类Ball,它有6个属性:圆心坐标(x,y).小球半径radius.填充颜色color.圆心坐标水平方向的变化量speedX.圆心坐标垂直方向的变化量speedY. B ...

随机推荐

  1. numpy矩阵相加时需注意的一个点

    今天在进行numpy矩阵相加的时候出现了一个小的奇怪的地方,下面我们来看看: >>>P = np.array([1,2,3,4]) >>>F = np.array( ...

  2. 一起玩转微服务(10)——spring boot介绍

    对于Spring,相信大家都非常熟悉,从出现开始,一直是企业级开发的主流.但是随着软件的发展和应用开发的不断演化,它的一些缺点也逐渐胡暴露了出来,下面,我们就一起看一下Spring的发展历程并且认识一 ...

  3. 初识MQ消息队列

    MQ 消息队列 消息队列(Message Queue)简称MQ,是阿里巴巴集团中间件技术部自主研发的专业消息中间件. 产品基于高可用分布式集群技术,提供消息发布订阅.消息轨迹查询.定时(延时)消息.资 ...

  4. 为什么 char c = 'A';c += 32; 结果输出的是 'a'?

    首先 char 类型的数据只要参与运行会先转换为 int 类型数值(在 ASCII 编码表中 'A' 对应十进制的 65),那么 'A' 转换为 int 为 65,65 + 32 = 97,+= 包含 ...

  5. SQL注入之sqlmap进阶

    上一篇我们对sqlmap进行简单的介绍,并介绍了一些·sqlmap的基础用法,这篇让我们来更深入的了解一下sqlmap,了解一下它的强大功能. 探测等级 参数为 --level 在sqlmap中一共有 ...

  6. Centos7上设置zookeeper自启动

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/zhouzhiwengang/artic ...

  7. 打包发布 Qt Quick/Widgets 程序

    使用的QT自带的部署工具(windeployqt.exe,路径QT安装路径),版本替换debug/release Qt Quick "C:\Qt\Qt5.8.0\5.8\mingw53_32 ...

  8. debian10 安装 详解

    准备 下载debian 下载页面,有3个iso,选择第一个,其他两个软件包,我们不需要. 制作启动盘 debian官方提供了一个工具,可以轻松制作启动盘,也可以用opensuse官方提供的一个工具ru ...

  9. Windows高DPI系列控件(二) - 柱状图

    目录 一.QCP 二.效果展示 三.高DPI适配 1.自定义柱状图 2.新的柱状图 3.测试代码 四.相关文章 原文链接:Windows高DPI系列控件(二) - 柱状图 一.QCP QCP全称QCu ...

  10. fastjson到底做错了什么?为什么会被频繁爆出漏洞?

    GitHub 15.8k Star 的Java工程师成神之路,不来了解一下吗! GitHub 15.8k Star 的Java工程师成神之路,真的不来了解一下吗! GitHub 15.8k Star ...