Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何计算D3对角线路径的中心?_Javascript_Svg_D3.js_Tree_Data Visualization - Fatal编程技术网

Javascript 如何计算D3对角线路径的中心?

Javascript 如何计算D3对角线路径的中心?,javascript,svg,d3.js,tree,data-visualization,Javascript,Svg,D3.js,Tree,Data Visualization,问:计算对角线D3路径中心的最佳方法是什么 可视化示例和原始来源: 目标:我尝试在水平D3树的路径上覆盖名为谓词的链接/关系描述文本。我想把它们放在小路的中央。有时路径是对角线曲线,有时是直线水平线 对于每个链路路径,我有一个源节点和一个目标节点,我认为我应该能够使用如下算法计算中心: For nodes vertically above the root Node... xCoordinate = d.target.x - (d.target.x - d.source.x)/2 yCo

问:计算对角线D3路径中心的最佳方法是什么

可视化示例和原始来源:

目标:我尝试在水平D3树的路径上覆盖名为谓词的链接/关系描述文本。我想把它们放在小路的中央。有时路径是对角线曲线,有时是直线水平线

对于每个链路路径,我有一个源节点和一个目标节点,我认为我应该能够使用如下算法计算中心:

For nodes vertically above the root Node...
  xCoordinate = d.target.x - (d.target.x - d.source.x)/2
  yCoordinate = d.source.y - (d.source.y - d.target.y)/2

For nodes vertically below the root Node...
  xCoordinate = d.target.x - (d.target.x - d.source.x)/2
  yCoordinate = d.target.y - (d.target.y - d.source.y)/2
相反,这根本不起作用。我阅读了API参考,看起来对角线方法可能会有所帮助,但不清楚如何使用它

在当前代码块中,我通过向svg画布中添加一个元素,然后向元素中添加一个

var linkTextItems = vis.selectAll("g.linkText")
    .data(tree.links(nodes), function(d) { return d.target.id; })

var linkTextEnter = linkTextItems.enter().append("svg:g")
    .attr("class", "linkText")
    //.attr("id", function(d) { return d.source.id + ":" + d.target.id; })
    //.attr("predicate", function(d) { return (linksByIdHash[d.source.id + ":" + d.target.id].predicate); })
    .attr("transform", function(d) { return "translate(" + (d.target.x) + "," + (d.target.y) + ")"; });

// Add Predicate text to each link path
linkTextEnter.append("svg:foreignObject")
    .attr("width", "150")
    .attr("height", "40")
  .append("xhtml:body")
    .attr("xmlns", "http://www.w3.org/1999/xhtml")
    .html(function(d){ return "<p>" + (linksByIdHash[d.source.id + ":" + d.target.id].predicate) + "</p>"; });
但是,谓词描述符(即谓词1、谓词2等)与它们关联的每个路径的中心不对齐


如何将谓词文本直接定位在路径的中心?

要查找路径的中心,可以使用发布的代码并将“文本对齐”属性设置为“中心”

或:


其中path是包含path元素的变量

谢谢您的帮助。你的回答对我来说仍然模糊不清,我不是那么先进的编码员。我要将哪个选项传递到getCentriodselection函数中,以及我应该如何将其绑定到transform和/或translate函数中?我将使用另一个选项编辑答案,更简单
var centroid = path.centroid(d),
    cenX = centroid[0],                //coordinates x of each path
    cenY = centroid[1];                //coordinates y of each path