简单的JS / html5分形树,具有递减的线宽

时间:2014-09-20 09:30:07

标签: javascript html5 tree fractals

我想使用JS制作一个非常简单的分形树(用于学习目的)。我一直在使用以下来自维基百科文章的代码。这很好,只是我希望每次迭代时线宽减小。正如你所看到我试过context.lineWidth = context.lineWidth - 1,但这不起作用。有没有人对如何实现这一点有任何想法?

var elem = document.getElementById('canvas');
var context = elem.getContext('2d');

context.fillStyle = '#000';
context.lineWidth = 20;

var deg_to_rad = Math.PI / 180.0;
var depth = 9;

function drawLine(x1, y1, x2, y2){
context.moveTo(x1, y1);
context.lineTo(x2, y2);
context.lineWidth = context.lineWidth - 1;
}
function drawTree(x1, y1, angle, depth){
if (depth != 0){
    var x2 = x1 + (Math.cos(angle * deg_to_rad) * depth * 10.0);
    var y2 = y1 + (Math.sin(angle * deg_to_rad) * depth * 10.0);
    drawLine(x1, y1, x2, y2);
    drawTree(x2, y2, angle - 20, depth - 1);
    drawTree(x2, y2, angle + 20, depth - 1);
    }

}
context.beginPath();
drawTree(300, 500, -90, depth);
context.closePath();
context.stroke();

如果有一种方法可以分阶段执行此操作,那么当我点击一个按钮时,它会添加一个新分支。无论如何,您的建议将不胜感激。

1 个答案:

答案 0 :(得分:2)

我创造并调整了一个小提琴,以某种方式做你想要的。

fiddle

总而言之:每次设置新的线宽时都需要描边。所以代码看起来像这样:

function drawLine(x1, y1, x2, y2, lw){
    context.beginPath();
    context.moveTo(x1, y1);
    context.lineTo(x2, y2);
    context.lineWidth = lw;
    context.closePath();
    context.stroke();
}

function drawTree(x1, y1, angle, depth, lw){
if (depth != 0){
    var x2 = x1 + (Math.cos(angle * deg_to_rad) * depth * 10.0);
    var y2 = y1 + (Math.sin(angle * deg_to_rad) * depth * 10.0);
    drawLine(x1, y1, x2, y2, lw);
    drawTree(x2, y2, angle - 20, depth - 1, lw - 1);
    drawTree(x2, y2, angle + 20, depth - 1, lw - 1);
}
}

drawTree(300, 500, -90, depth, depth);