Используя D3 v4, SVG и режим масштабирования, при перемещении мыши я хочу отобразить координаты мыши в системе координат SVG.
Событие mousemove появляется только для предоставления координат клиент / экран.
Как мне преобразовать эти координаты в координаты SVG, которые отражают текущее преобразование zooom / pan / etc?
Я могу видеть примеры этого с использованием оси / масштабов / и т. Д., Но я не создаю график и не использую ось / и т. Д. Я использую D3.js для интерактивной диаграммы.
Я попробовал подход crateSVGPoint / getScreenCTM, но (а) не совсем понял его и поэтому не уверен, как применить его к моему коду, и (б) он не работает, когда я масштабирую / панорамирую - Я просто получаю координаты клиент / экран. EG: вот код в моем событии mousemove для преобразования в SVG-коды:
var theSvg = document.getElementById('svgItem');
var pt = theSvg.createSVGPoint();
var cursorPoint = function(evt){
pt.x = evt.clientX; pt.y = evt.clientY;
return pt.matrixTransform(theSvg.getScreenCTM().inverse());
}
var loc = cursorPoint(d3.event);
//the pair of co-ordinates should be different on zoom, but aren't
d3.select(".statusBarText").text("move (" + d3.event.x + "," + d3.event.y + ") (" + loc.x + "," + loc.y + ")");
Для чего бы то ни было, поведение масштабирования применяется к элементу группы SVG элемента SVG. Масштабирование работает отлично; Я вижу, как перевод / шкала применяются к группе.
Я пытался изменить вышеупомянутое, чтобы вызвать createSVGPoint () для элемента группы, который был преобразован, но получил ошибки о том, что createSVGPoint () не является функцией; Я думаю, это работает только с элементом SVG из DOM ...
Также есть элемент viewBox для элемента SVG, который я использую, если это имеет значение.
Неужели должен быть простой способ сделать преобразование?