2014-03-02 64 views
0

我想在我的Highcharts圖表上繪製箭頭,並且到目前爲止提出了this。看起來不錯,但有問題:Highcharts路徑上的SVG標記

  • 較高的筆劃寬度會給出較長的箭頭。
  • 旋轉箭頭將需要複雜的計算,如here

如果我可以使用在Highcharts路徑like in this SVG tutorial繪製箭頭的SVG標記將變得更加容易

我的代碼:

renderer.path(['M', 200, 0, 'L', 200, 200,'L', 225, 200,'L',200,250,'L', 175, 200,'L', 200, 200]) 
    .attr({ 
     'stroke-width': 5, 
     stroke: 'red',fill:'red' 
    }) 
    .add(); 
renderer.path(['M', 400, 0, 'L', 400, 200,'L', 425, 200,'L',400,250,'L', 375, 200,'L', 400, 200]) 
    .attr({ 
     'stroke-width': 50, 
     stroke: 'red',fill:'red' 
    }) 
    .add(); 
+0

不知道這是真的有用,但是可能你周圍的箭頭中心旋轉,所以這將是有點像這個.. http://jsfiddle.net/ZS9wj/1 / – Ian

回答

3

我設法畫箭頭,而無需使用SVG標記。無論旋轉如何,箭頭都指向正確的位置。它甚至可以考慮起點和終點的半徑。

enter image description here

fiddle

function drawArrow(startX, startY, startRadius, endX, endY, endRadius, width) { 

    var angle = Math.PI + Math.atan((endX - startX)/(endY - startY)), 
     arrowLength = 3 * width, 
     arrowWidth = 1.5 * width, 
     path = [], 
     startArrowX, 
     startArrowY, 
     margin = 5; 

    if (endY >= startY) { 
     //correct for circle radius 
     startX -= ((startRadius + margin) * Math.sin(angle)); 
     startY -= ((startRadius + margin) * Math.cos(angle)); 
     endX += ((endRadius + margin) * Math.sin(angle)); 
     endY += ((endRadius + margin) * Math.cos(angle)); 

     //correct for arrow head length 
     endX += (arrowLength * Math.sin(angle)); 
     endY += (arrowLength * Math.cos(angle)); 

     //draw arrow head 
     path.push('M', endX, endY); 
     path.push(
      'L', 
     endX - arrowWidth * Math.cos(angle), 
     endY + arrowWidth * Math.sin(angle)); 
     path.push(
     endX - arrowLength * Math.sin(angle), 
     endY - arrowLength * Math.cos(angle)); 
     path.push(
     endX + arrowWidth * Math.cos(angle), 
     endY - arrowWidth * Math.sin(angle), 'Z'); 
    } else { 
     //correct for circle radius 
     startX += ((startRadius + margin) * Math.sin(angle)); 
     startY += ((startRadius + margin) * Math.cos(angle)); 
     endX -= ((endRadius + margin) * Math.sin(angle)); 
     endY -= ((endRadius + margin) * Math.cos(angle)); 

     //correct for arrow head length 
     endX -= (arrowLength * Math.sin(angle)); 
     endY -= (arrowLength * Math.cos(angle)); 

     //draw arrow head 
     path.push('M', endX, endY); 
     path.push(
      'L', 
     endX + arrowWidth * Math.cos(angle), 
     endY - arrowWidth * Math.sin(angle)); 
     path.push(
     endX + arrowLength * Math.sin(angle), 
     endY + arrowLength * Math.cos(angle)); 
     path.push(
     endX - arrowWidth * Math.cos(angle), 
     endY + arrowWidth * Math.sin(angle), 'Z'); 

    } 

    renderer.path(path) 
     .attr({ 
     'stroke-width': 1, 
     stroke: '#989898', 
     fill: '#989898' 
    }).add(); 
    renderer.path(['M', startX, startY, 'L', endX, endY]) 
     .attr({ 
     'stroke-width': width, 
     stroke: '#989898' 
    }).add();