Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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_Javascript_Svg_Scaling - Fatal编程技术网

使用普通javascript围绕中心缩放SVG

使用普通javascript围绕中心缩放SVG,javascript,svg,scaling,Javascript,Svg,Scaling,我有一个问题,可能是理解SVG中坐标是如何工作的。我有一个javascript函数,可以缩放svg图形,例如: var g = document.getElementById("graph"); var nm = g.getCTM().multiply(k); //k is the scale factor g.setAttribute("transform", "matrix(" + nm.a + "," + nm.b + "," + nm.c + "," + nm.d + "," + nm.

我有一个问题,可能是理解SVG中坐标是如何工作的。我有一个javascript函数,可以缩放svg图形,例如:

var g = document.getElementById("graph");
var nm = g.getCTM().multiply(k); //k is the scale factor
g.setAttribute("transform", "matrix(" + nm.a + "," + nm.b + "," + nm.c + "," + nm.d + "," + nm.e + "," + nm.f + ")");
关键是缩放后,中心会略微平移,因此图形会丢失“地理”中心。我如何确定需要哪种翻译来“围绕”图形中心缩放图形


谢谢。

您考虑过其他方法吗

如果您只是在svg上进行放大/缩小,则可能更容易进行不同的操作,例如:

不久前我也遇到了同样的问题,最终使用以下方法创建了自己的缩放:


基本上,svg包装器使用css转换比例,svg可以很好地进行调整。您甚至可以设置缩放动画。

我认为这更符合我的目的,并且在阅读了帮助链接中的操作方法之后

http://commons.oreilly.com/wiki/index.php/SVG_Essentials/Transforming_the_Coordinate_System#The_scale_Transformation

我将其更改为当鼠标滚轮滚动时,围绕鼠标位置缩放图形

如果有帮助,代码如下(使用SVGPan的setCTM方法):


谢谢你!以前没有听说过jquery.transit。我已经在使用SVGPan,因为它在不同的方面都很好,并且发现了许多其他复杂的实用程序,这些都是必须放弃的。我将SVGPan中的默认代码从translate(p.x,p.y).scale(z).translate(-p.x,-p.y)更改为scale(z),因为它工作得更好,至少在我的例子中是这样,但即使这样也不是100%完美的。无论如何,我在回答我的问题,因为我找到了一种更能说服我的方法。干杯
var svgRoot = document.getElementsByTagName("svg")[0];
var g = svgRoot.getElementById("viewport");

var newp = svgRoot.createSVGPoint();
newp.x = evt.clientX;
newp.y = evt.clientY;
newp = newp.matrixTransform(g.getScreenCTM().inverse());

var oldx = newp.x;
var oldy = newp.y;

//z = scale factor
setCTM(g, g.getCTM().translate(-(oldx*(z-1)),-(oldy*(z-1))).scale(z));