在“JavaScript图形实例:四瓣花型图案”和“JavaScript图形实例:蝴蝶结图案”中,我们绘制图形时,主要采用的方法是先根据给定的曲线参数方程计算出两点坐标,然后将两点用线段连接起来,线段的集合会构成一幅幅精美的图形。下面我们继续给出一些用线段构造图形的实例,供大家欣赏和借鉴。

1.莫尔花纹图案

设定曲线的坐标方程为:

b=r*(1+ sin(2.5*θ)/2);

x1=b*cos(θ);

x2=b*cos(θ+π/4);

y1=b* sin(θ);

y2=b* sin(θ+π/4);       (0≤θ≤4π)

在0~4π区间中从θ=0开始,每隔π/180按曲线方程求得两个点的坐标值(x1,y1)和(x2,y2),并将求得的两点连成一条线段,这样,可以绘制出莫尔花纹图案。

编写如下的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=1;

context.beginPath();

for (i=0;i<=720;i++)

{

a=i*Math.PI/180;

e=100*(1+Math.sin(2.5*a)/2);

x1=200+e*Math.cos(a);

x2=200+e*Math.cos(a+Math.PI/4);

y1=150-e*Math.sin(a);

y2=150-e*Math.sin(a+Math.PI/4);

context.moveTo(x1,y1);

context.lineTo(x2,y2);

}

context.closePath();

context.stroke();

}

</script>

</head>

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

<canvas id="myCanvas" width="400" height="300"></canvas>

</body>

</html>

将上述HTML代码保存到一个html文本文件中,再在浏览器中打开包含这段HTML代码的html文件,可以看到在画布中绘制出的莫尔花纹图案,如图1所示。

图1  莫尔花纹图案

2.环片图案

设定曲线的坐标方程为:

d=100

e=50

m=d+d/3*(1+cos(8*i*dig)/2)*cos(i*dig);

n=e+e/2*(1+sin(8*i*dig)/2)*cos(i*dig);

x1=5*m*cos(i*dig)/4;

x2=5*n*cos(i*dig)/4;

p=d+d/3*(1+cos(10*i*dig)/2)*sin(i*dig);

q=e+e/2*(1+cos(8*i*dig)/2)*sin(i*dig);

y1=p*sin(i*dig);

y2=q* sin(i*dig);      (0≤θ≤2π)

在0~2π区间中从θ=0开始,每隔π/128按曲线方程求得两个点的坐标值(x1,y1)和(x2,y2),并将求得的两点连成一条线段,这样,可以绘制出环片图案。

编写如下的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,300,300);

context.strokeStyle="red";

context.lineWidth=2;

var dig=Math.PI/128;

context.beginPath();

var d=100;  e=50;

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

{

m=d+d/3*(1+Math.cos(8*θ)/2)*Math.cos(θ);

n=e+e/2*(1+Math.sin(8*θ)/2)*Math.cos(θ);

x1=100+5*m*Math.cos(θ)/4;

x2=100+5*n*Math.cos(θ)/4;

p=d+d/3*(1+Math.cos(10*θ)/2)*Math.sin(θ);

q=e+e/2*(1+Math.cos(8*θ)/2)*Math.sin(θ);

y1=160-p*Math.sin(θ);

y2=160-q*Math.sin(θ);

context.moveTo(x1,y1);

context.lineTo(x2,y2);

}

context.closePath();

context.stroke();

}

</script>

</head>

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

<canvas id="myCanvas" width="300" height="300"></canvas>

</body>

</html>

将上述HTML代码保存到一个html文本文件中,再在浏览器中打开包含这段HTML代码的html文件,可以看到在画布中绘制出由线段构成的环片图案,如图2所示。

图2  线段构成的环片图案

3.立体条纹图案

通过构造曲线参数方程,编写如下的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,600,400);

context.strokeStyle="red";

context.lineWidth=1;

context.save();

context.translate(300,200);

context.beginPath();

for (theta=0;theta<=2*Math.PI;theta+=Math.PI/160)

{

x1=30*Math.cos(theta);

y1=15*Math.sin(theta);

a=60*(1+Math.sin(3*theta)/6);

b=100*(1+Math.sin(4*theta)/6);

c=140*(1+Math.sin(5*theta)/6);

d=180*(1+Math.sin(6*theta)/8);

x2=a*Math.cos(theta+Math.PI/20);

y2=a*Math.sin(theta+Math.PI/20);

x3=b*Math.cos(theta);

y3=b*Math.sin(theta);

x4=c*Math.cos(theta+Math.PI/20);

y4=c*Math.sin(theta+Math.PI/20);

x5=1.5*d*Math.cos(theta);

y5=d*Math.sin(theta);

context.moveTo(x1,y1);

context.lineTo(x2,y2);

context.lineTo(x3,y3);

context.lineTo(x4,y4);

context.lineTo(x5,y5);

}

context.stroke();

context.restore();

}

</script>

</head>

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

<canvas id="myCanvas" width="600" height="400"></canvas>

</body>

</html>

将上述HTML代码保存到一个html文本文件中,再在浏览器中打开包含这段HTML代码的html文件,可以看到在画布中绘制出由线段构成的立体条纹图案,如图3所示。

