1. 程式人生 > >d3.js繪製箭頭

d3.js繪製箭頭

1. 在 SVG 中定義箭頭的標識

定義箭頭的標識如下,先寫一對 <defs> ,裡面再寫一對 <marker>,其中 marker 的屬性的意義為:

viewBox 座標系的區域
refX, refY 在 viewBox 內的基準點,繪製時此點在直線端點上(要注意大小寫)
markerUnits 標識大小的基準,有兩個值:strokeWidth(線的寬度)和userSpaceOnUse(圖形最前端的大小)
markerWidth, markerHeight 標識的大小
orient 繪製方向,可設定為:auto(自動確認方向)和 角度值
id 標識的id號

然後在 marker 裡繪製圖形即可,下面的程式碼中用 path 繪製了一個箭頭的圖形。

[javascript] view plaincopy在CODE上檢視程式碼片派生到我的程式碼片
  1. <defs>  
  2. <marker id="arrow"
  3.         markerUnits="strokeWidth"
  4.         markerWidth="12"
  5.         markerHeight="12"
  6.         viewBox="0 0 12 12"
  7.         refX="6"
  8.         refY="6"
  9.         orient="auto">  
  10.         <path d="M2,2 L10,6 L2,10 L6,6 L2,2" style="fill: #000000;"
     />  
  11. </marker>  
  12. </defs>  

2. 在 SVG 中繪製箭頭

有了上面的標識,就可以繪製箭頭了。下面繪製一條線段,線上段末尾新增箭頭:

[javascript] view plaincopy在CODE上檢視程式碼片派生到我的程式碼片
  1. <line x1="0" y1="0" x2="200" y2="50"  stroke="red" stroke-width="2" marker-end="url(#arrow)"/>  

也可以用 path 來繪製:

[javascript] view plaincopy在CODE上檢視程式碼片派生到我的程式碼片
  1. <path d="M20,70 T80,100 T160,80 T200,90"
     fill="white" stroke="red" stroke-width="2" marker-start="url(#arrow)" marker-mid="url(#arrow)" marker-end="url(#arrow)"/>  

在不同的位置繪製的屬性如下:

  • marker-start :路徑起點處
  • marker-mid:路徑中間端點處(必須是 path 中間出現的點)
  • marker-end :路徑終點處

3. 使用 D3 繪製箭頭

有了上面的內容,在 D3 中如何繪製呢?

先定義箭頭的標識:

[javascript] view plaincopy在CODE上檢視程式碼片派生到我的程式碼片
  1. var svg = d3.select("body").append("svg")  
  2.         .attr("width", width)  
  3.         .attr("height", height);  
  4. var defs = svg.append("defs");  
  5. var arrowMarker = defs.append("marker")  
  6.                         .attr("id","arrow")  
  7.                         .attr("markerUnits","strokeWidth")  
  8.                         .attr("markerWidth","12")  
  9.                         .attr("markerHeight","12")  
  10.                         .attr("viewBox","0 0 12 12")   
  11.                         .attr("refX","6")  
  12.                         .attr("refY","6")  
  13.                         .attr("orient","auto");  
  14. var arrow_path = "M2,2 L10,6 L2,10 L6,6 L2,2";  
  15. arrowMarker.append("path")  
  16.             .attr("d",arrow_path)  
  17.             .attr("fill","#000");  

使用上述 marker 繪製箭頭的程式碼為:

[javascript] view plaincopy在CODE上檢視程式碼片派生到我的程式碼片
  1. //繪製直線
  2. var line = svg.append("line")  
  3.              .attr("x1",0)  
  4.              .attr("y1",0)  
  5.              .attr("x2",200)  
  6.              .attr("y2",50)  
  7.              .attr("stroke","red")  
  8.              .attr("stroke-width",2)  
  9.              .attr("marker-end","url(#arrow)");  
  10. //繪製曲線
  11. var curve_path = "M20,70 T80,100 T160,80 T200,90";  
  12. var curve = svg.append("path")  
  13.              .attr("d",curve_path)  
  14.              .attr("fill","white")  
  15.              .attr("stroke","red")  
  16.              .attr("stroke-width",2)  
  17.              .attr("marker-start","url(#arrow)")  
  18.              .attr("marker-mid","url(#arrow)")  
  19.              .attr("marker-end","url(#arrow)");  

結果圖為本文開始處的圖片,完整程式碼為: