我試圖獲取一個節點的屏幕位置的佈局已經由d3.behavior.zoom轉化後(),但我運氣不好。在翻譯和縮放佈局之後,我該如何獲得節點在窗口中的實際位置?獲得D3節點的屏幕位置後
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座標的畫面相對的狀態。見下文。
我懷疑答案可能涉及到使用SVG元素的getCTM()和/或getScreenCTM()[基本數據類型](http://www.w3.org/TR/SVG/types.html#__svg__SVGLocatable__getCTM )。我想知道是否有輔助方法在由這些函數返回的矩陣上操作,例如Inverse(tm)或類似的效果。 –