Большее использование getTransformToElement

#svg

#svg

Вопрос:

Я не смог найти много подробностей о методе getTransformToElement и о том, как его правильно использовать.

Из спецификации

«Возвращает матрицу преобразования из пользовательской системы координат для текущего элемента (после применения атрибута ‘transform’, если таковой имеется) в пользовательскую систему координат для элемента parameter (после применения его атрибута ‘transform’, если таковой имеется)».

Такая терминология, как SVG canvas, viewbox, видовой экран, кординат пользователя, кординат экрана (http://www.w3.org/TR/SVG/coords.html ) и т.д. затрудняют понимание того, для чего именно используется этот интерфейс.

Спасибо,

bsr

Ответ №1:

Он возвращает матрицу преобразования, я бы пока не слишком беспокоился об этой другой терминологии. Если у вас есть какой-нибудь SVG, подобный этому:

 <svg id="mysvg" viewBox="0 0 640 480">
    <g transform="skewX(45) skewY(33)">
        <text x="60" y="290" id="mytext">Example</text>
    </g>
</svg>
  

Затем вы можете использовать getTransformToElement вот так:

 //Get the SVG root for context
var s = document.getElementById('mysvg');
//Get a reference to the element
var t = document.getElementById('mytext');
//Find the transformation that would need to be applied to s to put it in the same co-ordinate space as t
var m = s.getTransformToElement(t);
  

В конце этого кода m будет объектом, представляющим матрицу (там тоже есть куча методов, но я их игнорирую):

 m = {a: 1, b: -0.6494075655937195, c: -1, d: 1.6494076251983643, e: 0, f: 0}
  

Затем вы можете использовать эту матрицу, чтобы применить то же преобразование, что и on mytext относительно mysvg любого другого элемента в соответствии с матричным умножением из спецификации SVG:

изображение умножения матрицы

Как отмечено в комментарии ниже, этот метод устарел в пользу getCTM в предстоящем стандарте SVG 2.

Комментарии:

1. getTransformToElement устарел с февраля 2016 года: lists.w3.org/Archives/Public/www-svg/2015Aug/att-0009 /…

Ответ №2:

возможная замена для

 fromElement.getTransformToElement(toElement)
  

является

 toElememnt.getScreenCTM().inverse().multiply( fromElement.getScreenCTM() )