Obtendo posições na tela de nós D3 após a transformação
Eu estou tentando obter a posição da tela de um nó depois que o layout foi transformado por d3.behavior.zoom (), mas eu não estou tendo muita sorte. Como posso obter a posição real de um nó na janela depois de traduzir e dimensionar o layout?
mouseOver = function(node) {
screenX = magic(node.x); // Need a magic function to transform node
screenY = magic(node.y); // positions into screen coordinates.
};
Qualquer orientação seria apreciada.
EDIT: 'nó' acima é um nó de layout de força, portanto, as propriedades xey são definidas pela simulação e permanecem constantes após a simulação parar, independentemente do tipo de transformação aplicado.
EDIT: A estratégia que estou usando para transformar o SVG vem do comportamento de zoom do d3, que é descrito aqui:Zoom Geométrico 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 + ")");
}
É bem direto. O comportamento de zoom do d3 oferece eventos pan e zoom para um manipulador, que aplica as transformações ao elemento contêiner por meio do atributo transform.
EDIT: Estou trabalhando em torno do problema usando coordenadas do mouse em vez de coordenadas do nó, desde que eu estou interessado na posição do nó quando o nó é passado com o ponteiro do mouse. Não é exatamente o comportamento que procuro, mas funciona na maior parte e é melhor que nada.
EDIT: A solução foi obter a matriz de transformação atual do elemento svg com element.getCTM () e, em seguida, usá-lo para compensar as coordenadas x e y para um estado relativo à tela. Ver abaixo.