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
js清除input中type等于file的值域(示例代码)
Dec 24 Javascript
改变隐藏的input中value值的方法
Mar 19 Javascript
jQuery oLoader实现的加载图片和页面效果
Mar 14 Javascript
AngularJS基础 ng-keypress 指令简单示例
Aug 02 Javascript
ionic进入多级目录后隐藏底部导航栏(tabs)的完美解决方案
Nov 23 Javascript
React利用插件和不用插件实现双向绑定的方法详解
Jul 03 Javascript
js匿名函数使用&amp;传参(实例)
Sep 08 Javascript
JS隐藏号码中间4位代码实例
Apr 09 Javascript
跟混乱的页面弹窗说再见
Apr 11 Javascript
vue实现点击按钮切换背景颜色的示例代码
Jun 23 Javascript
JavaScript中变量提升和函数提升的详解
Aug 07 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&amp;&amp;mysql)六
2006/10/09 PHP
php 执行系统命令的方法
2009/07/07 PHP
php 获得汉字拼音首字母的函数
2009/08/01 PHP
memcached 和 mysql 主从环境下php开发代码详解
2010/05/16 PHP
destoon实现首页显示供应、企业、资讯条数的方法
2014/07/15 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
php实现微信支付之退款功能
2018/05/30 PHP
推荐:极酷右键菜单
2006/11/29 Javascript
JavaScript 保存数组到Cookie的代码
2010/04/14 Javascript
利用js实现选项卡的特别效果的实例
2013/03/03 Javascript
javascript获取隐藏dom的宽高 具体实现
2013/07/14 Javascript
JavaScript中对象property的删除方法介绍
2014/12/30 Javascript
JavaScript模拟实现继承的方法
2015/03/30 Javascript
JS实现双击屏幕滚动效果代码
2015/10/28 Javascript
JS留言功能的简单实现案例(推荐)
2016/06/23 Javascript
快速解决js开发下拉框中blur与click冲突
2016/10/10 Javascript
jQuery中$.grep() 过滤函数 数组过滤
2016/11/22 Javascript
基于jquery日历价格、库存等设置插件
2020/07/05 jQuery
angular4 共享服务在多个组件中数据通信的示例
2018/03/30 Javascript
vue打包之后生成一个配置文件修改接口的方法
2018/12/09 Javascript
JQuery+Bootstrap 自定义全屏Loading插件的示例demo
2019/07/03 jQuery
解决layui数据表格Date日期格式的回显Object的问题
2019/09/19 Javascript
Vue学习之组件用法实例详解
2020/01/06 Javascript
js实现图片上传到服务器和回显
2020/01/19 Javascript
Openlayers实现图形绘制
2020/09/28 Javascript
Nest.js 授权验证的方法示例
2021/02/22 Javascript
详解Python3中的Sequence type的使用
2015/08/01 Python
Python实现的直接插入排序算法示例
2018/04/29 Python
Python文件常见操作实例分析【读写、遍历】
2018/12/10 Python
python中的colorlog库使用详解
2019/07/05 Python
html5拍照功能实现代码(htm5上传文件)
2013/12/11 HTML / CSS
大学活动邀请函
2014/01/28 职场文书
仓库规划计划书
2014/04/28 职场文书
《当代神农氏》教学反思
2016/02/23 职场文书
Nginx安装完成没有生成sbin目录的解决方法
2021/03/31 Servers
Go语言设计模式之结构型模式
2021/06/22 Golang