在布局被 d3.behavior.zoom() 转换后,我试图获取节点的屏幕位置,但我运气不佳。翻译和缩放布局后,如何获取节点在窗口中的实际位置?
mouseOver = function(node) {
screenX = magic(node.x); // Need a magic function to transform node
screenY = magic(node.y); // positions into screen coordinates.
};
任何指导将不胜感激。
编辑:上面的“节点”是一个力布局节点,所以它的 x 和 y 属性由模拟设置,并且在模拟停止后保持不变,无论应用什么类型的变换。
编辑:我用来转换 SVG 的策略来自 d3 的缩放行为,此处概述:SVG Geometric Zooming。
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height)
.append("g")
.call(d3.behavior.zoom().scaleExtent([1, 8]).on("zoom", zoom))
.append("g");
svg.append("rect")
.attr("class", "overlay")
.attr("width", width)
.attr("height", height);
svg.selectAll("circle")
.data(data)
.enter().append("circle")
.attr("r", 2.5)
.attr("transform", function(d) { return "translate(" + d + ")"; });
function zoom() {
svg.attr("transform", "translate(" + d3.event.translate + ")scale(" + d3.event.scale + ")");
}
这很简单。d3 的缩放行为将平移和缩放事件传递给处理程序,该处理程序通过 transform 属性将变换应用于容器元素。
编辑:我正在通过使用鼠标坐标而不是节点坐标来解决这个问题,因为当节点用鼠标指针悬停在节点上时,我对节点位置感兴趣。这不完全是我所追求的行为,但它在大多数情况下都有效,而且总比没有好。
编辑:解决方案是使用 element.getCTM() 获取 svg 元素的当前变换矩阵,然后使用它将 x 和 y 坐标偏移到屏幕相对状态。见下文。