Próbuję uzyskać pozycję ekranu węzła po tym, jak układ został przekształcony przez d3.behavior.zoom(), ale nie mam dużo szczęścia. W jaki sposób mogę uzyskać rzeczywistą pozycję węzła w oknie po przetłumaczeniu i skalowaniu układu?Pobieranie pozycji ekranu węzłów D3 po transformacji
mouseOver = function(node) {
screenX = magic(node.x); // Need a magic function to transform node
screenY = magic(node.y); // positions into screen coordinates.
};
Wszelkie wskazówki będą mile widziane.
EDYCJA: "węzeł" powyżej jest węzłem układu sił, więc jego właściwości x i y są ustawiane przez symulację i pozostają stałe po zakończeniu symulacji, niezależnie od tego, jaki rodzaj transformacji zostanie zastosowany.
EDYCJA: Strategia, której używam do transformacji SVG pochodzi z zachowania zoomu d3, które jest tutaj opisane: 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 + ")");
}
To całkiem proste. Funkcja zoomu d3 dostarcza zdarzenia panoramowania i powiększania do programu obsługi, który stosuje przekształcenia do elementu kontenera za pomocą atrybutu transformacji.
EDYCJA: Zajmuję się problemem, używając współrzędnych myszy zamiast współrzędnych węzła, ponieważ interesuje mnie pozycja węzła, gdy węzeł jest przesuwany wskaźnikiem myszy. Nie jest to zachowanie, którego szukam, ale działa w większej części i jest lepsze niż nic.
EDYCJA: Rozwiązaniem było pobranie bieżącej macierzy transformacji elementu svg za pomocą elementu element.getCTM(), a następnie użycie jej do przesunięcia współrzędnych xiy względem stanu ekranu. Zobacz poniżej.
Podejrzewam, że odpowiedź może wymagać zrobienia czegoś z getCTM() i/lub getScreenCTM() elementu SVG [Podstawowe typy danych] (http://www.w3.org/TR/SVG/types.html#__svg__SVGLocatable__getCTM). Zastanawiam się, czy istnieją metody pomocnicze do działania na macierzy zwróconych przez te funkcje, takie jak Inverse (tm) lub coś podobnego do tego. –