Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="utf-8"/>
- <title>Gears Clock</title>
- </head>
- <body>
- <script src="//d3js.org/d3.v4.min.js"></script>
- <style>
- .sec path, .min path, .hour path {
- fill: #ffffff;
- }
- .msec0 path {
- fill: #FF7F00;
- }
- .sec0 path, .min0 path, .hour0 path {
- fill: #8B795E;
- }
- .msec1_out path, .msec3_out path, .sec1_out path, .sec3_out path, .sec5 path, .min1_out path, .min3_out path {
- fill: #8B8989;
- }
- .msec2_out path, .msec4_out path, .sec2_out path, .sec4_out path, .min2_out path, .min4_out path {
- fill: #CDC0B0;
- }
- .msec1_in path, .msec3_in path, .sec1_in path, .sec3_in path, .min1_in path, .min3_in path {
- fill: #CDC0B0;
- }
- .msec2_in path, .msec4_in path, .sec2_in path, .sec4_in path, .min2_in path, .min4_in path {
- fill: #FFEFDB;
- }
- </style>
- <script>
- function gear(d) {
- var n = d.teeth,
- r2 = Math.abs(d.radius),
- r0 = r2 - 4,
- r1 = r2 + 4,
- r3 = 4,
- da = Math.PI / n,
- a0 = -Math.PI / 2,
- i = -1,
- path = ["M", r0 * Math.cos(a0), ",", r0 * Math.sin(a0)];
- while (++i < n) path.push(
- "A", r0, ",", r0, " 0 0,1 ", r0 * Math.cos(a0 += da), ",", r0 * Math.sin(a0),
- "L", r2 * Math.cos(a0), ",", r2 * Math.sin(a0),
- "L", r1 * Math.cos(a0 += da / 3), ",", r1 * Math.sin(a0),
- "A", r1, ",", r1, " 0 0,1 ", r1 * Math.cos(a0 += da / 3), ",", r1 * Math.sin(a0),
- "L", r2 * Math.cos(a0 += da / 3), ",", r2 * Math.sin(a0),
- "L", r0 * Math.cos(a0), ",", r0 * Math.sin(a0));
- if (d.center) {
- path.push("M0,", -r3 * 4, "A", r3 * 4, ",", r3 * 4, " 0 0,0 0,", r3 * 4, "A", r3 * 4, ",", r3 * 4, " 0 0,0 0,", -r3 * 4);
- }
- path.push("Z");
- return path.join("");
- }
- function pointer(d) {
- var r = 4;
- var path = ["M0,", -r, "A", r * 16, ",", r, " 0 0,0 0,", r, "A", 4 * r, ",", r, " 0 0,0 0,", -r, "Z"];
- return path.join("");
- }
- var width = 960,
- height = 500,
- radius = 64;
- var svg = d3.select("body").append("svg")
- .attr("width", width)
- .attr("height", height)
- .append("g")
- .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")scale(.55)")
- .append("g");
- var frame = svg.append("g")
- .datum({radius: Infinity});
- var start_x = width - 4.5 * radius;
- var start_y = -4.5 * radius;
- var msec0_r = radius * 2;
- var msec0_x = start_x;
- var msec0_y = start_y;
- var msec1_out_r = radius;
- var msec1_in_r = radius / 2;
- var msec1_x = msec0_x;
- var msec1_y = msec0_y + msec0_r + msec1_out_r;
- var msec2_out_r = radius;
- var msec2_in_r = radius / 2;
- var msec2_x = msec1_x;
- var msec2_y = msec1_y + msec1_in_r + msec2_out_r;
- var msec3_out_r = radius;
- var msec3_in_r = radius / 3;
- var msec3_x = msec2_x;
- var msec3_y = msec2_y + msec2_in_r + msec3_out_r;
- var sec0_r = radius * 2;
- var sec0_x = msec3_x;
- var sec0_y = msec3_y + msec3_in_r + sec0_r;
- var sec1_out_r = radius;
- var sec1_in_r = radius / 2;
- var sec1_x = sec0_x - sec0_r - sec1_out_r;
- var sec1_y = sec0_y;
- var sec2_out_r = radius;
- var sec2_in_r = radius / 2;
- var sec2_x = sec1_x - sec1_in_r - sec2_out_r;
- var sec2_y = sec1_y;
- var sec3_out_r = radius;
- var sec3_in_r = radius / 3;
- var sec3_x = sec2_x - sec2_in_r - sec3_out_r;
- var sec3_y = sec2_y;
- var sec4_out_r = radius;
- var sec4_in_r = radius / 5;
- var sec4_x = sec3_x - sec3_in_r - sec4_out_r;
- var sec4_y = sec3_y;
- var sec5_r = radius;
- var sec5_x = sec4_x - sec4_in_r - sec5_r;
- var sec5_y = sec4_y;
- var min0_r = radius * 2;
- var min0_x = sec5_x - sec5_r - min0_r;
- var min0_y = sec5_y;
- var min1_out_r = radius;
- var min1_in_r = radius / 2;
- var min1_x = min0_x - min0_r - min1_out_r;
- var min1_y = min0_y;
- var min2_out_r = radius;
- var min2_in_r = radius / 2;
- var min2_x = min1_x - min1_in_r - min2_out_r;
- var min2_y = min1_y;
- var min3_out_r = radius;
- var min3_in_r = radius / 3;
- var min3_x = min2_x - min2_in_r - min3_out_r;
- var min3_y = min2_y;
- var hour0_r = radius * 2;
- var hour0_x = min3_x - min3_in_r - hour0_r;
- var hour0_y = min3_y;
- frame.append("g")
- .attr("class", "msec0")
- .attr("transform", "translate(" + msec0_x + "," + msec0_y + ")")
- .datum({teeth: 60, radius: -msec0_r})
- .append("path")
- .attr("d", gear);
- frame.append("g")
- .attr("class", "msec1_out")
- .attr("transform", "translate(" + msec1_x + "," + msec1_y + ")")
- .datum({teeth: 30, radius: -msec1_out_r, center: true})
- .append("path")
- .attr("d", gear);
- frame.append("g")
- .attr("class", "msec1_in")
- .attr("transform", "translate(" + msec1_x + "," + msec1_y + ")")
- .datum({teeth: 15, radius: -msec1_in_r, center: true})
- .append("path")
- .attr("d", gear);
- frame.append("g")
- .attr("class", "msec2_out")
- .attr("transform", "translate(" + msec2_x + "," + msec2_y + ")")
- .datum({teeth: 30, radius: -msec2_out_r, center: true})
- .append("path")
- .attr("d", gear);
- frame.append("g")
- .attr("class", "msec2_in")
- .attr("transform", "translate(" + msec2_x + "," + msec2_y + ")")
- .datum({teeth: 15, radius: -msec2_in_r, center: true})
- .append("path")
- .attr("d", gear);
- frame.append("g")
- .attr("class", "msec3_out")
- .attr("transform", "translate(" + msec3_x + "," + msec3_y + ")")
- .datum({teeth: 30, radius: -msec3_out_r, center: true})
- .append("path")
- .attr("d", gear);
- frame.append("g")
- .attr("class", "msec3_in")
- .attr("transform", "translate(" + msec3_x + "," + msec3_y + ")")
- .datum({teeth: 10, radius: -msec3_in_r, center: true})
- .append("path")
- .attr("d", gear);
- frame.append("g")
- .attr("class", "sec0")
- .attr("transform", "translate(" + sec0_x + "," + sec0_y + ")")
- .datum({teeth: 60, radius: -sec0_r, pointer: true})
- .append("path")
- .attr("d", gear);
- frame.append("g")
- .attr("class", "sec")
- .attr("transform", "translate(" + sec0_x + "," + sec0_y + ")")
- .datum({})
- .append("path")
- .attr("d", pointer);
- frame.append("g")
- .attr("class", "sec1_out")
- .attr("transform", "translate(" + sec1_x + "," + sec1_y + ")")
- .datum({teeth: 30, radius: -sec1_out_r, center: true})
- .append("path")
- .attr("d", gear);
- frame.append("g")
- .attr("class", "sec1_in")
- .attr("transform", "translate(" + sec1_x + "," + sec1_y + ")")
- .datum({teeth: 15, radius: -sec1_in_r, center: true})
- .append("path")
- .attr("d", gear);
- frame.append("g")
- .attr("class", "sec2_out")
- .attr("transform", "translate(" + sec2_x + "," + sec2_y + ")")
- .datum({teeth: 30, radius: -sec2_out_r, center: true})
- .append("path")
- .attr("d", gear);
- frame.append("g")
- .attr("class", "sec2_in")
- .attr("transform", "translate(" + sec2_x + "," + sec2_y + ")")
- .datum({teeth: 15, radius: -sec2_in_r, center: true})
- .append("path")
- .attr("d", gear);
- frame.append("g")
- .attr("class", "sec3_out")
- .attr("transform", "translate(" + sec3_x + "," + sec3_y + ")")
- .datum({teeth: 30, radius: -sec3_out_r, center: true})
- .append("path")
- .attr("d", gear);
- frame.append("g")
- .attr("class", "sec3_in")
- .attr("transform", "translate(" + sec3_x + "," + sec3_y + ")")
- .datum({teeth: 10, radius: -sec3_in_r, center: true})
- .append("path")
- .attr("d", gear);
- frame.append("g")
- .attr("class", "sec4_out")
- .attr("transform", "translate(" + sec4_x + "," + sec4_y + ")")
- .datum({teeth: 30, radius: -sec4_out_r, center: true})
- .append("path")
- .attr("d", gear);
- frame.append("g")
- .attr("class", "sec4_in")
- .attr("transform", "translate(" + sec4_x + "," + sec4_y + ")")
- .datum({teeth: 6, radius: -sec4_in_r, center: true})
- .append("path")
- .attr("d", gear);
- frame.append("g")
- .attr("class", "sec5")
- .attr("transform", "translate(" + sec5_x + "," + sec5_y + ")")
- .datum({teeth: 30, radius: -sec5_r, center: true})
- .append("path")
- .attr("d", gear);
- frame.append("g")
- .attr("class", "min0")
- .attr("transform", "translate(" + min0_x + "," + min0_y + ")")
- .datum({teeth: 60, radius: -min0_r, pointer: true})
- .append("path")
- .attr("d", gear);
- frame.append("g")
- .attr("class", "min")
- .attr("transform", "translate(" + min0_x + "," + min0_y + ")")
- .datum({})
- .append("path")
- .attr("d", pointer);
- frame.append("g")
- .attr("class", "min1_out")
- .attr("transform", "translate(" + min1_x + "," + min1_y + ")")
- .datum({teeth: 30, radius: -min1_out_r, center: true})
- .append("path")
- .attr("d", gear);
- frame.append("g")
- .attr("class", "min1_in")
- .attr("transform", "translate(" + min1_x + "," + min1_y + ")")
- .datum({teeth: 15, radius: -min1_in_r, center: true})
- .append("path")
- .attr("d", gear);
- frame.append("g")
- .attr("class", "min2_out")
- .attr("transform", "translate(" + min2_x + "," + min2_y + ")")
- .datum({teeth: 30, radius: -min2_out_r, center: true})
- .append("path")
- .attr("d", gear);
- frame.append("g")
- .attr("class", "min2_in")
- .attr("transform", "translate(" + min2_x + "," + min2_y + ")")
- .datum({teeth: 15, radius: -min2_in_r, center: true})
- .append("path")
- .attr("d", gear);
- frame.append("g")
- .attr("class", "min3_out")
- .attr("transform", "translate(" + min3_x + "," + min3_y + ")")
- .datum({teeth: 30, radius: -min3_out_r, center: true})
- .append("path")
- .attr("d", gear);
- frame.append("g")
- .attr("class", "min3_in")
- .attr("transform", "translate(" + min3_x + "," + min3_y + ")")
- .datum({teeth: 10, radius: -min3_in_r, center: true})
- .append("path")
- .attr("d", gear);
- frame.append("g")
- .attr("class", "hour0")
- .attr("transform", "translate(" + hour0_x + "," + hour0_y + ")")
- .datum({teeth: 60, radius: -hour0_r, pointer: true})
- .append("path")
- .attr("d", gear);
- frame.append("g")
- .attr("class", "hour")
- .attr("transform", "translate(" + hour0_x + "," + hour0_y + ")")
- .datum({})
- .append("path")
- .attr("d", pointer);
- var gear_speed = 1 / 1000 * 6 * 12;
- var pointer_speed = 1 / 1000 * 6;
- var date = new Date();
- var hour_start = Date.now() - (90 + (date.getHours() + date.getMinutes() / 60 + date.getSeconds() / 3600) * 30) / pointer_speed * 60 * 60;
- var min_start = Date.now() - (90 + (date.getMinutes() + date.getSeconds() / 60) * 6) / pointer_speed * 60;
- var sec_start = Date.now() - (90 + date.getSeconds() * 6) / pointer_speed;
- var msec0_start = Date.now() - (90 + date.getSeconds() * 6) / gear_speed;
- d3.timer(function () {
- var hour_angle = (Date.now() - hour_start) * pointer_speed / 60 / 60;
- frame.selectAll(".hour").select("path").attr("transform", function (d) { return "rotate(" + hour_angle + ")"; });
- var min_angle = (Date.now() - min_start) * pointer_speed / 60;
- frame.selectAll(".min").select("path").attr("transform", function (d) { return "rotate(" + min_angle + ")"; });
- var sec_angle = (Date.now() - sec_start) * pointer_speed;
- frame.selectAll(".sec").select("path").attr("transform", function (d) { return "rotate(" + sec_angle + ")"; });
- var msec0_angle = (Date.now() - msec0_start) * gear_speed;
- frame.selectAll(".msec0").select("path").attr("transform", function (d) { return "rotate(" + msec0_angle + ")"; });
- var msec1_angle = msec0_angle * 2;
- frame.selectAll(".msec1_in").select("path").attr("transform", function (d) { return "rotate(" + -msec1_angle + ")"; });
- frame.selectAll(".msec1_out").select("path").attr("transform", function (d) { return "rotate(" + -msec1_angle + ")"; });
- var msec2_angle = msec1_angle / 2 + 6;
- frame.selectAll(".msec2_in").select("path").attr("transform", function (d) { return "rotate(" + msec2_angle + ")"; });
- frame.selectAll(".msec2_out").select("path").attr("transform", function (d) { return "rotate(" + msec2_angle + ")"; });
- var msec3_angle = msec2_angle / 2 + 6;
- frame.selectAll(".msec3_in").select("path").attr("transform", function (d) { return "rotate(" + -msec3_angle + ")"; });
- frame.selectAll(".msec3_out").select("path").attr("transform", function (d) { return "rotate(" + -msec3_angle + ")"; });
- var sec0_angle = msec3_angle / 6;
- frame.selectAll(".sec0").select("path").attr("transform", function (d) { return "rotate(" + sec0_angle + ")"; });
- var sec1_angle = sec0_angle * 2 + 6;
- frame.selectAll(".sec1_in").select("path").attr("transform", function (d) { return "rotate(" + -sec1_angle + ")"; });
- frame.selectAll(".sec1_out").select("path").attr("transform", function (d) { return "rotate(" + -sec1_angle + ")"; });
- var sec2_angle = sec1_angle / 2 - 3;
- frame.selectAll(".sec2_in").select("path").attr("transform", function (d) { return "rotate(" + sec2_angle + ")"; });
- frame.selectAll(".sec2_out").select("path").attr("transform", function (d) { return "rotate(" + sec2_angle + ")"; });
- var sec3_angle = sec2_angle / 2 + 3;
- frame.selectAll(".sec3_in").select("path").attr("transform", function (d) { return "rotate(" + -sec3_angle + ")"; });
- frame.selectAll(".sec3_out").select("path").attr("transform", function (d) { return "rotate(" + -sec3_angle + ")"; });
- var sec4_angle = sec3_angle / 3;
- frame.selectAll(".sec4_in").select("path").attr("transform", function (d) { return "rotate(" + sec4_angle + ")"; });
- frame.selectAll(".sec4_out").select("path").attr("transform", function (d) { return "rotate(" + sec4_angle + ")"; });
- var sec5_angle = sec4_angle / 5;
- frame.selectAll(".sec5").select("path").attr("transform", function (d) { return "rotate(" + -sec5_angle + ")"; });
- var min0_angle = sec5_angle / 2 + 3;
- frame.selectAll(".min0").select("path").attr("transform", function (d) { return "rotate(" + min0_angle + ")"; });
- var min1_angle = min0_angle * 2 + 6;
- frame.selectAll(".min1_in").select("path").attr("transform", function (d) { return "rotate(" + -min1_angle + ")"; });
- frame.selectAll(".min1_out").select("path").attr("transform", function (d) { return "rotate(" + -min1_angle + ")"; });
- var min2_angle = min1_angle / 2 - 3;
- frame.selectAll(".min2_in").select("path").attr("transform", function (d) { return "rotate(" + min2_angle + ")"; });
- frame.selectAll(".min2_out").select("path").attr("transform", function (d) { return "rotate(" + min2_angle + ")"; });
- var min3_angle = min2_angle / 2 + 3;
- frame.selectAll(".min3_in").select("path").attr("transform", function (d) { return "rotate(" + -min3_angle + ")"; });
- frame.selectAll(".min3_out").select("path").attr("transform", function (d) { return "rotate(" + -min3_angle + ")"; });
- var hour0_angle = min3_angle / 6 + 3;
- frame.selectAll(".hour0").select("path").attr("transform", function (d) { return "rotate(" + hour0_angle + ")"; });
- });
- </script>
- </body>
- </html>
Add Comment
Please, Sign In to add comment