JavaScript图形实例:SierPinski三角形

1.SierPinski三角形

Sierpinski三角形是一种分形,由波兰数学家谢尔宾斯基在1915年提出,它是一种典型的自相似集。其生成过程为:

(1)取一个三角形(多数使用等边三角形);

(2)沿三边中点连线,将它分成四个小三角形;

(3)对上、左、右这三个小三角形重复这一过程。

SierPinski三角形的生成示意如图1所示。

图1  SierPinski三角形的生成

SierPinski三角形采用递归过程易于实现,编写如下的HTML代码。

<!DOCTYPE html>

<head>

<title>SierPinski三角形</title>

</head>

<body>

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

</canvas>

<script type="text/javascript">

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

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

var depth =5;

ctx.strokeStyle = "red";

ctx.lineWidth = 3;

function sierpinski(x1,y1,x2,y2,x3,y3,n)

{

if (n<0)  return;

ctx.beginPath();

ctx.moveTo(x1,y1);

ctx.lineTo(x2,y2);

ctx.lineTo(x3,y3);

ctx.lineTo(x1,y1);

ctx.closePath();

ctx.stroke();

var x4 = (x1 + x2) / 2;

var y4 = (y1 + y2) / 2;

var x5 = (x2 + x3) / 2;

var y5 = (y2 + y3) / 2;

var x6 = (x1 + x3) / 2;

var y6 = (y1 + y3) / 2;

sierpinski(x1,y1,x4,y4,x6,y6,n-1);

sierpinski(x6,y6,x5,y5,x3,y3,n-1);

sierpinski(x4,y4,x2,y2,x5,y5,n-1);

}

sierpinski(300, 500-500*Math.sqrt(3)/2, 50, 500, 550, 500,depth);

</script>

</body>

</html>

在浏览器中打开包含这段HTML代码的html文件,可以看到在浏览器窗口中绘制出的SierPinski三角形,如图2所示。

图2  递归深度depth =5的SierPinski三角形

2.SierPinski垫片

SierPinski垫片的生成过程为:

(1)取一个实心的三角形(多数使用等边三角形);

(2)沿三边中点连线,将它分成四个小三角形,

(3)去掉中间的那一个小三角形;

(4)对其余三个小三角形重复这一过程。

SierPinski垫片的生成示意如图3所示。

图3  SierPinski垫片的生成

SierPinski垫片采用递归过程易于实现,编写如下的HTML代码。

<!DOCTYPE html>

<head>

<title>SierPinski垫片</title>

</head>

<body>

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

</canvas>

<script type="text/javascript">

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

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

ctx.beginPath();

ctx.moveTo(300, 500-500*Math.sqrt(3)/2);

ctx.lineTo(50,500);

ctx.lineTo(550,500);

ctx.closePath();

ctx.fillStyle="black";

ctx.fill();

var depth =5;

ctx.fillStyle = "white";

function sierpinski(x1,y1,x2,y2,x3,y3,n)

{

if (n<=0)  return;

var x4 = (x1 + x2) / 2;

var y4 = (y1 + y2) / 2;

var x5 = (x2 + x3) / 2;

var y5 = (y2 + y3) / 2;

var x6 = (x1 + x3) / 2;

var y6 = (y1 + y3) / 2;

ctx.beginPath();

ctx.moveTo(x4,y4);

ctx.lineTo(x5,y5);

ctx.lineTo(x6,y6);

ctx.closePath();

ctx.fill();

sierpinski(x1,y1,x4,y4,x6,y6,n-1);

sierpinski(x6,y6,x5,y5,x3,y3,n-1);

sierpinski(x4,y4,x2,y2,x5,y5,n-1);

}

sierpinski(300, 500-500*Math.sqrt(3)/2, 50, 500, 550, 500,depth);

</script>

</body>

</html>

在浏览器中打开包含这段HTML代码的html文件,可以看到在浏览器窗口中绘制出的SierPinski垫片,如图4所示。

图4  递归深度depth =5的SierPinski垫片

3.SierPinski地毯

SierPinski垫片的初始图形是三角形,如果将初始图形改成正方形,便可以得到称为SierPinski地毯的图形。它的生成过程为:

