利用JavaScript在canvas中画一棵树

boyanx22小时前技术教程3

看到这个网页中在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对象有如下的几个方法:

  • add:加入一个新元素

  • remove:删除一个元素

  • process:对集合内的每一个元素,依次调用这个元素自己的处理方法

对于创建的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对象有这些属性:

  • x,y:坐标值

  • radius:每一条显示在屏幕上的树枝实际上都是由半径逐渐减小的圆形组合而成的,radius就是圆形的半径

  • angle:树枝从底部向上延伸时的角度,初始值是PI/2

  • speed:一个参数,用于控制树枝延伸时的速度

  • generation:当前的树枝是第几代,当出现分叉时,generation会加一

  • distance:当前的这一段树枝的长度,用于控制分叉的概率

  • fillStyle, shadowColor, shadowBlur:绘图参数

Branch对象的方法有:

  • precess:主要的处理部分,调用其它几个方法

  • draw:在当前的坐标处画出一个圆形

  • iterate:将branch向上延伸,更新坐标值,减小半径,给angle增加一个随机值

  • split:根据distance值判断当前是否可以分叉,如果可以则新建若干个Branch对象加入集合,并删除当前的父代对象

  • die:判断是否需要删除当前对象

最后通过setInterval函数来生成图像,每隔一个时间间隔对所有branch进行一次遍历处理,画出图形,更新坐标,生成子代等。

var interval = setInterval(function {
    // 对集合内的每个元素依次进行处理
    branches.process;
    if (branches.branches.length == 0) {
        clearInterval(interval);
    }
}, 20);

这样我们就完成了在canvas上绘制一棵树的工作。

这里是我的一个在线的 demo

这篇原来发在我的博客上。

标签: html转canvas

相关文章

网页游戏开发基础——Canvas基本图形绘制

  什么是Canvas?Canvas是HTML5新增的一个标签,你可以把它翻译为画布,通过它可以绘制二维或三维图形,有了它就可以不用安装flash而实现复杂的动画功能。如何通过Canvas绘图?下面我...

电子病历编辑器开发之路:Canvas vs DOM 的深度剖析与技术抉择

在医疗信息化飞速发展的今天,电子病历(EMR)编辑器作为医疗系统的核心组件,其性能与功能的优劣直接关乎医疗工作的效率与数据安全。近期,我在研读一篇关于 EMR 电子病历编辑器推广的文章时,其中对基于...

安利一款基于canvas/svg的富文本编辑器-支持在线导出PDF、DOCX

Canvas-Editor是一个基于Canvas和SVG的富文本编辑器,它提供了丰富的文本编辑功能,并支持通过Canvas和SVG进行渲染。以下是对Canvas-Editor的详细介绍:一、主要特点高...

用HTML5+Canvas,自制论坛头像LOGO

在论坛中,一个独特的头像LOGO能让人脱颖而出。借助HTML5的Canvas技术,无需专业设计软件,在纯前端环境就能打造专属4字方形LOGO,为论坛形象添彩。 Canvas:前端绘图的魔法工具 Ca...

HTML5 Canvas坐标变换(canvas移动坐标空间)

我们在使用 Canvas 绘制图形时,可能会想对绘制的图形进行变换,例如让图形旋转90度,或者让图像缩小放大等,这些效果都可以通过 Canvas API 的坐标轴变换处理功能来实现。图形旋转如果我们要...

用html5的canvas和JavaScript创建一个绘图程序

本文将引导你使用canvas和JavaScript创建一个简单的绘图程序。首先准备容器Canvas元素,接下来所有的事情都会在JavaScript里面。1 <canvas id="canvasI...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。