JavaScript实现像雪花一样的Hexaflake分形


Posted in Javascript onJuly 07, 2020

     编写如下的函数:

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的正六边形并进行填充,如下图所示。

JavaScript实现像雪花一样的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的大正六边形中。

JavaScript实现像雪花一样的Hexaflake分形

      Hexaflake分形图案的构造过程是:以(x,y)为中心点绘制一个边长为L的正六边形并进行颜色填充;在这个正六边形中找到7个点,以这7个点为中心分别绘制7个边长为L/3的正六边形并进行颜色填充,替换掉原来边长为L的正六边形;重复以上操作直至达到要求的层数,可以绘制出Hexaflake分形图案,如下图所示。

JavaScript实现像雪花一样的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代码的html文件,可以看到在浏览器窗口中绘制出的Hexaflake分形图案,如下图所示。

JavaScript实现像雪花一样的Hexaflake分形

      执行语句:  

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

      将屏幕背景设置为黑色,将绘制的正六边形用白色填充,则在浏览器窗口中绘制出的Hexaflake分形图案像雪花儿一样,如下图所示。

JavaScript实现像雪花一样的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代码的html文件,在浏览器窗口中呈现出如下图所示的Hexaflake分形动态生成效果。

JavaScript实现像雪花一样的Hexaflake分形

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

Javascript 相关文章推荐
Javascript 表单之间的数据传递代码
Dec 04 Javascript
jQuery 性能优化指南(2)
May 21 Javascript
myeclipse安装jQuery插件的方法
Mar 29 Javascript
非常好用的JsonToString 方法 简单实例
Jul 18 Javascript
javascript实现网页字符定位的方法
Jul 14 Javascript
JavaScript自学笔记(必看篇)
Jun 23 Javascript
vue实现ToDoList简单实例
Feb 07 Javascript
深入探究AngularJs之$scope对象(作用域)
Jul 20 Javascript
JavaScript 中的12种循环遍历方法【总结】
May 31 Javascript
vue两组件间值传递 $router.push实现方法
May 15 Javascript
关于layui时间回显问题的解决方法
Sep 24 Javascript
JS实现单张或多张图片持续无缝滚动的示例代码
May 10 Javascript
jQuery 实现扁平式小清新导航
Jul 07 #jQuery
vue@cli3项目模板怎么使用public目录下的静态文件
Jul 07 #Javascript
JS实现移动端可折叠导航菜单(现代都市风)
Jul 07 #Javascript
React+EggJs实现断点续传的示例代码
Jul 07 #Javascript
JS实现联想、自动补齐国家或地区名称的功能
Jul 07 #Javascript
jQuery 动态粒子效果示例代码
Jul 07 #jQuery
Electron实现应用打包、自动升级过程解析
Jul 07 #Javascript
You might like
PHP与SQL注入攻击[三]
2007/04/17 PHP
PHP关联数组实现根据元素值删除元素的方法
2015/06/26 PHP
PHP读书笔记整理_结构语句详解
2016/07/01 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
2016/11/04 PHP
PHP不使用递归的无限级分类简单实例
2016/11/05 PHP
javascript+mapbar实现地图定位
2010/04/09 Javascript
js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色
2010/05/27 Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
2011/03/17 Javascript
基于jquery实现图片广告轮换效果代码
2011/07/07 Javascript
jquery live()调用不存在的解决方法
2014/02/26 Javascript
js+CSS实现弹出居中背景半透明div层的方法
2015/02/26 Javascript
javascript中的Base64、UTF8编码与解码详解
2015/03/18 Javascript
jquery转盘抽奖功能实现
2015/11/13 Javascript
JQuery实现简单的图片滑动切换特效
2015/11/22 Javascript
javascript prototype原型详解(比较基础)
2016/12/26 Javascript
JavaScript如何一次性展示几万条数据
2017/03/30 Javascript
vue之nextTick全面解析
2017/05/17 Javascript
JS基于正则实现数字千分位用逗号分隔的方法
2017/06/16 Javascript
如何理解Vue的render函数的具体用法
2017/08/30 Javascript
浅谈在vue中用webpack打包之后运行文件的问题以及相关配置方法
2018/02/21 Javascript
vue后台管理之动态加载路由的方法
2018/08/13 Javascript
JS使用Dijkstra算法求解最短路径
2019/01/17 Javascript
vue项目前端错误收集之sentry教程详解
2019/05/27 Javascript
原生js实现五子棋游戏
2020/05/28 Javascript
[42:27]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第三局
2016/03/05 DOTA
Python设计模式之观察者模式原理与用法详解
2019/01/16 Python
python 列表输出重复值以及对应的角标方法
2019/06/11 Python
pytorch 模型的train模式与eval模式实例
2020/02/20 Python
欧洲第一的摇滚和金属乐队服装网站:EMP
2017/10/26 全球购物
青年志愿者事迹材料
2014/02/07 职场文书
课堂教学改革实施方案
2014/03/17 职场文书
新闻工作者先进事迹
2014/05/26 职场文书
2016年猴年新春致辞
2015/08/01 职场文书
高中物理教学反思
2016/02/19 职场文书
自荐信大全
2019/03/21 职场文书
MyBatis自定义SQL拦截器示例详解
2021/10/24 Java/Android