Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save riccardoscalco/873384c0772da199b5e8 to your computer and use it in GitHub Desktop.
Save riccardoscalco/873384c0772da199b5e8 to your computer and use it in GitHub Desktop.
Ruler and compass construction of a pentagon
<div id="container"></div>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
var width = 960,
height = 500,
τ = 2 * Math.PI // http://tauday.com/tau-manifesto
delta = 1300,
de = delta * 0.8;
var img = d3.select("#container")
.append("svg")
.attr("id", "chart")
.attr("width", width)
.attr("height", height)
.append("g")
.attr("transform","translate(" + width / 2 + "," + height / 2 + ")")
.style("fill","#6a6a6a");
//
img.append("circle")
.attr("id","p1")
.attr({"r":"10", "cx":"0", "cy":"0", "opacity":"0"});
img.select("#p1").transition().duration(de)
.attr({"r":"2", "opacity":"1"});
//
// http://bl.ocks.org/mbostock/5100636
var arc1 = d3.svg.arc()
.innerRadius(99.5)
.outerRadius(100.5)
.startAngle(0);
var circle1 = img.append("path")
.datum({endAngle: 0.000001})
.attr("d", arc1);
circle1.transition().duration(de * 2).delay(delta * 1)
.call(arcTween, arc1, 2 * τ);
//
img.append("line")
.attr("id","l1")
.attr({"x1":"0", "y1":"-130", "x2":"0", "y2":"-130", "opacity":"1"});
img.select("#l1").transition().duration(de).delay(delta * 3)
.attr({"y2":"140", "opacity":"1"});
//
img.append("circle")
.attr("id","p2")
.attr({"r":"10", "cx":"0", "cy":"-100", "opacity":"0"});
img.select("#p2").transition().duration(de).delay(delta * 4)
.attr({"r":"2", "opacity":"1"});
//
var arc2 = d3.svg.arc()
.innerRadius(99.5)
.outerRadius(100.5)
.startAngle(0.64 * τ);
var circle2 = img.append("path")
.datum({endAngle: 0.6400001 * τ})
.attr("transform","translate(0,-100)")
.attr("d", arc2);
circle2.transition().duration(de).delay(delta * 5)
.call(arcTween, arc2, 0.68 * τ);
//
img.append("circle")
.attr("id","p3")
.attr({"r":"10", "cx":"0", "cy":"100", "opacity":"0"});
img.select("#p3").transition().duration(de).delay(delta * 6)
.attr({"r":"2", "opacity":"1"});
//
var arc3 = d3.svg.arc()
.innerRadius(99.5)
.outerRadius(100.5)
.startAngle(0.81 * τ);
var circle3 = img.append("path")
.datum({endAngle: 0.810001 * τ})
.attr("transform","translate(0,100)")
.attr("d", arc3);
circle3.transition().duration(de).delay(delta * 7)
.call(arcTween, arc3, 0.85 * τ);
//
img.append("line")
.attr("id","l2")
.attr({"x1":"0", "y1":"-100", "x2":"0", "y2":"-100"});
img.select("#l2").transition().duration(de).delay(delta * 8)
.attr({"x2": -120 * Math.sqrt(3), "y2":"20"});
//
img.append("line")
.attr("id","l3")
.attr({"x1":"0", "y1":"100", "x2":"0", "y2":"100"});
img.select("#l3").transition().duration(de).delay(delta * 9)
.attr({"x2": -120 * Math.sqrt(3), "y2":"-20"});
//
img.append("line")
.attr("id","l4")
.attr({"x1": -110 * Math.sqrt(3), "y1":"0", "x2": -110 * Math.sqrt(3), "y2":"0"});
img.select("#l4").transition().duration(de).delay(delta * 10)
.attr({"x2": "130"});
//
img.append("circle")
.attr("id","p4")
.attr({"r":"10", "cx":"0", "cy":"-100", "opacity":"0"});
img.select("#p4").transition().duration(de).delay(delta * 11)
.attr({"r":"2", "opacity":"1"});
//
var arc4 = d3.svg.arc()
.innerRadius(99.5)
.outerRadius(100.5)
.startAngle(0.24 * τ);
var circle4 = img.append("path")
.datum({endAngle: 0.24 * τ})
.attr("transform","translate(0,-100)")
.attr("d", arc4);
circle4.transition().duration(de).delay(delta * 12)
.call(arcTween, arc4, 0.26 * τ);
//
img.append("circle")
.attr("id","p5")
.attr({"r":"10", "cx":"100", "cy":"0", "opacity":"0"});
img.select("#p5").transition().duration(de).delay(delta * 13)
.attr({"r":"2", "opacity":"1"});
//
var arc5 = d3.svg.arc()
.innerRadius(99.5)
.outerRadius(100.5)
.startAngle(-0.01 * τ);
var circle5 = img.append("path")
.datum({endAngle: -0.01 * τ})
.attr("transform","translate(100,0)")
.attr("d", arc5);
circle5.transition().duration(de).delay(delta * 14)
.call(arcTween, arc5, 0.01 * τ);
//
img.append("line")
.attr("id","l5")
.attr({"x1": "-70", "y1":"-100", "x2": "-70", "y2":"-100"});
img.select("#l5").transition().duration(de).delay(delta * 15)
.attr({"x2":"430"});
//
img.append("circle")
.attr("id","p6")
.attr({"r":"10", "cx":"100", "cy":"-100", "opacity":"0"});
img.select("#p6").transition().duration(de).delay(delta * 16)
.attr({"r":"2", "opacity":"1"});
//
var arc6 = d3.svg.arc()
.innerRadius(99.5)
.outerRadius(100.5)
.startAngle(0.24 * τ);
var circle6 = img.append("path")
.datum({endAngle: 0.24 * τ})
.attr("transform","translate(100,-100)")
.attr("d", arc6);
circle6.transition().duration(de).delay(delta * 17)
.call(arcTween, arc6, 0.26 * τ);
//
img.append("circle")
.attr("id","p7")
.attr({"r":"10", "cx":"200", "cy":"-100", "opacity":"0"});
img.select("#p7").transition().duration(de).delay(delta * 18)
.attr({"r":"2", "opacity":"1"});
//
var arc7 = d3.svg.arc()
.innerRadius(99.5)
.outerRadius(100.5)
.startAngle(0.24 * τ);
var circle7 = img.append("path")
.datum({endAngle: 0.24 * τ})
.attr("transform","translate(200,-100)")
.attr("d", arc7);
circle7.transition().duration(de).delay(delta * 19)
.call(arcTween, arc7, 0.26 * τ);
//
img.append("circle")
.attr("id","p8")
.attr({"r":"10", "cx":"300", "cy":"-100", "opacity":"0"});
img.select("#p8").transition().duration(de).delay(delta * 20)
.attr({"r":"2", "opacity":"1"});
//
var arc8 = d3.svg.arc()
.innerRadius(99.5)
.outerRadius(100.5)
.startAngle(0.24 * τ);
var circle8 = img.append("path")
.datum({endAngle: 0.24 * τ})
.attr("transform","translate(300,-100)")
.attr("d", arc8);
circle8.transition().duration(de).delay(delta * 21)
.call(arcTween, arc8, 0.26 * τ);
//
img.append("circle")
.attr("id","p9")
.attr({"r":"10", "cx":"0", "cy":"100", "opacity":"0"});
img.select("#p9").transition().duration(de).delay(delta * 22)
.attr({"r":"2", "opacity":"1"});
//
var arc9 = d3.svg.arc()
.innerRadius(99.5)
.outerRadius(100.5)
.startAngle(0.74 * τ);
var circle9 = img.append("path")
.datum({endAngle: 0.74 * τ})
.attr("transform","translate(0,100)")
.attr("d", arc9);
circle9.transition().duration(de).delay(delta * 23)
.call(arcTween, arc9, 0.76 * τ);
//
img.append("circle")
.attr("id","p10")
.attr({"r":"10", "cx":"-100", "cy":"0", "opacity":"0"});
img.select("#p10").transition().duration(de).delay(delta * 24)
.attr({"r":"2", "opacity":"1"});
//
var arc10 = d3.svg.arc()
.innerRadius(99.5)
.outerRadius(100.5)
.startAngle(0.51 * τ);
var circle10 = img.append("path")
.datum({endAngle: 0.51 * τ})
.attr("transform","translate(-100,0)")
.attr("d", arc10);
circle10.transition().duration(de).delay(delta * 25)
.call(arcTween, arc10, 0.49 * τ);
//
img.append("line")
.attr("id","l6")
.attr({"x1": "0", "y1":"100", "x2": "0", "y2":"100"});
img.select("#l6").transition().duration(de).delay(delta * 26)
.attr({"x2":"-130"});
//
img.append("line")
.attr("id","l7")
.attr({"x1":"400", "y1":"-100", "x2": "400", "y2":"-100"});
img.select("#l7").transition().duration(de).delay(delta * 27)
.attr({"x2":"-125", "y2":"110"});
//
img.append("line")
.attr("id","l8")
.attr({"x1":"0", "y1":"-100", "x2": "0", "y2":"-100"});
img.select("#l8").transition().duration(de).delay(delta * 28)
.attr({"y2":"82.56645", "x2":"-56.416137"});
//
img.append("line")
.attr("id","l9")
.attr({"x1":"0", "y1":"-100", "x2": "0", "y2":"-100"});
img.select("#l9").transition().duration(de).delay(delta * 29)
.attr({"x2":"97.795447", "y2":"20.881821"});
//
img.append("circle")
.attr("id","p11")
.attr({"r":"10", "cx":"80.901699", "cy":"0", "opacity":"0"});
img.select("#p11").transition().duration(de).delay(delta * 30)
.attr({"r":"2", "opacity":"1"});
//
var arc11 = d3.svg.arc()
.innerRadius(99.5)
.outerRadius(100.5)
.startAngle(-0.05 * τ);
var circle11 = img.append("path")
.datum({endAngle: -0.05 * τ})
.attr("transform","translate(80.901699,0)")
.attr("d", arc11);
circle11.transition().duration(de).delay(delta * 31)
.call(arcTween, arc11, 0.05 * τ);
//
img.append("line")
.attr("id","l10")
.attr({"x1":"80.901699", "y1":"-100", "x2": "80.901699", "y2":"-100"});
img.select("#l10").transition().duration(de).delay(delta * 32)
.attr({"y2":"90"});
//
img.append("circle")
.attr("id","p12")
.attr({"r":"10", "cx":"-30.845059", "cy":"0", "opacity":"0"});
img.select("#p12").transition().duration(de).delay(delta * 33)
.attr({"r":"2", "opacity":"1"});
//
var arc12 = d3.svg.arc()
.innerRadius(99.5)
.outerRadius(100.5)
.startAngle(-0.05 * τ);
var circle12 = img.append("path")
.datum({endAngle: -0.05 * τ})
.attr("transform","translate(-30.845059,0)")
.attr("d", arc12);
circle12.transition().duration(de).delay(delta * 34)
.call(arcTween, arc12, 0.05 * τ);
//
img.append("line")
.attr("id","l11")
.attr({"x1":"-30.845059", "y1":"-100", "x2": "-30.845059", "y2":"-100"});
img.select("#l11").transition().duration(de).delay(delta * 35)
.attr({"y2":"110"});
//
img.append("line")
.attr("id","l12")
.attr({"x1":"-100", "y1":"0", "x2": "-100", "y2":"0", "opacity":"0"});
img.select("#l12").transition().duration(de).delay(delta * 36)
.attr({"x2":"-30.845", "y2":"95.124", "opacity":"1"});
//
img.append("line")
.attr("id","l13")
.attr({"x1":"-30.845", "y1":"95.124", "x2": "-30.845", "y2":"95.124", "opacity":"0"});
img.select("#l13").transition().duration(de).delay(delta * 37)
.attr({"x2":"80.902", "y2":"58.779", "opacity":"1"});
//
img.append("line")
.attr("id","l14")
.attr({"x1":"80.902", "y1":"58.779", "x2": "80.902", "y2":"58.779", "opacity":"0"});
img.select("#l14").transition().duration(de).delay(delta * 38)
.attr({"x2":"80.902", "y2":"-58.779", "opacity":"1"});
//
img.append("line")
.attr("id","l15")
.attr({"x1":"80.902", "y1":"-58.779", "x2": "80.902", "y2":"-58.779", "opacity":"0"});
img.select("#l15").transition().duration(de).delay(delta * 39)
.attr({"x2":"-30.845", "y2":"-95.124", "opacity":"1"});
//
img.append("line")
.attr("id","l16")
.attr({"x1":"-30.845", "y1":"-95.124", "x2": "-30.845", "y2":"-95.124", "opacity":"0"});
img.select("#l16").transition().duration(de).delay(delta * 40)
.attr({"x2":"-100", "y2":"0", "opacity":"1"});
// Function Definitions
function arcTween(transition, arc, newAngle) {
transition.attrTween("d", function(d) {
var interpolate = d3.interpolate(d.endAngle, newAngle);
return function(t) {
d.endAngle = interpolate(t);
return arc(d);
};
});
};
line {
stroke: #6a6a6a;
stroke-width: 1px;
}
#l12, #l13, #l14, #l15, #l16 {
stroke: red;
stroke-width: 3px;
}
body {
background-color: #eee;
}
#container {
width:960px;
margin: auto;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment