看到 这个网页( kennethjorgensen 商业网/blog/2014/canvas-trees) 中在 canvas 里绘制一棵树,感到很有趣,于是仿照他的源代码,同样也利用 JavaScript 生成了一棵树。
在程序中需要两个对象 Branch, BranchCollection。Branch 中存放当前正在绘制的这一段树枝的信息,BranchCollection 中存放的是所有的树枝。
首先对 canvas 画布进行初始设置:
var width = window.innerWidth;
var height = window.innerHeight;
var canvas = document.getElementById("canvastree");
canvas.width = width;
canvas.height = height;
对初始的 branch 的数量、半径进行设置:
// 设置初始的数量
var n = 2 + Math.random() * 3;
// 设定初始的半径大小
var initialRadius = width / 50;
新建一个 BranchCollection 对象用于放置所有的 branch:
branches = new BranchCollection();
这里的 BranchCollection 对象有如下的几个方法:
对于创建的 BranchCollection 对象,将初始的 branch 依次加入其中,并初始化。
for (var i = 0; i < n; i++) {
branch = new Branch();
// 以 canvas 的中点为基准,左右各占一个 initialRadius 的宽度
// 根据序号 i 算出初始 x 坐标
branch.x = width/2 - initialRadius + i * 2 * initialRadius / n;
branch.radius = initialRadius;
// 将新的 branch 加入集合中去
branches.add(branch);
}
Branch 对象有这些属性:
Branch 对象的方法有:
最后通过 setInterval()函数来生成图像,每隔一个时间间隔对所有 branch 进行一次遍历处理,画出图形,更新坐标,生成子代等。
var interval = setInterval(function() {
// 对集合内的每个元素依次进行处理
branches.process();
if (branches.branches.length == 0) {
clearInterval(interval);
}
}, 20);
这样我们就完成了在 canvas 上绘制一棵树的工作。

A tree picture
GitHub 代码地址: github /noiron/canvas-trees,这里是我的一个在线的 demo

