zoukankan      html  css  js  c++  java
  • 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地毯 

  • 相关阅读:
    C#呓语
    引起超时的原因及表解锁的方法<转>
    如何使用数据库引擎优化顾问优化数据库 <转>
    缩短IIS应用池回收时间,减少IIS假死<转>
    Microsoft Silverlight 4 Tools for Visual Studio 2010中文版本
    系统统一验证(IHttpHandlerFactory)<转>
    解决CSS BUG的顺口溜<转>
    重建索引提高SQL Server性能<转>
    .NET调用osql.exe执行sql脚本创建表和存储过程<转>
    SQL SERVER性能优化综述<转>
  • 原文地址:https://www.cnblogs.com/cs-whut/p/13233655.html
Copyright © 2011-2022 走看看