我目前正在使用图形可视化,我使用SVG和D3库。我的设计师问我是否可以将图表边缘的箭头放在对应于线条长度的80%的位置上。 通过使用 getPointAtLength 方法,我能够实现第一部分 - 获得位置。
var svg = d3.select("body").append("svg")
.attr("width", 960)
.attr("height", 500)
var path = svg.append("path")
.attr("d", "M20,20C400,20,20,400,400,400")
.attr("fill", "none")
.attr("stroke", "black");
var pathEl = path.node();
var pathLength = pathEl.getTotalLength();
var pathPoint = pathEl.getPointAtLength(pathLength*0.5);
var point = svg.append("svg:circle")
.style("fill", "red")
.attr("r", 5)
.attr("cx", pathPoint.x)
.attr("cy", pathPoint.y);
现在我想知道如何用相应的方向将箭头连接到这个位置。更重要的是我如何才能这样做,这样我就可以在移动相关节点时更新图形的边缘。 我还没有找到任何答案,“标记”的示例正在使用路径属性,如: style('marker-end',“url(#end-arrow)”)
答案 0 :(得分:6)
首先,来自SO的答案很长。快速回答是SVG <markers>
(基本)简答:在红点前稍微点一点,测量斜率并在两点之间划一条线。现在问题简化为:如何在直线末端添加箭头?使用快速回答。
将此添加到您的代码中以显示答案: -
var pathPoint2 = pathEl.getPointAtLength(pathLength*0.78);
var point2 = svg.append("svg:circle")
.style("fill", "blue")
.attr("r", 3)
.attr("cx", pathPoint2.x)
.attr("cy", pathPoint2.y);
var slope = (pathPoint.y - pathPoint2.y)/(pathPoint.x - pathPoint2.x);
var x0 = pathPoint2.x/2;
var y0 = slope*(x0 - pathPoint.x) + pathPoint.y;
var line = svg.append("svg:path")
.style("stroke","green")
.attr("d", "M" + pathPoint.x + "," + pathPoint.y + " L" + x0 +","+ y0);