Built with blockbuilder.org
forked from anonymous's block: Illustrator Round Trip
| license: mit | |
| scrolling: yes | |
| border: yes |
Built with blockbuilder.org
forked from anonymous's block: Illustrator Round Trip
| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <meta charset="utf-8"> | |
| </head> | |
| <body> | |
| <svg width="792" height="612"> | |
| <g id="Layer_1"></g> | |
| <g id="Layer_2"></g> | |
| </svg> | |
| <script src="//d3js.org/d3.v3.min.js" charset="utf-8"></script> | |
| <script src="script.js"></script> | |
| </body> | |
| </html> |
| id | next_id | round | winner | loser | roshambo_winner | roshambo_loser | first_trick | winner_score | turnovers | num_tricks | misses | order | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 7-1-1 | 7-2-1 | 1 | Paul Rodriguez | Jonny Giger | Paul Rodriguez | Jonny Giger | Kickflip | 3 | 4 | 24 | 12 | 5 | |
| 7-1-10 | 7-2-5 | 1 | Sewa Kroetkov | Moses Adams | Moses Adams | Sewa Kroetkov | Kickflip | 4 | 3 | 35 | 12 | 5 | |
| 7-1-11 | 7-2-6 | 1 | Nyjah Huston | Gavin Nolan | Nyjah Huston | Gavin Nolan | 360 Flip | 0 | 0 | 23 | 5 | 5 | |
| 7-1-12 | 7-2-6 | 1 | MikeMo Capaldi | Nate Principato | MikeMo Capaldi | Nate Principato | Kickflip | 0 | 0 | 21 | 5 | 5 | |
| 7-1-13 | 7-2-7 | 1 | Shane O'Neill | Cristian Vannella | Cristian Vannella | Shane O'Neill | Switch Frontside 180 | 3 | 3 | 29 | 11 | 5 | |
| 7-1-14 | 7-2-7 | 1 | Cody Cepeda | Trent McClung | Trent McClung | Cody Cepeda | Kickflip | 4 | 1 | 40 | 10 | 9 | |
| 7-1-15 | 7-2-8 | 1 | Tom Asta | Cody Whitt | Tom Asta | Cody Whitt | Kickflip | 3 | 6 | 32 | 14 | 5 | |
| 7-1-16 | 7-2-8 | 1 | Eric Martinac | Albert Nyberg | Eric Martinac | Albert Nyberg | Switch Frontside Bigspin | 0 | 0 | 12 | 5 | 5 | |
| 7-1-2 | 7-2-1 | 1 | Moose | CJ Tambornino | Moose | CJ Tambornino | Switch Kickflip | 4 | 4 | 32 | 13 | 5 | |
| 7-1-3 | 7-2-2 | 1 | Luan Oliveira | Tanner Lawler | Tanner Lawler | Luan Oliveira | Kickflip | 4 | 1 | 26 | 10 | 5 | |
| 7-1-4 | 7-2-2 | 1 | Chris Chann | Chris Cole | Chris Chann | Chris Cole | Backside Bigspin | 4 | 6 | 32 | 15 | 5 | |
| 7-1-5 | 7-2-3 | 1 | Morgan Smith | Spencer Brown | Spencer Brown | Morgan Smith | Nollie Heelflip | 4 | 7 | 31 | 16 | 5 | |
| 7-1-6 | 7-2-3 | 1 | Nick Holt | PJ Ladd | Nick Holt | PJ Ladd | 360 Flip | 1 | 2 | 25 | 8 | 5 | |
| 7-1-7 | 7-2-4 | 1 | Griffin Gass | W.V. Wagenigen | Griffin Gass | W.V. Wagenigen | Kickflip | 0 | 0 | 8 | 5 | 5 | |
| 7-1-8 | 7-2-4 | 1 | Eric Koston | Chhandy Khon | Chhandy Khon | Eric Koston | Kickflip | 1 | 3 | 19 | 9 | 1 | |
| 7-1-9 | 7-2-5 | 1 | Will Fyock | Chaz Ortiz | Will Fyock | Chaz Ortiz | 360 Flip | 0 | 2 | 25 | 7 | 5 | |
| 7-2-1 | 7-3-1 | 2 | Moose | Paul Rodriguez | Moose | Paul Rodriguez | Kickflip | 0 | 0 | 11 | 5 | 5 | |
| 7-2-2 | 7-3-1 | 2 | Luan Oliveira | Chris Chann | Luan Oliveira | Chris Chann | 360 Flip | 0 | 0 | 10 | 5 | 5 | |
| 7-2-3 | 7-3-2 | 2 | Nick Holt | Morgan Smith | Morgan Smith | Nick Holt | Nollie Heelflip | 4 | 3 | 21 | 12 | 5 | |
| 7-2-4 | 7-3-2 | 2 | Eric Koston | Griffin Gass | Griffin Gass | Eric Koston | Kickflip | 3 | 3 | 20 | 11 | 1 | |
| 7-2-5 | 7-3-3 | 2 | Sewa Kroetkov | Will Fyock | Will Fyock | Sewa Kroetkov | Nollie Heelflip | 3 | 7 | 39 | 15 | 5 | |
| 7-2-6 | 7-3-3 | 2 | MikeMo Capaldi | Nyjah Huston | MikeMo Capaldi | Nyjah Huston | Nollie Kickflip | 4 | 8 | 44 | 17 | 5 | |
| 7-2-7 | 7-3-4 | 2 | Cody Cepeda | Shane O'Neill | Cody Cepeda | Shane O'Neill | Switch Frontside Biggerspin | 3 | 10 | 58 | 18 | 9 | |
| 7-2-8 | 7-3-4 | 2 | Tom Asta | Eric Martinac | Tom Asta | Eric Martinac | Kickflip | 2 | 4 | 36 | 11 | 5 | |
| 7-3-1 | 7-4-1 | 3 | Luan Oliveira | Moose | Moose | Luan Oliveira | Kickflip | 4 | 5 | 43 | 14 | 5 | |
| 7-3-2 | 7-4-1 | 3 | Eric Koston | Nick Holt | Eric Koston | Nick Holt | Backside 360 | 4 | 6 | 26 | 15 | 1 | |
| 7-3-3 | 7-4-2 | 3 | Sewa Kroetkov | MikeMo Capaldi | MikeMo Capaldi | Sewa Kroetkov | Kickflip | 4 | 1 | 24 | 10 | 5 | |
| 7-3-4 | 7-4-2 | 3 | Cody Cepeda | Tom Asta | Tom Asta | Cody Cepeda | Kickflip | 1 | 1 | 21 | 7 | 9 | |
| 7-4-1 | 7-5-1 | 4 | Luan Oliveira | Eric Koston | Luan Oliveira | Eric Koston | Kickflip | 2 | 2 | 23 | 9 | 1 | |
| 7-4-2 | 7-5-1 | 4 | Cody Cepeda | Sewa Kroetkov | Sewa Kroetkov | Cody Cepeda | 360 Shuvit | 0 | 1 | 14 | 6 | 9 | |
| 7-5-1 | NULL | 5 | Cody Cepeda | Luan Oliveira | Cody Cepeda | Luan Oliveira | Nollie Heelflip | 0 | 0 | 19 | 5 | 9 |
| var bounds = { | |
| width: 792, | |
| height: 612 | |
| }; | |
| var color = d3.scale.category20b(); | |
| var force = d3.layout.force() | |
| .charge(-120) | |
| .linkDistance(30) | |
| .size([bounds.width, bounds.height]); | |
| var nodeRadius = 7; | |
| function drawPointyArc(d) { | |
| var dx = d.target.x - d.source.x; | |
| var dy = d.target.y - d.source.y; | |
| var arcRadius = 10 * dx / Math.abs(dx); | |
| var theta; | |
| var edgePoint; | |
| var front; | |
| var back; | |
| var arc; | |
| if (dx === 0) { | |
| if (dy >= 0) { | |
| theta = Math.PI; | |
| } else { | |
| theta = -Math.PI; | |
| } | |
| edgePoint = { | |
| x: 0, | |
| y: nodeRadius | |
| }; | |
| } else { | |
| theta = Math.atan((d.target.y - d.source.y) / (d.target.x - d.source.x)) + Math.PI / 2; | |
| edgePoint = { | |
| x: nodeRadius * Math.cos(theta), | |
| y: nodeRadius * Math.sin(theta) | |
| }; | |
| } | |
| front = { | |
| x: d.source.x + edgePoint.x, | |
| y: d.source.y + edgePoint.y | |
| }; | |
| back = { | |
| x: d.source.x - edgePoint.x, | |
| y: d.source.y - edgePoint.y | |
| }; | |
| arc = { | |
| x: (d.source.x + d.target.x) / 2 + arcRadius * Math.cos(theta), | |
| y: (d.source.y + d.target.y) / 2 + arcRadius * Math.sin(theta) | |
| }; | |
| return 'M' + | |
| front.x + ',' + | |
| front.y + 'Q' + | |
| arc.x + ',' + | |
| arc.y + ',' + | |
| d.target.x + ',' + | |
| d.target.y + 'Q' + | |
| arc.x + ',' + | |
| arc.y + ',' + | |
| back.x + ',' + | |
| back.y + 'Z'; | |
| } | |
| d3.csv('matches.csv', function (data) { | |
| var skaterLookup = {}; | |
| var graph = { | |
| nodes: [], | |
| edges: [] | |
| }; | |
| data.sort(function (a, b) { | |
| return a.round - b.round; | |
| }); | |
| data.forEach(function (d) { | |
| if (!skaterLookup.hasOwnProperty(d.winner)) { | |
| skaterLookup[d.winner] = graph.nodes.length; | |
| graph.nodes.push({ | |
| name: d.winner, | |
| roundNumber: d.round, | |
| highestRound: true | |
| }); | |
| } | |
| if (!skaterLookup.hasOwnProperty(d.loser)) { | |
| skaterLookup[d.loser] = graph.nodes.length; | |
| graph.nodes.push({ | |
| name: d.loser, | |
| roundNumber: d.round, | |
| highestRound: true | |
| }); | |
| } | |
| var oldWinner = skaterLookup[d.winner]; | |
| graph.nodes[oldWinner].highestRound = false; | |
| skaterLookup[d.winner] = graph.nodes.length; | |
| graph.nodes.push({ | |
| name: d.winner, | |
| roundNumber: d.round, | |
| highestRound: true | |
| }); | |
| graph.edges.push({ | |
| source: oldWinner, | |
| target: skaterLookup[d.winner] | |
| }); | |
| graph.edges.push({ | |
| source: skaterLookup[d.loser], | |
| target: skaterLookup[d.winner] | |
| }); | |
| }); | |
| var linkLayer = d3.select('#Layer_1'); | |
| var nodeLayer = d3.select('#Layer_2'); | |
| force.nodes(graph.nodes) | |
| .links(graph.edges) | |
| .start(); | |
| var link = linkLayer.selectAll('.link') | |
| .data(graph.edges); | |
| var linkEnter = link.enter(); | |
| linkEnter.append('path') | |
| .attr('class', 'link'); | |
| var node = nodeLayer.selectAll('.node') | |
| .data(graph.nodes); | |
| var nodeEnter = node.enter().append('g') | |
| .attr('class', 'node') | |
| .attr('id', function (d, i) { | |
| if (d.highestRound === false) { | |
| return d.name + d.roundNumber; | |
| } else { | |
| return d.name; | |
| } | |
| }); | |
| nodeEnter.append('rect') | |
| .attr('x', '-0.75em') | |
| .attr('width', '1.5em') | |
| .attr('y', '-1em') | |
| .attr('height', '1.5em') | |
| .attr('fill', function (d) { | |
| return color(d.name); | |
| }); | |
| node.call(force.drag); | |
| force.on('tick', function (e) { | |
| link.attr('d', drawPointyArc); | |
| node.attr('transform', function (d) { | |
| return 'translate(' + d.x + ',' + d.y + ')'; | |
| }); | |
| }); | |
| }); |