(1)取一个实心的正方形;

(2)将正方形的每边三等分,并连接相应的等分点,从而将原正方形等分为面积相等的9个小正方形;

(3)去掉中间的那一个小正方形;

(4)对其余的8个小正方形重复这一过程。

SierPinski垫片的生成示意如图5所示。

图5  SierPinski地毯的生成

设正方形的左上角坐标为(x,y),边长为L,则中间正方形的左上角坐标和边长分别为(x+L/3,y+L/3)和L/3,其余8个小正方形的边长均为L/3,左上角坐标分别为(x,y)、(x+L/3,y)、(x+2*L/3,y)、(x,y+L/3)、(x+2*L/3,y+L/3)、(x,y+2*L/3)、(x+L/3,y+2*L/3)和(x+2*L/3,y+2*L/3)。

为了绘制SierPinski地毯,可以编写如下的HTML代码。

<!DOCTYPE html>

<head>

<title>SierPinski地毯</title>

</head>

<body>

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

</canvas>

<script type="text/javascript">

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

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

ctx.fillStyle="black";

ctx.fillRect(50,50,450,450);

var depth =5;

ctx.fillStyle = "white";

function sierpinski(x,y,L,n)

{

if (n<=0)  return;

ctx.fillRect(x+L/3,y+L/3,L/3,L/3);

sierpinski(x,y,L/3,n-1);

sierpinski(x+L/3,y,L/3,n-1);

sierpinski(x+2*L/3,y,L/3,n-1);

sierpinski(x,y+L/3,L/3,n-1);

sierpinski(x+2*L/3,y+L/3,L/3,n-1);

sierpinski(x,y+2*L/3,L/3,n-1);

sierpinski(x+L/3,y+2*L/3,L/3,n-1);

sierpinski(x+2*L/3,y+2*L/3,L/3,n-1);

}

sierpinski(50,50,450,depth);

</script>

</body>

</html>

在浏览器中打开包含这段HTML代码的html文件,可以看到在浏览器窗口中绘制出SierPinski垫片,如图6所示。

图6  递归深度depth =5的SierPinski地毯

(0)

相关推荐

  • JavaScript图形实例:随机SierPinski三角形

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

  • CSS动画实例:SierPinski地毯

    设页面中有<div class="shape"></div>,若定义.shape的样式规则为: .shape { width: 100px; height: ...

  • JavaScript图形实例:Canvas API

    JavaScript图形实例:Canvas API

  • JavaScript图形实例:H分形

    H分形是由一个字母H演化出迷宫一样场景的分形图案,其构造过程是:取一个中心点(x,y),以此中心点绘制一条长为L的水平直线和两条长为H的竖直直线,构成一个字母"H"的形状:再以两条 ...

  • JavaScript图形实例:Hilbert曲线

    德国数学家David Hilbert在1891年构造了一种曲线,首先把一个正方形等分成四个小正方形,依次从西北角的正方形中心出发往南到西南正方形中心,再往东到东南角的正方形中心,再往北到东北角正方形中 ...

  • JavaScript图形实例:再谈IFS生成图形

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

  • JavaScript图形实例:Levy曲线及其变形

    Levy曲线是将一条线段不停地分形成两条长度相等且相互垂直的线段而生成的.Levy分形的最后很像一个英文字母C,所以也称它为C曲线. Levy曲线的生成示意如图1所示. 图1  Levy曲线的生成 1 ...

  • JavaScript图形实例:黄金螺旋线

    黄金螺旋线是根据斐波那契数列画出来的螺旋曲线.自然界中存在许多黄金螺旋线的图案,是自然界最完美的经典黄金比例.例如,如图1所示的海螺身上的曲线,图2所示的漩涡,图3所示的人耳. 图1 海螺 图2  漩 ...

  • JavaScript图形实例:窗花图案

    JavaScript图形实例:窗花图案

  • JavaScript图形实例:曲线方程

    在HTML5 Canvas画布中,我们可以根据曲线的方程绘制出曲线.例如,在笛卡尔坐标系中,圆的方程为: x=r*cos(θ) y=r*sin(θ)     (0≤θ≤2π) 编写如下的HTML代码. ...