【发布时间】:2017-04-23 12:08:34
【问题描述】:
我正在尝试缩放然后旋转一个三角形,然后将其转换到 Snap SVG 中的给定点。
我想围绕它的顶部而不是中心旋转三角形,这样我就可以做一个馅饼之类的东西。
所以我想我先缩放,然后旋转,然后再平移。
var t = new Snap.Matrix();
t.scale(0.5);
t.rotate(45, bbox.cx, (bbox.cy-(bbox.h/2)));
但不知何故,缩放和旋转总是有点偏离。
我重用了一个我找到并更新的 jsfiddle,所以你可以看看我尝试了什么:
http://jsfiddle.net/AGq9X/477/
不知何故,bbox.cx 和 bbox.cy 不在三角形的中心。
在我的本地设置中它们是。
奇怪的是,没有缩放的旋转就可以正常工作,
但是缩放然后旋转似乎总是在 y 轴上有点偏离,三角形不会停留在旋转点。
有什么想法可以解决吗?
编辑:
好的,我找到了解决方案,感谢 lan,您是对的,缩放中心很重要,并且
我以为它在使用对象的中心,但它是左上角。我调整了它
现在效果更好了:
var bbox = obj.getBBox(); //get coords etc. of triangle object
var t = new Snap.Matrix();
var offset = (bbox.cy+(bbox.h)) - centerY; //translate Y to center,
//depends on scaleing factor (0.5 = bbox.h, 0.25 = bbox.h*2)
t.scale(0.5, 0.5, bbox.cx, (bbox.cy+(bbox.h/2))); //scale object
t.translate(0,-offset); //translate to center
t.rotate(45, bbox.cx, (bbox.cy+(bbox.h/2))); //rotate object
obj.transform(t); //apply transformation to object
EDIT2:
我想知道如何保存转换,因此您无需在每次使用新转换时都应用它们。 Ian 建议像这样使用element.transform() 来获得旧的转换:
element.transform( element.transform() + 's2,2' )
【问题讨论】:
-
我不清楚你想要什么效果。我怀疑你的缩放中心有问题,也许你正在取三角形的中心然后缩放它。你不想要一个三角形的中心在它被缩放之后(如果它没有从它的中心缩放,就像在这种情况下)。您可能还想在旋转后进行缩放。
-
我想缩放三角形,然后想象你在其中放了一个大头针
-
*对不起,在上面的评论中输入了。想象一下,您将一根针穿过三角形的一个角,然后对其进行缩放然后旋转它,因此一个“固定”角应该保持在原位。但它不知何故不会保持“固定”并改变位置。我发现缩放先于旋转:Snap Matrix 我只是不知道我需要改变什么,所以我可以保持旋转/缩放角“固定”。
-
你不想在前面的转换之后用空格开始字符串以将它们与 s2,2 分开吗?
标签: javascript rotation scale snap.svg triangular