【问题标题】:Reset SVG to original transform matrix将 SVG 重置为原始变换矩阵
【发布时间】:2016-07-03 23:13:18
【问题描述】:

我正在尝试将我的 SVG 重置为其原始变换矩阵属性。我有一个缩放函数,它使用这个矩阵来放大和缩小 SVG。但是,我希望能够将 SVG 重置回它最初拥有的变换矩阵。

我首先将变换矩阵属性加载到一个数组中,然后在我的缩放函数中使用它。

如何存储原始值,使我的缩放功能不会触及它们,以便我可以使用它们来重置 SVG?

这是我的JSfiddle

这是我的脚本:

$(document).ready(function() {
    var newMatrix;
    var transMatrix = $("#svgGroup").attr("transform").replace(/[^0-9.,]+/, "");
    transMatrix = transMatrix.split(",");
    var origMatrix = [1,0,0,1, parseFloat(transMatrix[4]), parseFloat(transMatrix[5])];

    $("#out").click(function() {
            zoom(0.8)
    });
    $("#in").click(function() {
            zoom(1.25);
    });

    $("#reset").click(function() {
        alert(origMatrix)
            $("#svgGroup").attr("transform", "matrix(" + origMatrix + ")");
    });

    function zoom(scale) {
            for (var i=0; i<origMatrix.length; i++) {
                    origMatrix[i] *= scale;
             }
            newMatrix = "matrix(" +  origMatrix.join(' ') + ")";
            $("#svgGroup").attr("transform", newMatrix);
    }
    });

【问题讨论】:

    标签: javascript jquery html matrix svg


    【解决方案1】:

    您必须深度克隆原始数组。为了做到这一点,请使用.slice(0)

    var origMatrix = [1,0,0,1, parseFloat(transMatrix[4]), parseFloat(transMatrix[5])];
    var initialValue = origMatrix.slice(0);
    

    现在您可以在重置功能中使用它了。

    $("#reset").click(function() {
              origMatrix = initialValue.slice(0);
              $("#svgGroup").attr("transform", "matrix(" + origMatrix + ")");
    });
    

    jsfiddle

    【讨论】:

    • 谢谢!这样做的工作:)
    【解决方案2】:

    如果不使用 SVG DOM,您似乎让这件事变得比实际需要的困难得多。重置只是将比例更改回 1 的问题。

    这里是some simplified code

    $(document).ready(function() {
            $("#out").click(function() {
                    zoom(0.8)
            });
            $("#in").click(function() {
                    zoom(1.25);
            });
    
            $("#reset").click(function() {
                    scale = 1.0 / $("#svgGroup")[0].transform.baseVal.getItem(0).matrix.a;
                    zoom(scale);
            });
    
            function zoom(scale) {
                    var transform = $("#svgGroup")[0].transform.baseVal.getItem(0);
                    transform.matrix.a *= scale;
                    transform.matrix.d *= scale;
                    transform.matrix.e *= scale;
                    transform.matrix.f *= scale;
            }
    });
    

    【讨论】:

    • 这也有效:) 但是,我也有一个使用矩阵的平移功能。 JSfiddlehere。我正在关注这个tutorial 以获取我的缩放和平移功能。
    • @truly-daunting 我认为本教程通过避免使任务更容易实现的内置函数,让事情看起来比实际更难。
    • 我将如何调整上面的代码以使缩放发生在用户点击屏幕的位置?事实上,它一直在左上角放大。
    猜你喜欢
    • 2020-11-18
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    相关资源
    最近更新 更多