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 相关文章推荐
将字符串中由空格隔开的每个单词首字母大写
Apr 06 Javascript
js实现文字滚动效果
Mar 03 Javascript
完美实现八种js焦点轮播图(下篇)
Apr 20 Javascript
轮播图组件js代码
Aug 08 Javascript
JS实现json的序列化和反序列化功能示例
Jun 13 Javascript
VUE + UEditor 单图片跨域上传功能的实现方法
Feb 08 Javascript
Vue2.0仿饿了么webapp单页面应用详细步骤
Jul 08 Javascript
在angularJs中进行数据遍历的2种方法
Oct 08 Javascript
ES6基础之默认参数值
Feb 21 Javascript
原生JS实现留言板
Mar 26 Javascript
js中!和!!的区别与用法
May 09 Javascript
原生JS封装vue Tab切换效果
Apr 28 Vue.js
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文件读取功能的应用实例
2015/05/08 PHP
Centos PHP 扩展Xchche的安装教程
2016/07/09 PHP
微信支付开发动态链接Native支付
2016/07/12 PHP
PHP html_entity_decode()函数讲解
2019/02/25 PHP
JS input文本框禁用右键和复制粘贴功能的代码
2010/04/15 Javascript
javascript setAttribute, getAttribute 在不同浏览器上的不同表现
2010/08/05 Javascript
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
zTree插件之多选下拉菜单实例代码
2013/11/06 Javascript
javascript面向对象特性代码实例
2014/06/12 Javascript
asp.net+js实现金额格式化
2015/02/27 Javascript
JavaScript实现列表分页功能特效
2015/05/15 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
js模糊查询实例分享
2016/12/26 Javascript
基于Node.js的WebSocket通信实现
2017/03/11 Javascript
详解AngularJS用Interceptors来统一处理HTTP请求和响应
2017/06/08 Javascript
vue中设置height:100%无效的问题及解决方法
2018/07/27 Javascript
如何配置vue.config.js 处理static文件夹下的静态文件
2020/06/19 Javascript
基于JavaScript实现简单抽奖功能代码实例
2020/10/20 Javascript
[04:04]DOTA2亚洲邀请赛比赛场馆&酒店全攻略
2017/03/23 DOTA
python实现人人网登录示例分享
2014/01/19 Python
Python中生成器和yield语句的用法详解
2015/04/17 Python
python中virtualenvwrapper安装与使用
2018/05/20 Python
python实现京东订单推送到测试环境,提供便利操作示例
2019/08/09 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
2019/08/09 Python
python elasticsearch环境搭建详解
2019/09/02 Python
40个你可能不知道的Python技巧附代码
2020/01/29 Python
python变量的作用域是什么
2020/05/26 Python
解决Django响应JsonResponse返回json格式数据报错问题
2020/08/09 Python
新西兰最大的天然保健及护肤品网站:HealthPost(直邮中国)
2021/02/13 全球购物
班级学雷锋活动总结
2014/06/26 职场文书
2014年纪检部工作总结
2014/11/12 职场文书
2014年保卫科工作总结
2014/12/05 职场文书
电影地道战观后感
2015/06/04 职场文书
nginx里的rewrite跳转的实现
2021/03/31 Servers
Python 文本滚动播放器的实现代码
2021/04/25 Python
Python尝试实现蒙特卡罗模拟期权定价
2022/04/21 Python