Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.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
Javascript 将转换从SVG元素复制到SVG组_Javascript_Svg_Transform_Svg.js_Svg Transforms - Fatal编程技术网

Javascript 将转换从SVG元素复制到SVG组

Javascript 将转换从SVG元素复制到SVG组,javascript,svg,transform,svg.js,svg-transforms,Javascript,Svg,Transform,Svg.js,Svg Transforms,我有一个SVG元素,需要在周围绘制转换点。 我正在使用svg.js和它的一部分 它适用于移动和旋转未变换的元素,但不适用于具有变换矩阵的元素 简言之,我需要从一个元素获得转换,并将其应用于一个组。 我设法做到这一点,但直到我改变元素的x,y,宽度或高度 下面的片段说明了我的意思。 标有“步骤1..3”的按钮显示步骤,“切换变换功能”按钮更改变换功能 //转换函数 const makeTransformTR=(bbox,el,嵌套)=>{ 常量eltransferrom=el.transform

我有一个SVG元素,需要在周围绘制转换点。 我正在使用svg.js和它的一部分

它适用于移动和旋转未变换的元素,但不适用于具有变换矩阵的元素

简言之,我需要从一个元素获得转换,并将其应用于一个组。 我设法做到这一点,但直到我改变元素的x,y,宽度或高度

下面的片段说明了我的意思。 标有“步骤1..3”的按钮显示步骤,“切换变换功能”按钮更改变换功能

//转换函数
const makeTransformTR=(bbox,el,嵌套)=>{
常量eltransferrom=el.transform();
设cx=bbox.width/2;
设cy=bbox.height/2;
设tx=bbox.x;
设ty=bbox.y;
让transfromAttr=`translate(${tx},${ty})`;
让旋转=eltransferrom.rotate;
如果(旋转){
transfromAttr+=`,rotate(${rotate},${cx},${cy})`;
}
nested.attr('transform',transformattr);
};
const makeTransformRT=(bbox、el、嵌套)=>{
常量eltransferrom=el.transform();
设cx=bbox.cx;
设cy=bbox.cy;
设tx=bbox.x;
设ty=bbox.y;
设transformattr=`;
让旋转=eltransferrom.rotate;
如果(旋转){
transfromAttr+=`rotate(${rotate},${cx},${cy})`;
}
transfromAttr+=(transfromAttr?',':'')+`translate(${tx},${ty})`;
nested.attr('transform',transformattr);
};
常量makeTransformByMatrix=(bbox、el、嵌套)=>{
常量矩阵=新SVG.矩阵(el);
常数零矩阵={
答:1,,
b:0,
c:0,
d:1,
e:0,
f:0,
原文:0,
原创:0,
旋转:0,
scaleX:1,
斯卡利:1,
剪切:0,
translateX:0,
翻译:0
};
常量eltransferrom=el.transform();
设a=eltransferrom.rotate*Math.PI/180 | | 0;
设cosA=Math.cos(a);
让sinA=Math.sin(a);
设cx=1*bbox.cx;
设cy=1*bbox.cy;
设tx=-1*cx*cosA+cy*sinA+cx;
设ty=-1*cx*sinA-cy*cosA+cy;
设newMatrix=newsvg.Matrix({
答:cosA,,
b:新浪,
c:-1*新浪,
d:cosA,
e:tx,
f:ty
});
嵌套矩阵(newMatrix);
nested.translate(bbox.x,bbox.y);
};
常量转换函数={
“makeTransformRT”:makeTransformRT,
“makeTransformTR”:makeTransformTR,
“makeTransformByMatrix”:makeTransformByMatrix
}
常量getRect=()=>{
返回SVG(document.getElementById('rect1');
};
常量getGroup=()=>{
返回SVG(document.getElementById('g1'));
};
常数重置=()=>{
const rect=getRect();
const g=getGroup();
rect.attr('transform','');
矩形宽度(“108”);
g、 属性('转换','')
};
const funcs=对象键(transformFuncs);
设fIndex=0;
//旋转矩形并从组中获取变换
常量步骤1=()=>{
const rect=getRect();
矩形属性(“变换”,“矩阵(0.590606676199253,0.806960312143802,-0.806960312143802,0.59060676199253140.68774443238965,-45.31069334044855)”
}
常量步骤2=()=>{
transformFunction(getRect().bbox(),getRect(),getGroup());
}
//这可能会引起我的问题
常量步骤3=()=>{
const rect=getRect();
矩形宽度(2);//更改宽度
transformFunction(rect.bbox(),rect,getGroup());
}
常量日志=(文本)=>{
设t=document.getElementById('log').value;
t+='\n'+文本;
document.getElementById('log')。value=t;
}
常量setTransformFunc=()=>{
transformFunction=transformFuncs[funcs[fIndex]];
日志('new func:'+funcs[fIndex]);
}
常量switchToAlernative=()=>{
重置();
if(fIndex>=函数长度){
fIndex=0;
}
setTransformFunc();
fIndex++;
}
switchToAlernative()

标题
步骤1
步骤二
步骤三


复位开关变换函数
Hmm…在这种情况下,任务归结为——它需要从矩阵中获取旋转中心点。 据我所知,在一般情况下是不可能的。
所以问题应该解决了,我通过将svg元素的矩阵计算更改为平移和旋转的顺序来解决问题

很难判断您的实际问题。如果您只是想复制并应用转换,我认为应该这样做。不,它不起作用,请看,组元素没有x、y、宽度和高度。你玩过JSFIDLE吗?我不认为没有这些属性的group元素与对其应用转换有什么关系。为什么它不起作用?你已经试过了吗?我不知道“为什么”,也许是因为W3C就是这样发明的?)