Я пытаюсь получить положение экрана node после того, как макет был преобразован d3.behavior.zoom(), но мне не очень повезло. Как я могу получить фактическую позицию node в окне после перевода и масштабирования макета?
mouseOver = function(node) {
screenX = magic(node.x); // Need a magic function to transform node
screenY = magic(node.y); // positions into screen coordinates.
};
Любое руководство будет оценено.
EDIT: "node" выше - макет силы node, поэтому свойства x и y задаются симуляцией и остаются постоянными после того, как симуляция останавливается, независимо от того, какой тип преобразования применяется.
EDIT: стратегия, которую я использую для преобразования SVG, происходит из поведения d3-масштабирования, которое описано здесь: SVG Geometric Масштабирование.
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 позволяет переносить события панорамирования и масштабирования в обработчик, который применяет преобразования к элементу контейнера с помощью атрибута преобразования.
EDIT: Я работаю над проблемой, используя координаты мыши вместо координат node, так как меня интересует позиция node, когда node наводится на указатель мыши. Это не совсем то, что мне нужно, но оно работает по большей части и лучше, чем ничего.
EDIT: решение заключалось в том, чтобы получить текущую матрицу преобразования элемента svg с элементом element.getCTM(), а затем использовать ее для смещения координат x и y в относительное состояние экрана. См. Ниже.