Ich versuche, die Bildschirmposition eines Knotens zu erhalten, nachdem das Layout von d3.behavior.zoom() transformiert wurde, aber ich habe nicht viel Glück. Wie kann ich nach dem Übersetzen und Skalieren des Layouts die tatsächliche Position eines Knotens im Fenster ermitteln?Bildschirmpositionen von D3-Knoten nach der Umwandlung abrufen
mouseOver = function(node) {
screenX = magic(node.x); // Need a magic function to transform node
screenY = magic(node.y); // positions into screen coordinates.
};
Jede Anleitung würde geschätzt werden.
BEARBEITEN: 'Knoten' oben ist ein Kraftlayout-Knoten, also werden die x- und y-Eigenschaften von der Simulation gesetzt und bleiben konstant, unabhängig davon, welche Art von Transformation angewendet wird.
BEARBEITEN: Die Strategie, die ich benutze, um das SVG zu transformieren kommt von d3 Zoom-Verhalten, das hier beschrieben wird: 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 + ")");
}
Es ist ziemlich einfach. Das Zoom-Verhalten von d3 liefert Pan- und Zoom-Ereignisse an einen Handler, der die Transformationen über das Attribut transform auf das Container-Element anwendet.
BEARBEITEN: Ich arbeite um das Problem herum, indem ich Mauskoordinaten anstelle von Knotenkoordinaten verwende, da ich an der Knotenposition interessiert bin, wenn der Knoten mit dem Mauszeiger über die Maus bewegt wird. Es ist nicht genau das Verhalten, nach dem ich suche, aber es funktioniert größtenteils und ist besser als nichts.
EDIT: Die Lösung war, die aktuelle Transformationsmatrix des Svg-Elements mit element.getCTM() zu erhalten und sie dann zu verwenden, um die x- und y-Koordinaten in einen bildschirmbezogenen Zustand zu versetzen. Siehe unten.
Ich vermute, die Antwort könnte etwas mit getCTM() und/oder getScreenCTM() des SVG-Elements [Grunddatentypen] tun (http://www.w3.org/TR/SVG/types.html#__svg__SVGLocatable__getCTM). Ich frage mich, ob es Hilfsmethoden gibt, die auf den Matrizen funktionieren, die von diesen Funktionen zurückgegeben werden, wie Inverse (tm) oder etwas in diesem Sinne. –