JavaScript实现雪花状Hexaflake分形图案的递归绘制

作者:小圆点时间:2026-10-23 19:45:17浏览:430

本文介绍如何使用JavaScript和Canvas元素绘制Hexaflake分形图案。通过定义绘制正六边形的函数,利用递归算法在指定中心点生成多个子六边形,逐步替换父级图形。文章提供了静态分形生成代码及动态展示效果,通过调整背景色与填充色,最终呈现出类似雪花的视觉效果。

Hexaflake分形绘制基础

首先需要编写一个用于绘制正六边形的函数,具体代码如下:


  function drawHexagon(x,y,L)

  {

    ctx.beginPath();

    ctx.moveTo(x-sqrt3/2*L,y-L/2);

    ctx.lineTo(x-sqrt3/2*L,y+L/2);

    ctx.lineTo(x,y+L);

    ctx.lineTo(x+sqrt3/2*L,y+L/2);

    ctx.lineTo(x+sqrt3/2*L,y-L/2);

    ctx.lineTo(x,y-L);

    ctx.closePath();

    ctx.fillStyle = "#00FFFF";

    ctx.fill();

  }

在该函数中,变量sqrt3的值被设定为Math.sqrt(3)。该函数的主要功能是:以给定的坐标(x,y)作为中心点,绘制一个边长为L的正六边形,并对其进行颜色填充,效果如下图所示。

Hexaflake分形绘制基础

接下来,编写如下调用语句来执行绘制操作:


  var x=250;

  var y=250;

  var L=200;

  drawHexagon(x,y-2*L/3,L/3);

  drawHexagon(x,y,L/3);

  drawHexagon(x,y+2*L/3,L/3);

  drawHexagon(x-sqrt3/3*L,y+L/3,L/3);

  drawHexagon(x-sqrt3/3*L,y-L/3,L/3);

  drawHexagon(x+sqrt3/3*L,y+L/3,L/3);

  drawHexagon(x+sqrt3/3*L,y-L/3,L/3);

执行上述代码后,可以绘制出7个小正六边形。这7个小正六边形恰好能够填充在一个以(x,y)为中心、边长为L的大正六边形区域内,具体布局如下图所示。

Hexaflake分形绘制基础

Hexaflake分形图案的构造逻辑如下:首先以(x,y)为中心点绘制一个边长为L的正六边形并进行颜色填充;接着,在该正六边形内确定7个特定的点,以这7个点为中心,分别绘制7个边长为L/3的正六边形并进行颜色填充,从而替换掉原来的大正六边形;重复执行上述步骤,直到达到预设的递归层数,即可绘制出完整的Hexaflake分形图案,效果如下图所示。

Hexaflake分形绘制基础

静态Hexaflake分形实现

Hexaflake分形采用递归过程实现较为简便,具体的HTML代码如下:


<!DOCTYPE html>

<head>

<title>Hexaflake分形</title>

</head>

<body>

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

</canvas>

<script type="text/javascript">

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

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

  var maxdepth =4;

  var sqrt3=Math.sqrt(3);

  function drawHexagon(x,y,L)

  {

    ctx.beginPath();

    ctx.moveTo(x-sqrt3/2*L,y-L/2);

    ctx.lineTo(x-sqrt3/2*L,y+L/2);

    ctx.lineTo(x,y+L);

    ctx.lineTo(x+sqrt3/2*L,y+L/2);

    ctx.lineTo(x+sqrt3/2*L,y-L/2);

    ctx.lineTo(x,y-L);

    ctx.closePath();

    ctx.fillStyle = "#00FFFF";

    ctx.fill();

  }

  function drawHexaflake(n,x,y,L)

  {

    if(n>0)

    {

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

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

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

      drawHexaflake(n-1,x-sqrt3/3*L,y+L/3,L/3);

      drawHexaflake(n-1,x-sqrt3/3*L,y-L/3,L/3);

      drawHexaflake(n-1,x+sqrt3/3*L,y+L/3,L/3);

      drawHexaflake(n-1,x+sqrt3/3*L,y-L/3,L/3);

    }

    else

      drawHexagon(x,y,L);

  }

  drawHexaflake(maxdepth,250,250,200);

</script>

</body>

</html>

在浏览器中打开包含上述HTML代码的文件,即可在浏览器窗口中看到绘制出的Hexaflake分形图案,效果如下图所示。

Hexaflake分形绘制基础

若要实现特定的视觉效果,可执行以下语句:


ctx.fillStyle="black";
ctx.fillRect(0,0,500,500);

将屏幕背景设置为黑色,并将绘制的正六边形填充为白色,此时在浏览器窗口中呈现出的Hexaflake分形图案将呈现出类似雪花的视觉效果,如下图所示。

Hexaflake分形绘制基础

动态Hexaflake分形展示

为了动态展示Hexaflake分形的生成过程,可以编写如下HTML文件:


<!DOCTYPE html>

<head>

<title>Hexaflake分形</title>

</head>

<body>

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

</canvas>

<script type="text/javascript">

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

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

  var depth =0;

  var sqrt3=Math.sqrt(3);

  function drawHexagon(x,y,L)

  {

    ctx.beginPath();

    ctx.moveTo(x-sqrt3/2*L,y-L/2);

    ctx.lineTo(x-sqrt3/2*L,y+L/2);

    ctx.lineTo(x,y+L);

    ctx.lineTo(x+sqrt3/2*L,y+L/2);

    ctx.lineTo(x+sqrt3/2*L,y-L/2);

    ctx.lineTo(x,y-L);

    ctx.closePath();

    ctx.fillStyle = "#FFFFFF";

    ctx.fill();

  }

  function drawHexaflake(n,x,y,L)

  {

    if(n>0)

    {

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

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

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

      drawHexaflake(n-1,x-sqrt3/3*L,y+L/3,L/3);

      drawHexaflake(n-1,x-sqrt3/3*L,y-L/3,L/3);

      drawHexaflake(n-1,x+sqrt3/3*L,y+L/3,L/3);

      drawHexaflake(n-1,x+sqrt3/3*L,y-L/3,L/3);

    }

    else

      drawHexagon(x,y,L);

  }

  function go()

  {

    ctx.fillStyle = "#000000";

    ctx.fillRect(0,0,500,500); 

    drawHexaflake(depth,250,250,200);

    depth++;

    if (depth>4)

    {

      depth=0;

    }

  }

  window.setInterval('go()',1500);

</script>

</body>

</html>

在浏览器中打开包含这段HTML代码的文件,即可在浏览器窗口中看到Hexaflake分形动态生成的效果,如下图所示。

Hexaflake分形绘制基础

以上就是JavaScript实现像雪花一样的Hexaflake分形的详细内容,更多关于JavaScript Hexaflake分形的资料请关注本站其它相关文章!

作者最新文章