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.
};
ガイダンスをいただければ幸いです。
EDIT:上のノードは強制レイアウトノードなので、xおよびyプロパティはシミュレーションによって設定され、シミュレーションの実行後にはどのタイプの変換が適用されるかにかかわらず一定のままです。
EDIT:私が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属性を使用してコンテナ要素にトランスフォームを適用します。
EDIT:ノード座標の代わりにマウス座標を使用して問題を回避しています。なぜなら、ノードがマウスポインタで覆われているときにノード位置に興味があるからです。それはまさに私が後にしている行動ではありませんが、それは大部分のために働き、何よりも優れています。
EDIT:解決策は、element.getCTM()を使用してsvg要素の現在の変換行列を取得し、それを使用してx座標とy座標をスクリーン相対状態にオフセットすることでした。下記参照。
SVG要素[基本データ型](http://www.w3.org/TR/SVG/types.html#__svg__SVGLocatable__getCTM)のgetCTM()および/またはgetScreenCTM()を使用して何かを行う必要があると思われます。 )。 Inverse(tm)やそのような関数のような、それらの関数によって返された行列を操作するヘルパーメソッドがあるかどうか疑問に思っています。 –