手动构造矩阵调试

问题描述 投票:0回答:1

我想看看当我手动构造变换矩阵时是否可以正确获得矩阵值。带有

id=One
的元素已经提供了变换元素。对于带有
id=Two
的元素,我手动构造了与
id=One
完全相同的变换元素。然而,当我记录两者的合并矩阵时,它们并不相同。

如何才能使

id=Two
获得与
id=One
相同的合并矩阵值。我做错了什么?

console.log(document.querySelector('#one')
    .transform.baseVal.consolidate().matrix);

const svg = document.querySelector('svg');
const testElement = document.querySelector('#two');
const transformList = testElement.transform.baseVal;
let matrix = svg.createSVGMatrix();
matrix = matrix.translate(-247.890625, -60).scale(1, 0).translate(247.890625, 60);
const transform = svg.createSVGTransformFromMatrix(matrix);
transformList.appendItem(transform);
transformList.consolidate();
console.log(matrix);
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>SVG Transformations</title>
    <script type="text/javascript" src="https://d3js.org/d3.v7.min.js"></script>
  </head>
  <body>
    <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1280 720">
      <rect class="vBoxRect" width="1280" height="720" fill="#EFEFEF"></rect>
      <g class="test" transform="translate(400,300)">
        <text id="one" x="10" y="60" stroke="red" fill="red" font-size="45px" text-anchor="start" transform="translate(-247.890625,-60)scale (1,0)translate(247.890625,60)" style="text-rendering: geometricprecision; font-size: xxx-large;">F</text>
        <text id="two" x="10" y="60" stroke="green" fill="green" font-size="45px" text-anchor="start" style="text-rendering: geometricprecision; font-size: xxx-large;">X</text>
      </g>
    </svg>
    <script type="text/javascript"></script>
  </body>
</html>

javascript svg matrix transform
1个回答
0
投票

SVGMatrix.scale(s)

 不同,
DOMMatrix.scale(sx, sy)
仅需要一个参数。该因子统一应用于两个维度。您需要使用
SVGMatrix.scaleNonUniform(sx, sy)

不幸的是,目前浏览器在执行

svg.createSVGMatrix()
并返回
SVGMatrix
时仅实现 SVG 1.1。使用 SVG 2,返回值将是
DOMMatrix
,并且您的代码将有效。

© www.soinside.com 2019 - 2024. All rights reserved.