J'essaie d'obtenir la position à l'écran d'un nœud après que la mise en page ait été transformée par d3.behavior.zoom() mais je n'ai pas beaucoup de chance. Comment puis-je obtenir la position réelle d'un nœud dans la fenêtre après la transformation et la mise à l'échelle de la présentation ?
mouseOver = function(node) {
screenX = magic(node.x); // Need a magic function to transform node
screenY = magic(node.y); // positions into screen coordinates.
};
Tout conseil serait apprécié.
EDIT : le 'nœud' ci-dessus est un nœud de disposition de force, donc ses propriétés x et y sont définies par la simulation et restent constantes après l'arrêt de la simulation, quel que soit le type de transformation appliqué.
EDIT : La stratégie que j'utilise pour transformer le SVG provient du comportement de zoom de d3, qui est décrit ici : Zoom géométrique SVG .
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 + ")");
}
Le comportement de zoom de d3 fournit des événements de panoramique et de zoom à un gestionnaire, qui applique les transformations à l'élément conteneur au moyen de l'attribut transform.
EDIT : Je contourne le problème en utilisant les coordonnées de la souris au lieu des coordonnées du nœud, puisque je suis intéressé par la position du nœud lorsque celui-ci est survolé par le pointeur de la souris. Ce n'est pas exactement le comportement que je recherche, mais cela fonctionne en grande partie, et c'est mieux que rien.
EDIT : La solution était de récupérer la matrice de transformation actuelle de l'élément svg avec element.getCTM() et de l'utiliser pour décaler les coordonnées x et y dans un état relatif à l'écran. Voir ci-dessous.