Built with blockbuilder.org
A draggable tactics board for soccer (Think Andy Townsend circa late 1990s).
More info here: http://jalapic.github.io/tacticsboard
Built with blockbuilder.org
A draggable tactics board for soccer (Think Andy Townsend circa late 1990s).
More info here: http://jalapic.github.io/tacticsboard
| x,y,team,player | |
| 45,250,A,1 | |
| 306,211,A,6 | |
| 312,265,A,4 | |
| 410,55,A,23 | |
| 400,400,A,7 | |
| 455,235,A,15 | |
| 465,180,A,8 | |
| 489,310,A,24 | |
| 640,380,A,11 | |
| 730,250,A,39 | |
| 685,75,A,40 | |
| 980,252,B,1 | |
| 764,213,B,2 | |
| 758,267,B,3 | |
| 725,57,B,4 | |
| 670,402,B,5 | |
| 570,231,B,6 | |
| 560,176,B,7 | |
| 522,306,B,8 | |
| 444,376,B,9 | |
| 345,246,B,10 | |
| 450,75,B,11 |
| <!DOCTYPE html> | |
| <head> | |
| <meta charset="utf-8"> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script> | |
| <style> | |
| body { margin:0;position:fixed;top:0;right:0;bottom:0;left:0; } | |
| svg { width:100%; height: 100% } | |
| </style> | |
| </head> | |
| <body> | |
| <script> | |
| var holder = d3.select("body") // select the 'body' element | |
| .append("svg") // append an SVG element to the body | |
| .attr("width", 1200) | |
| .attr("height", 600); | |
| // draw a rectangle - pitch | |
| holder.append("rect") // attach a rectangle | |
| .attr("x", 0) // position the left of the rectangle | |
| .attr("y", 0) // position the top of the rectangle | |
| .attr("height", 500) // set the height | |
| .attr("width", 1000) // set the width | |
| .style("stroke-width", 5) // set the stroke width | |
| .style("stroke", "#001400") // set the line colour | |
| .style("fill", "#80B280"); // set the fill colour | |
| // draw a rectangle - halves | |
| holder.append("rect") // attach a rectangle | |
| .attr("x", 0) // position the left of the rectangle | |
| .attr("y", 0) // position the top of the rectangle | |
| .attr("height", 500) // set the height | |
| .attr("width", 500) // set the width | |
| .style("stroke-width", 5) // set the stroke width | |
| .style("stroke", "#001400") // set the line colour | |
| .style("fill", "#80B280"); // set the fill colour | |
| // draw a circle - center circle | |
| holder.append("circle") // attach a circle | |
| .attr("cx", 500) // position the x-centre | |
| .attr("cy", 250) // position the y-centre | |
| .attr("r", 50) // set the radius | |
| .style("stroke-width", 5) // set the stroke width | |
| .style("stroke", "#001400") // set the line colour | |
| .style("fill", "none"); // set the fill colour | |
| // draw a rectangle - penalty area 1 | |
| holder.append("rect") // attach a rectangle | |
| .attr("x", 0) // position the left of the rectangle | |
| .attr("y", 105) // position the top of the rectangle | |
| .attr("height", 290) // set the height | |
| .attr("width", 170) // set the width | |
| .style("stroke-width", 5) // set the stroke width | |
| .style("stroke", "#001400") // set the line colour | |
| .style("fill", "#80B280"); // set the fill colour | |
| // draw a rectangle - penalty area 2 | |
| holder.append("rect") // attach a rectangle | |
| .attr("x", 830) // position the left of the rectangle | |
| .attr("y", 105) // position the top of the rectangle | |
| .attr("height", 290) // set the height | |
| .attr("width", 170) // set the width | |
| .style("stroke-width", 5) // set the stroke width | |
| .style("stroke", "#001400") // set the line colour | |
| .style("fill", "#80B280"); // set the fill colour | |
| // draw a rectangle - six yard box 1 | |
| holder.append("rect") // attach a rectangle | |
| .attr("x", 0) // position the left of the rectangle | |
| .attr("y", 184) // position the top of the rectangle | |
| .attr("height", 132) // set the height | |
| .attr("width", 60) // set the width | |
| .style("stroke-width", 5) // set the stroke width | |
| .style("stroke", "#001400") // set the line colour | |
| .style("fill", "#80B280"); // set the fill colour | |
| // draw a rectangle - six yard box 2 | |
| holder.append("rect") // attach a rectangle | |
| .attr("x", 940) // position the left of the rectangle | |
| .attr("y", 184) // position the top of the rectangle | |
| .attr("height", 132) // set the height | |
| .attr("width", 60) // set the width | |
| .style("stroke-width", 5) // set the stroke width | |
| .style("stroke", "#001400") // set the line colour | |
| .style("fill", "#80B280"); // set the fill colour | |
| // draw a circle - penalty spot 1 | |
| holder.append("circle") // attach a circle | |
| .attr("cx", 120) // position the x-centre | |
| .attr("cy", 250) // position the y-centre | |
| .attr("r", 5) // set the radius | |
| .style("fill", "#001400"); // set the fill colour | |
| // draw a circle - penalty spot 2 | |
| holder.append("circle") // attach a circle | |
| .attr("cx", 880) // position the x-centre | |
| .attr("cy", 250) // position the y-centre | |
| .attr("r", 5) // set the radius | |
| .style("fill", "#001400"); // set the fill colour | |
| // draw a circle - center spot | |
| holder.append("circle") // attach a circle | |
| .attr("cx", 500) // position the x-centre | |
| .attr("cy", 250) // position the y-centre | |
| .attr("r", 5) // set the radius | |
| .style("fill", "#001400"); // set the fill colour | |
| // penalty box semi-circle 1 | |
| var vis = d3.select("body").append("svg") | |
| var pi = Math.PI; | |
| var arc = d3.svg.arc() | |
| .innerRadius(70) | |
| .outerRadius(75) | |
| .startAngle(0.75) //radians | |
| .endAngle(2.4) //just radians | |
| var arc2 = d3.svg.arc() | |
| .innerRadius(70) | |
| .outerRadius(75) | |
| .startAngle(-0.75) //radians | |
| .endAngle(-2.4) //just radians | |
| holder.append("path") | |
| .attr("d", arc) | |
| .attr("fill", "#001400") | |
| .attr("transform", "translate(120,250)"); | |
| holder.append("path") | |
| .attr("d", arc2) | |
| .attr("fill", "#001400") | |
| .attr("transform", "translate(880,250)"); | |
| // Dragging circles | |
| var color = d3.scale.ordinal().range(["maroon", "pink"]); | |
| var color1 = d3.scale.ordinal().range(["mediumturquoise", "red"]); | |
| //var color = d3.scale.category10(); | |
| var drag = d3.behavior.drag() | |
| .origin(function(d) { return d; }) | |
| .on("dragstart", dragstarted) | |
| .on("drag", dragged) | |
| .on("dragend", dragended); | |
| d3.csv("dots.txt", dottype, function(error, dots) { | |
| dot = holder.append("g") | |
| .attr("class", "dot") | |
| .selectAll("circle") | |
| .data(dots) | |
| .enter().append("circle") | |
| .attr("r", 14) | |
| .attr("cx", function(d) { return d.x; }) | |
| .attr("cy", function(d) { return d.y; }) | |
| .style("fill", function(d) { return color(d.team); }) | |
| .style("stroke", function(d) { return color1(d.team); }) | |
| .call(drag); | |
| }); | |
| // functions for above... | |
| function dottype(d) { | |
| d.x = +d.x; | |
| d.y = +d.y; | |
| return d; | |
| } | |
| function dragstarted(d) { | |
| d3.event.sourceEvent.stopPropagation(); | |
| d3.select(this) | |
| //.classed("dragging", true); | |
| ; | |
| } | |
| function dragged(d) { | |
| d3.select(this) | |
| .attr("cx", d.x = d3.event.x) | |
| .attr("cy", d.y = d3.event.y) | |
| .style("opacity", .5); | |
| } | |
| function dragended(d) { | |
| d3.select(this) | |
| .style("opacity", 1) | |
| // .classed("dragging", false); | |
| ; | |
| } | |
| </script> | |
| </body> |