chart3 = {
const w = 500;
const h = 500;
const b = 10;
const svg = d3.select(DOM.svg(w, h));
const points = [
[b, h / 2 + ((Math.sqrt(3) * w) / 2 - b) / 2],
[w - b, h / 2 + ((Math.sqrt(3) * w) / 2 - b) / 2]
];
svg
.append("path")
.attr("d", function () {
return makePath(points);
})
.style("stroke", "#000")
.style("stroke-width", "2px")
.style("fill", "none");
var iter = 8;
var i = 0;
var even = true;
iterate(points);
function iterate(points) {
setTimeout(function () {
var newPoints = [points[0]];
for (var j = 0; j < points.length - 1; j++) {
newPoints.push(...bend(points[j], points[j + 1]));
}
svg
.select("path")
.transition()
.duration(2000)
.attrTween("d", pathTween(makePath(newPoints), 2));
i++;
if (i < iter) {
iterate(newPoints);
}
}, 2500);
}
function bend(a, d) {
even = !even;
var L = Math.sqrt(Math.pow(d[0] - a[0], 2) + Math.pow(d[1] - a[1], 2));
var alpha = Math.atan((d[1] - a[1]) / (d[0] - a[0]));
if (d[0] - a[0] < 0) {
alpha += Math.PI;
}
if (even) {
var b1 = a[0] + (L / 2) * Math.cos(alpha + Math.PI / 3);
var b2 = a[1] + (L / 2) * Math.sin(alpha + Math.PI / 3);
var c1 = a[0] + 0.5 * Math.sqrt(3) * L * Math.cos(alpha + Math.PI / 6);
var c2 = a[1] + 0.5 * Math.sqrt(3) * L * Math.sin(alpha + Math.PI / 6);
} else {
var b1 = a[0] + (L / 2) * Math.cos(alpha - Math.PI / 3);
var b2 = a[1] + (L / 2) * Math.sin(alpha - Math.PI / 3);
var c1 = a[0] + 0.5 * Math.sqrt(3) * L * Math.cos(alpha - Math.PI / 6);
var c2 = a[1] + 0.5 * Math.sqrt(3) * L * Math.sin(alpha - Math.PI / 6);
}
return [[b1, b2], [c1, c2], d];
}
function makePath(points) {
var p = "M" + points[0][0] + "," + points[0][1];
for (var i = 1; i < points.length; i++) {
p += "L" + points[i][0] + "," + points[i][1];
}
return p;
}
return svg.node();
}