デモはこちら
実装周り
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | // Knockoutjs周りは省略 var canvas = document.getElementById( "canvas" ) , c = canvas.getContext( "2d" ); function drawRader(){ var points = viewModel.points() , eachRad = (Math.PI*2) / points.length , i , accumRad = Math.PI/2 , radius = 150 , center = 200 , sin , cos , endOfAxisPt , firstPt , prevPt , currentPt; c.clearRect(0,0,400,400); for (i = 0; i < points.length; i ++){ c.strokeStyle = "#ffa500" ; c.beginPath(); sin = Math.sin(accumRad); cos = Math.cos(accumRad); endOfAxisPt = { x: center + (cos * radius), y: center - (sin * radius) }; accumRad += eachRad; c.moveTo(center, center); c.lineTo(endOfAxisPt.x, endOfAxisPt.y); c.stroke(); c.fillStyle = "#00A0E9" ; c.fillText(points[i].text(), endOfAxisPt.x - 10, endOfAxisPt.y - (sin * 20)); c.strokeStyle = "#00A0E9" ; c.beginPath(); currentPt = { x: center + (cos * (radius * points[i].ratio())), y: center - (sin * (radius * points[i].ratio())) }; if (prevPt){ c.moveTo(prevPt.x, prevPt.y); c.lineTo(currentPt.x, currentPt.y); } else firstPt = currentPt; prevPt = currentPt; c.stroke(); } c.beginPath(); c.moveTo(prevPt.x, prevPt.y); c.lineTo(firstPt.x, firstPt.y); c.stroke(); } drawRader(); |