Skip to content

Instantly share code, notes, and snippets.

@mango314
Last active December 22, 2015 02:49
Show Gist options
  • Save mango314/6406266 to your computer and use it in GitHub Desktop.
Save mango314/6406266 to your computer and use it in GitHub Desktop.
Hata's Tree-Like Set

Watch the twig grow into a branch with leaves (jsFiddle)

Similar to Jason Davies' Koch Island

Example 1.2.9 in Jun Kigami's textbook, Analysis on Fractals

The tree is not stored optimally -- slow around 11 and 12 iterations.

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title> Hata's Tree-Like Set</title>
<script type='text/javascript' src='http://d3js.org/d3.v3.min.js'></script>
<script type='text/javascript' src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.5/angular.min.js"></script>
<script type='text/javascript' src="http://d3js.org/d3.v3.min.js"></script>
<style type='text/css'>
body {font-family: Helvetica;}
</style>
<script type='text/javascript'>//<![CDATA[
// [email protected]
function Controller($scope){
var leaves = [8];
for(var i = 0; i < 10; i++){
leaves.push( 3*leaves[leaves.length - 1] +2);
}
var len = 500;
function L(z){
return {'x': 0.5*z.x + Math.sqrt(3)/6*z.y, 'y': Math.sqrt(3)/6*z.x - 0.5*z.y};
}
function R(z){
return {'x': 2/3*z.x + 0*z.y + len*(1 - 2/3), 'y': 0*z.x - 2/3*z.y - 0 };
}
var tree = [{'x': 0, 'y':0 },{'x': len, 'y':0 }];
for(var k = 0; k < 11; k++){
y = [];
for(var i = 0; i < tree.length; i++){
y.push(L(tree[i]));
}
y.push(tree[0]);
for(var i = 0; i < tree.length; i++){
y.push(R(tree[i]));
}
tree.push(tree[0]);
tree = tree.concat(y);
}
var lineFunction = d3.svg.line()
.x(function (d) { return d.x; })
.y(function (d) { return -1*d.y+150; })
.interpolate("linear");
function add(x, fig){
fig.append("path")
.attr("d", lineFunction(x))
.attr("stroke-width", 1)
.attr("stroke", "black")
.attr("fill", "none");
}
$scope.$watch("N",function(){
d3.select('svg').remove();
var N = $scope.N;
var figure = d3.select(".tree").append("svg")
.attr("width", len)
.attr("height", len/2);
add(tree.slice(0,leaves[N-1] ), figure);
});
}
//]]>
</script>
</head>
<body>
<div ng-app ng-init="N=1;" ng-controller="Controller">
<input type="range" min="1" max="11" step="1" ng-model="N">
<h2>{{N}}th Iteration</h2>
<div class="tree"></div>
</div>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment