在这里和D3网站上有一些问题,关于你如何找到FROM
的中心点(或任何一点),但我似乎无法找到如何找到使用path
执行此操作。
我在这里完成了simple jsfiddle。基本上我需要在一条线上添加一个形状(使用jsfiddle中的文字使其更清晰)(为简单起见,请说中间)
所以我有一个svg:
line
并添加一条线(位置是固定的,不是来自数据)
var canvas = d3.select('body').append('svg').attr('width', 500).attr('height', 500);
我在演示文稿的顶部和底部添加了一些文本
var line = canvas.append('line').attr('x1', 50).attr('y1', 50).attr('x2', 250).attr('y2', 150);
canvas.append('text').attr('x', line.attr('x1')).attr('y', line.attr('y1')).text('top');
canvas.append('text').attr('x', line.attr('x2')).attr('y', line.attr('y2')).text('bottom');
有获取中心点和宽度/ BBox等的方法,但path
似乎没有。
任何人都有任何想法如何实现这一目标?
我的第一个问题是获得x1 / x2值之间的差异,如下所示:
line
但正如你从jsfiddle看到的那样,它不知何故。
有人想指出我的错误吗?
答案 0 :(得分:1)
我想,这会奏效:
var lineData = {x1: 50, y1: 50, x2: 250, y2: 150};
var canvas = d3.select('body').append('svg').attr('width', 500).attr('height', 500);
var line = canvas.append('line').attr('x1', lineData.x1).attr('y1', lineData.y1).attr('x2', lineData.x2).attr('y2', lineData.y2);
console.log(line);
var x = lineData.x1 + Math.abs(lineData.x2 - lineData.x1) / 2;
var y = lineData.y1 + Math.abs(lineData.y2 - lineData.y1) / 2;
console.log([x,y]);
canvas.append('text').attr('x', x).attr('y', y).text('X');
答案 1 :(得分:1)
订单强>
使用简单的数学,距离公式。
var canvas = d3.select('body').append('svg').attr('width', 500).attr('height', 500);
var line = canvas.append('line').attr('x1', 50).attr('y1', 50).attr('x2', 250).attr('y2', 150);
var x1 = parseInt(line.attr("x1"));
var y1 = parseInt(line.attr("y1"));
var x2 = parseInt(line.attr("x2"));
var y2 = parseInt(line.attr("y2"));
var midPoint = { x: (x1+x2)/2, y: (y1+y2)/2 };
canvas.append('text').attr('x', midPoint.x).attr('y', midPoint.y).text('X');
line{
stroke:#444;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<强>路径强>
var canvas = d3.select('body').append('svg').attr('width', 500).attr('height', 500);
var line = canvas.append('path').attr('d', "M 50 50 L 250 150");
var path = line.node();
var midPoint = path.getPointAtLength(path.getTotalLength()/2);
canvas.append('text').attr('x', midPoint.x).attr('y', midPoint.y).text('X');
path{
stroke: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
答案 2 :(得分:0)
解决了这个问题,所以我想在没有其他人发现这个问题的情况下回答它。
使用了getBBox()
节点(使用.node()
)。用于获取width
,height
和xy
:
var canvas = d3.select('body').append('svg')
.attr('width', 500)
.attr('height', 500);
var line = canvas.append('line')
.attr('x1', 50)
.attr('y1', 150)
.attr('x2', 50)
.attr('y2', 250);
然后中间的x
和y
是:
var midX = line.node().getBBox().x + line.node().getBBox().width / 2;
var midY = line.node().getBBox().y + line.node().getBBox().height / 2;