Matrix 围绕点x,y的SVG矩阵变换
我试着在svg中使矩阵旋转,缩放和倾斜,但要根据点(x,y) 我尝试过,但当对象矩阵Matrix 围绕点x,y的SVG矩阵变换,matrix,svg,transform,Matrix,Svg,Transform,我试着在svg中使矩阵旋转,缩放和倾斜,但要根据点(x,y) 我尝试过,但当对象矩阵[1,0,0,1,0,0]=尚未编辑时,它对我有效。在我应用第一个旋转后第二个旋转是不可预测的,会到处旋转 当矩阵已经变换并且都依赖于原点时,x,y,有人能帮我做一些简单的旋转(角度),scaleX(数字),skewX(数字)和skewY(数字)操作吗 请记住,矩阵已经转换,下一次修改将来自修改后的下一个新矩阵 矩阵(a:0.981608033802368,b:-0.19096156954765532,c:0.1
[1,0,0,1,0,0]
=尚未编辑时,它对我有效。在我应用第一个旋转后
第二个旋转是不可预测的,会到处旋转
当矩阵已经变换并且都依赖于原点时,x,y
,有人能帮我做一些简单的旋转(角度)
,scaleX(数字)
,skewX(数字)
和skewY(数字)
操作吗
请记住,矩阵已经转换,下一次修改将来自修改后的下一个新矩阵
矩阵(a:0.981608033802368,b:-0.19096156954765532,c:0.19096156954765532,d:0.981608033802368,e:120.3328399658231,f:-21.905738830566406)
- 那么,如何通过围绕某个点旋转来变换矩阵呢
- 如何在特定的
中使用点(x,y)
和(x,y)
以及原始变换缩放x,scaleYskewX,skewY
感谢您的帮助。对元素进行缩放、旋转和倾斜最方便的方法是获取其边界框的中心。使用该点首先平移图元,使其中心点位于原点,然后应用缩放、倾斜或旋转,然后将图元平移回其原始位置 要通过矩阵实现这一点,请使用:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body style='font-family:arial'>
<center>
(This example tested in: IE11/CH31/FF23)
<div style='width:90%;background-color:gainsboro;text-align:justify;padding:10px;border-radius:8px;'>
Sequentially Transform an element about a fixed 'center point' in the element.
For this example, use the initial center of its bounding box.
</div>
<div id="svgDiv" style='background-color:lightblue;width:400px;height:400px;'>
<svg id="mySVG" width="400" height="400">
<polygon id="myPolygon" fill="red" points="140,60 100,300 300,200 340,140" />
<circle id="centerPoint" r="4" fill="lime" stroke="black" stroke-width="1" />
</svg>
</div>
<button onClick=rotate()>rotate</button>
<button onClick=scaleXY()>scaleXY</button>
<button onClick=skewX()>skewX</button>
<button onClick=skewY()>skewY</button>
<button onClick=startOver()>start over</button>
<br />SVG Source:<br />
<textarea id=svgSourceValue style='font-size:110%;font-family:lucida console;width:90%;height:400px'></textarea>
</center>
</body>
<script>
document.addEventListener("onload",init(),false)
function init()
{
initTransform()
svgSourceValue.value=svgDiv.innerHTML
}
var Cx,Cy
var TransformRequestObj
var TransformList
//---onload---
function initTransform()
{
var bb=myPolygon.getBBox()
var bbx=bb.x
var bby=bb.y
var bbw=bb.width
var bbh=bb.height
Cx=bbx+.5*bbw
Cy=bby+.5*bbh
centerPoint.setAttribute("cx",Cx)
centerPoint.setAttribute("cy",Cy)
TransformRequestObj=mySVG.createSVGTransform()
var animTransformList=myPolygon.transform
TransformList=animTransformList.baseVal
}
//--button--
function rotate()
{
var angle=10
TransformRequestObj.setRotate(10,Cx,Cy)
TransformList.appendItem(TransformRequestObj)
TransformList.consolidate()
svgSourceValue.value=svgDiv.innerHTML
}
//---button---
function scaleXY()
{
var scaleX=1.05
var scaleY=1.05
TransformRequestObj.setTranslate(Cx,Cy)
TransformList.appendItem(TransformRequestObj)
TransformList.consolidate()
TransformRequestObj.setScale(scaleX,scaleY)
TransformList.appendItem(TransformRequestObj)
TransformList.consolidate()
TransformRequestObj.setTranslate(-Cx,-Cy)
TransformList.appendItem(TransformRequestObj)
TransformList.consolidate()
svgSourceValue.value=svgDiv.innerHTML
}
//---button---
function skewX()
{
var skwX=5 //---deg
TransformRequestObj.setTranslate(Cx,Cy)
TransformList.appendItem(TransformRequestObj)
TransformList.consolidate()
TransformRequestObj.setSkewX(skwX)
TransformList.appendItem(TransformRequestObj)
TransformList.consolidate()
TransformRequestObj.setTranslate(-Cx,-Cy)
TransformList.appendItem(TransformRequestObj)
TransformList.consolidate()
svgSourceValue.value=svgDiv.innerHTML
}
//---button---
function skewY()
{
var skwY=10 //---deg
TransformRequestObj.setTranslate(Cx,Cy)
TransformList.appendItem(TransformRequestObj)
TransformList.consolidate()
TransformRequestObj.setSkewY(skwY)
TransformList.appendItem(TransformRequestObj)
TransformList.consolidate()
TransformRequestObj.setTranslate(-Cx,-Cy)
TransformList.appendItem(TransformRequestObj)
TransformList.consolidate()
svgSourceValue.value=svgDiv.innerHTML
}
//---button---
function startOver()
{
myPolygon.removeAttribute("transform")
TransformRequestObj=mySVG.createSVGTransform()
var animTransformList=myPolygon.transform
TransformList=animTransformList.baseVal
}
</script>
</html>
(该示例在IE11/CH31/FF23中测试)
围绕元素中的固定“中心点”顺序变换元素。
对于本例,请使用其边界框的初始中心。
旋转
鳞状
斯克克斯
歪斜的
重新开始
SVG源代码:
document.addEventListener(“onload”,init(),false)
函数init()
{
initTransform()
svgSourceValue.value=svgDiv.innerHTML
}
变量Cx,Cy
var TransformRequestObj
变量转换列表
//---装载---
函数initTransform()
{
var bb=myPolygon.getBBox()
变量bbx=bb.x
变量bby=bb.y
var bbw=bb.width
var bbh=bb.高度
Cx=bbx+0.5*bbw
Cy=bby+0.5*bbh
centerPoint.setAttribute(“cx”,cx)
centerPoint.setAttribute(“cy”,cy)
TransformRequestObj=mySVG.createSVGTransform()
var animTransformList=myPolygon.transform
TransformList=animTransformList.baseVal
}
//--钮扣--
函数rotate()
{
可变角度=10
TransformRequestObj.setRotate(10,Cx,Cy)
TransformList.appendItem(TransformRequestObj)
TransformList.consolidate()文件
svgSourceValue.value=svgDiv.innerHTML
}
//---钮扣---
函数scaleXY()
{
var scaleX=1.05
var scaleY=1.05
TransformRequestObj.setTranslate(Cx,Cy)
TransformList.appendItem(TransformRequestObj)
TransformList.consolidate()文件
TransformRequestObj.setScale(scaleX、scaleY)
TransformList.appendItem(TransformRequestObj)
TransformList.consolidate()文件
TransformRequestObj.setTranslate(-Cx,-Cy)
TransformList.appendItem(TransformRequestObj)
TransformList.consolidate()文件
svgSourceValue.value=svgDiv.innerHTML
}
//---钮扣---
函数skewX()
{
var skwX=5/--deg
TransformRequestObj.setTranslate(Cx,Cy)
TransformList.appendItem(TransformRequestObj)
TransformList.consolidate()文件
TransformRequestObj.setSkewX(skwX)
TransformList.appendItem(TransformRequestObj)
TransformList.consolidate()文件
TransformRequestObj.setTranslate(-Cx,-Cy)
TransformList.appendItem(TransformRequestObj)
TransformList.consolidate()文件
svgSourceValue.value=svgDiv.innerHTML
}
//---钮扣---
函数skewY()
{
var skwY=10/--deg
TransformRequestObj.setTranslate(Cx,Cy)
TransformList.appendItem(TransformRequestObj)
TransformList.consolidate()文件
TransformRequestObj.setSkewY(skwY)
TransformList.appendItem(TransformRequestObj)
TransformList.consolidate()文件
TransformRequestObj.setTranslate(-Cx,-Cy)
TransformList.appendItem(TransformRequestObj)
TransformList.consolidate()文件
svgSourceValue.value=svgDiv.innerHTML
}
//---钮扣---
函数startOver()
{
myPolygon.removeAttribute(“变换”)
TransformRequestObj=mySVG.createSVGTransform()
var animTransformList=myPolygon.transform
TransformList=animTransformList.baseVal
}
变换是加法的,非矩阵变换只是一个长字符串。要了解其工作原理,请不要使用consolidate(),您将看到一系列请求转换的列表Genius,绝对是Genius,我花了一个多星期的时间,并没有接近您在10小时内实现的目标!!!!!我对SVG和矩阵修改非常陌生——但它太强大了——我喜欢它。非常感谢,只需要稍微调整一下,以适应我需要的套件,但看起来一切正常!:))是否有机会存储TransformList,然后在此保存的TransformList基础上进行修改请勿更改仅更改上一个位置?就像旋转是20'一样,我想加上35和44,所以第一次显示55,但第二次旋转不是55+44,而是回到20,加上这次44=64。希望是明确的!?问候并感谢您您应该能够操纵列表中的值。list对象有以下方法(在我使用TransformList时,请参见new answer()。我相信consolidate()不再是list,但在我使用matrix save separate时,我可以强制matrix使用animTransformList TransformRequestObj=mySVG.createSVGTransform()吗
MyList.numberOfItems-Gets or sets the number of items in a list.
MyList.appendItem(newItem)-Inserts a new item at the end of the list.
MyList.clear()-Clears all existing items from the list, which creates an empty list.
MyList.getItem(index)-Returns the specified item from a list.
MyList.initialize(myItem)-Clears current items from the list and re-initializes the list to contain the specified item.
MyList.insertItemBefore(newItem,index)-Inserts a new item into a list at a specified position.
MyList.removeItem(myItem)-Removes an existing item from the list.
MyList.replaceItem(newItem,index)-Replaces a specified existing item in the list with a specified new item.