图3  立体条纹图案

JavaScript图形实例:线段构图的更多相关文章

  1. JavaScript图形实例:再谈IFS生成图形

    在“JavaScript图形实例:迭代函数系统生成图形”一文中,我们介绍了采用迭代函数系统(Iterated Function System,IFS)创建分形图案的一些实例.在该文中,仿射变换函数W的 ...

  2. JavaScript图形实例:随机SierPinski三角形

    在“JavaScript图形实例:SierPinski三角形”中,我们介绍了SierPinski三角形的基本绘制方法,在“JavaScript图形实例:迭代函数系统生成图形”一文中,介绍了采用IFS方 ...

  3. JavaScript图形实例:四瓣花型图案

    设有坐标计算公式如下: X=L*(1+SIN(4α))*COS(α) Y=L*(1+SIN(4α))*SIN(α) 用循环依次取α值为0~2π,计算出X和Y,在canvas画布中对坐标位置(X,Y)描 ...

  4. JavaScript图形实例:图形的旋转变换

    旋转变换:图形上的各点绕一固定点沿圆周路径作转动称为旋转变换.可用旋转角表示旋转量的大小. 旋转变换通常约定以逆时针方向为正方向.最简单的旋转变换是以坐标原点(0,0)为旋转中心,这时,平面上一点P( ...

  5. JavaScript图形实例:正弦曲线

    正弦曲线的坐标方程为: Y=A*SIN(X)    (A为振幅) 1.正弦曲线 在弧度为0~4π的正弦曲线上取360个点,将这些点用线连接起来,可以绘制出正弦曲线.编写如下的HTML代码. <! ...

  6. JavaScript图形实例:正多边形

    圆心位于坐标原点,半径为R的圆的参数方程为 X=R*COS(θ) Y=R*SIN(θ) 在圆上取N个等分点,将这N个点首尾连接N条边,可以得到一个正N边形. 1.正多边形阵列 构造一个8行8列的正N( ...

  7. JavaScript图形实例:Canvas API

    1.Canvas概述 Canvas API(画布)用于在网页实时生成图像,并且可以操作图像内容,基本上它是一个可以用JavaScript操作的位图(bitmap). 要使用HTML5在浏览器窗口中绘制 ...

  8. JavaScript图形实例:合成花卉图

    我们知道在直角坐标系中,圆的方程可描述为: X=R*COS(α) Y=R*SIN(α) 用循环依次取α值为0~2π,计算出X和Y,在canvas画布中将坐标点(X,Y)用线连起来,可绘制出一个圆.编写 ...

  9. JavaScript图形实例:图形的扇形变换和环形变换

    1.1  扇形变换 将如图1所示的上边长方形的图形变换为下边的扇形图形的变换称为扇形变换. 设长方形图形中任一点P1(X1,Y1)变换为扇形图形上的点P2(X2,Y2),长方形的长为X,扇形圆心坐标为 ...

随机推荐

  1. 计算几何-RC-poj2187

    This article is made by Jason-Cow.Welcome to reprint.But please post the article's address. 今天学习一下旋( ...

  2. 线段树 区间查询最大值,单体修改 hdu 1754

    #include<cstdio> #include<algorithm> #include<string.h> #include<math.h> #in ...

  3. 【PAT甲级】1110 Complete Binary Tree (25分)

    题意: 输入一个正整数N(<=20),代表结点个数(0~N-1),接着输入N行每行包括每个结点的左右子结点,'-'表示无该子结点,输出是否是一颗完全二叉树,是的话输出最后一个子结点否则输出根节点 ...

  4. TCL Strings

    append    Append values to variable binary      Insert and extract fields from binary strings regexp ...

  5. win api 音频可视化

    暂时记录,改天有时间再完善...其实写好好久了,但以前的代码丢了,重新写一遍.. 原理和 python 的一样,获取输入设备,然后把数据读取到 buffer 中,在绘制出来. 这里要注意两点: 1. ...

  6. vscode生成文件头注释(python)

    文件→首选项→用户代码片段→选python 在大括号内添加如下内容: "Print infomation": { "prefix": "prelog& ...

  7. Plastic Bottle Manufacturer Profile: Plastic Bottle Forming Process

    Plastic bottle molding refers to the process of making a final plastic product from a polymer produc ...

  8. 拿到别人的Django程序如何在本地RUN起来

    在Pycharm IDE下 Edit Configurations 1.检查Python interpreter 2.检查 Working directory 3.Settings 数据库配置

  9. netty笔记-:EpollEventLoopGroup:Caused by: java.lang.ExceptionInInitializerError:Caused by: java.lang.IllegalStateException: Only supported on Linux

    今天在翻看netty的源码的时候发现netty对EventLoopGroup的实现有不止常用的NIOEventLoopGroup ,一共有以下几种. EpollEventLoopGroup NioEv ...

  10. 巧用命令行工具 redis-cli

    我们天天都在使用 Redis 内置的命令行工具 redis-cli,久而久之以为它就是一个简单的交互式 Redis 数据结构手工操作程序,但是它背后强大的功能绝大多数同学可能闻所未闻.本节我们一起来挖 ...