我受到Bret Victor发明原创视频(http://
vimeo.com/36579366)的启发.
此外,我非常着迷于使用Javascript绘制的树.我没有做太多的图形编程.我所有的职业生涯都是一个中间层和数据库开发人员.但是通过编程方式来绘制树,我有动力去学习.我已经开始学习Javascript了.我知道我会最终(在几个星期或几个月,取决于我获得多少时间)能够从头开始写这样的程序.
然而,我真的很想得到一些源代码,它在Javascript中做类似的绘图,并与之一起玩.你们可以提供的任何链接/指针将是非常有用的.
解决方法
用画布画一棵树就够简单了.请参阅下面的约80行代码的解决方案.
有几个人开始尝试从视频重新创建互动环境. One of those attempts是由github user tnlogy制作的.他的环境允许您在代码中选择一个数字,并使用滑块即时更改正在运行的演示.我已经把他的代码分成了一个树示范.
互动树演示:
http://brianpeiris.github.com/live-coding/
简单树演示:
http://jsfiddle.net/brianpeiris/v9zD6/show
来源为简单的树演示
var
drawLeaf = function (cx,xx,yy) {
var
leafAlpha = 8/10,leafSize = 7;
cx.beginPath();
cx.fillStyle = (
"rgba(" +
Math.round(220 + (Math.random() * 50)) + "," +
Math.round(180 + (Math.random() * 50)) + "," +
Math.round(220 + (Math.random() * 50)) + "," +
leafAlpha +
")"
);
cx.arc(xx,yy,leafSize,Math.PI * 2);
cx.fill();
},drawBranch = function (ii,cx,level,levels,angle,numBranches) {
var
branchLength = 44,subBranchWidthFactor = 2,sweep = Math.PI * 25/30,branchTweakMagnitude = 52/50,tt;
cx.beginPath();
// Draw thinner branches away from the trunk
cx.linewidth = (levels - level) * subBranchWidthFactor;
// Calculate the angle of the branch,with some random tweaks
tt = (
sweep * ii / (numBranches - 1) + angle -
sweep / 2 + Math.PI +
Math.random() * 0.5 * branchTweakMagnitude
);
cx.moveto(xx,yy);
newXX = xx + Math.sin(tt) * branchLength;
newYY = yy + Math.cos(tt) * branchLength;
cx.lineto(newXX,newYY);
cx.stroke();
// Recursively draw more branches
drawBranchesAndLeaves(cx,newXX,newYY,level + 1,Math.PI + tt);
},drawBranchesAndLeaves = function (cx,angle) {
var
numBranches = 5,ii,newXY;
// This function is called recursively. The recursion terminates when we
// have reached the specified number of recursive levels.
if (level === levels) {
drawLeaf(cx,yy);
return;
}
else {
for (ii = 0; ii < numBranches; ii++) {
drawBranch(ii,numBranches);
}
}
},drawTree = function(cx,ww,hh) {
var trunkX = ww / 2,trunkY = hh - 165;
cx.strokeStyle = "black";
cx.linewidth = 13;
cx.lineCap = "round";
cx.moveto(trunkX,hh);
cx.lineto(trunkX,trunkY);
cx.stroke();
drawBranchesAndLeaves(cx,trunkX,trunkY,3,0);
},width = 350,height = 350,canvas = $('<canvas width="' + width + '" height="' + height + '"></canvas>'),ctx = canvas[0].getContext("2d");
$('body').append(canvas);
drawTree(ctx,width,height);