Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SVG Javascript和在执行旋转时管理转换矩阵_Javascript_Matrix_Svg_Transform - Fatal编程技术网

SVG Javascript和在执行旋转时管理转换矩阵

SVG Javascript和在执行旋转时管理转换矩阵,javascript,matrix,svg,transform,Javascript,Matrix,Svg,Transform,我有一系列在inkscape(或类似的矢量图形应用程序)中创建的SVG文件 当SVG中的元素在屏幕上移动时,编辑工具会将其应用于SVG中的元素(显然,它们这样做是为了提高效率)。这些工具根据矩阵设置拖动、调整大小等的每个元素的变换 问题是,如果我尝试从javascript中对SVG中的元素应用旋转,则旋转的应用将覆盖转换。这导致的不仅仅是旋转,因为矩阵被替换为旋转 我假设我需要检索矩阵,用我希望的旋转更新矩阵,然后重新应用矩阵 有人能解释一下,当你试图增加旋转度的分数时,你是怎么做到的吗 我在J

我有一系列在inkscape(或类似的矢量图形应用程序)中创建的SVG文件

当SVG中的元素在屏幕上移动时,编辑工具会将其应用于SVG中的元素(显然,它们这样做是为了提高效率)。这些工具根据矩阵设置拖动、调整大小等的每个元素的变换

问题是,如果我尝试从javascript中对SVG中的元素应用旋转,则旋转的应用将覆盖转换。这导致的不仅仅是旋转,因为矩阵被替换为旋转

我假设我需要检索矩阵,用我希望的旋转更新矩阵,然后重新应用矩阵

有人能解释一下,当你试图增加旋转度的分数时,你是怎么做到的吗

我在JSFIDLE中创建了一个示例。虽然不清楚发生了什么,但我已经在本地测试了代码。当通过firebug检查时,我可以看到transform属性被替换为rotate(r)

顺便说一句,我一直在通过w3网站阅读,我只发现。虽然它深入讨论了矩阵,但没有提供任何示例。我发现很难阅读,因为我上一次学习矩阵是在80年代。但在我看来,我可能需要做一些矩阵乘法,并可能使用cos和sin。有点希望我不会,因为我不确定在制作动画时使用这种方法对性能的影响


顺便说一句,我已经看过从SVG中去除转换的工具。然而,由于我希望使用的SVG文件是另一个项目的一部分,我宁愿避免这样做。此外,它还会在将来产生问题,因为我希望让人们创建自己的SVG,以便与我正在编写的软件一起使用。

使用SVG DOM附加翻译,而不是覆盖翻译

$('#control1').mousedown(function() {

    if (timer !== null) {
        clearInterval(timer);
        timer = null;
    }

    // change to stop if the current anim is running, and get the current angle
    timer = setInterval(function() {
        angle += 1;

        if (angle >= 360) {
            angle -= 360;
        }

        if (anim.transform.baseVal.numberOfItems < 2) {
          var transform = document.getElementById("arm1").createSVGTransform();
          transform.setRotate(angle, 100, 100);
          anim.transform.baseVal.appendItem(transform);
        } else {
          anim.transform.baseVal.getItem(1).setRotate(angle, 100, 100);
        }
    }, 1);

});
$('#control1').mousedown(函数(){
如果(计时器!==null){
清除间隔(计时器);
定时器=空;
}
//如果当前动画正在运行,则更改为“停止”,并获取当前角度
计时器=设置间隔(函数(){
角度+=1;
如果(角度>=360){
角度-=360;
}
if(anim.transform.baseVal.numberOfItems<2){
var transform=document.getElementById(“arm1”).createSVGTransform();
transform.setRotate(角度,100100);
anim.transform.baseVal.appendItem(transform);
}否则{
anim.transform.baseVal.getItem(1).setRotate(角度,100100);
}
}, 1);
});

嘿,罗伯特,差不多了。我已经将您提到的更改应用于JSFIDLE,形状没有旋转,而是随着旋转而扭曲。我怀疑这与不同的层以及附加变换的位置有关。你知道如何改变我的例子,让它做一个纯旋转吗?它做一个纯旋转。形状本身被transform=“矩阵(1.5,0.0,0.0,1.0100.0100.0)扭曲它在x和y中的缩放比例不同:1.5!=1。您必须修改/删除父变换才能修复该问题。您可以获取该矩阵并使用SVG DOM插入其逆矩阵或其他内容。也许您应该尝试将其作为练习,因为我现在已经向您展示了矩阵的SVG DOM的基础知识。