javascript canvas生成分形图练习

本文通过JavaScript和Canvas API实现分形图案的绘制,利用迭代生成类似二叉树的结构。通过调整参数如迭代次数、初始树枝长度和角度比例,可以创造出不同形态的分形效果,例如模拟出花椰菜的形状。

简单的分形图,类似于二叉树

一颗数有两个对称分支,然后每个分支又可以继续生长。用一个数组记录每一层的信息,然后一层一层迭代,每迭代一次树枝就增加一层。

可以控制迭代次数,初始树枝长度 ,长度比例等。

<!DOCTYPE html>
<html>
<head>
 <meta charset="UTF-8"/>
</head>
<body>
<canvas id="myc" width="1000" height="1000" style="border:1px solid black"></canvas>
<script>
//x,y是初始点 
//length初始树枝长度 
//ratio 树枝长度与比例 
//n 迭代次数
var n=0;
function drawTree(ctx,x,y,length,ratio)
{
	var cross={};
	var value=[];
	cross.x=x;
	cross.y=y-length;
	cross.arc=Math.PI/2;
	value.push(cross);
	growBranch(ctx,value,length*ratio,ratio);
	
}
function growBranch(ctx,value,bralen,ratio)
{  	
    n=n+1;
    if(n==10)
    	return;
    var value1=[];
    value.forEach(function(item,index)
    {
    	var arc1=item.arc+(Math.PI*4)/(3*2);
    	var arc2=item.arc-(Math.PI*4)/(3*2);
    	//分支1
    	var bx=Math.cos(arc1)*bralen;
    	var by=Math.sin(arc1)*bralen;
    	ctx.moveTo(item.x,item.y);
    	ctx.lineTo(item.x+bx,item.y+by);
    	var cross={};
    	cross.x=item.x+bx;
    	cross.y=item.y+by;
    	cross.arc=arc1;
    	value1.push(cross)
    	//分支2
      	var bx1=Math.cos(arc2)*bralen;
    	var by1=Math.sin(arc2)*bralen;
    	ctx.moveTo(item.x,item.y);
    	ctx.lineTo(item.x+bx1,item.y+by1);  
    	var cross1={};
    	cross1.x=item.x+bx1;
    	cross1.y=item.y+by1;
    	cross1.arc=arc2;
    	value1.push(cross1);
    });
    ctx.stroke();
    growBranch(ctx,value1,bralen*ratio,ratio);
	
}
var canvas=document.getElementById('myc');
var ctx=canvas.getContext('2d');
ctx.fillStyle='#000';
ctx.fillRect(0,0,1000,1000);
//ctx.strokeStyle='rgb(46,139,87)';
ctx.strokeStyle='#fff';
drawTree(ctx,500,500,200,0.7);
ctx.stroke();
</script>
</body>
</html>
上面的代码生成的图:


现在尝试改一些参数

var arc1=item.arc+(Math.PI)/(3*2);
ar arc2=item.arc-(Math.PI)/(3*2);

生成的下面图:


现在尝试改一些参数,将角度改小一点

var arc1=item.arc+(Math.PI)/(3*3);
ar arc2=item.arc-(Math.PI)/(3*3);

生成了一颗花椰菜


将角度改大,改变迭代次数





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值