d3.js 在版本 4 中重写缩放示例
d3.js rewriting zoom example in version4
我正在尝试重写上面这个示例的一部分以在我的代码中使用,特别是这一段:
function centerNode(source) {
scale = zoomListener.scale();
x = -source.y0;
y = -source.x0;
x = x * scale + viewerWidth / 2;
y = y * scale + viewerHeight / 2;
d3.select('g').transition()
.duration(duration)
.attr("transform", "translate(" + x + "," + y + ")scale(" + scale + ")");
zoomListener.scale(scale);
zoomListener.translate([x, y]);
}
但是我卡住了,因为 v4 包发生了很大变化。我把我的 zoomListener 函数写成
var zoomListener = d3.zoom()
.scaleExtent([0.3,2])
.on("zoom", zoomed);
function zoomed() {
transform = d3.event.transform;
console.log(d3.event);
svg.attr("transform", transform);
}
function centerNode(source){
t = transform;
console.log(t);
x = t.x*t.k; //I only want things to be centered vertically
y = (t.y + -source.x0)*t.k + (viewerHeight)/2 ;
svg.transition()
.duration(duration)
.attr("transform","translate(" + x + "," + y +")scale(" + t.k + ")");
transform.scale(t.k); //DOES NOT WORK
transform.translate([x, y]); //DOES NOT WORK
}
而且我知道根据文档,事情已经发生变化,信息不再存储在我的 zoomListener 上
D3 V4 release note on zoom 我想我只是对如何使用新版本做到这一点感到困惑。我的 centerNode 函数的最后几行不起作用,因为当我将节点居中时缩放和平移重置...
有什么建议吗?
调用 transform.scale
和 transform.translate
returns 一个新的转换,并没有修改任何内容。因此:
transform = transform.translate([x, y]).scale(k)
svg.call(zoomListener.transform, newTransform)
(此时 zoomListener
是一个非常不准确的名称,但无论如何...)
k
、x
和 y
可以从 source
派生出来,也许正如你展示的那样,但我不确定,因为我不知道知道 source
是什么。但对我来说,t.x*t.k
看起来很可疑,因为它将现有变换 x 乘以其比例。似乎这会导致反馈循环。
有关 v4 中缩放的更多信息,请查看 , or this example by mbostock 演示对元素缩放变换的编程控制(在本例中为 canvas)并包括过渡。
因此,经过大量挖掘和反复试验后,我得出了一个非常适合我的目的的答案。请注意,下面的这段代码只是我代码的相关部分而不是整个代码,某些变量是不言自明的,因此没有包括它们。 这也是 d3.js 的第 4 版。
var zoom = d3.zoom()
.scaleExtent([0.3,2])
.on("zoom", zoomed);
var svg = d3.select("body")
.append("svg")
.attr("width", viewerWidth)
.attr("height", viewerHeight);
var zoomer = svg.append("rect")
.attr("width", viewerWidth)
.attr("height", viewerHeight)
.style("fill", "none")
.style("pointer-events", "all")
.call(zoom);
var g = svg.append("g");
zoomer.call(zoom.transform, d3.zoomIdentity.translate(150,0)); //This is to pad my svg by a 150px on the left hand side
function zoomed() {
g.attr("transform", d3.event.transform);//The zoom and panning is affecting my G element which is a child of SVG
}
function centerNode(source){
t = d3.zoomTransform(zoomer.node());
console.log(t);
x = t.x;
y = source.x0;
y = -y *t.k + viewerHeight / 2;
g.transition()
.duration(duration)
.attr("transform", "translate(" + x + "," + y + ")scale(" + t.k + ")")
.on("end", function(){ zoomer.call(zoom.transform, d3.zoomIdentity.translate(x,y).scale(t.k))});
}
根据 d3.js 页面上 v4 的示例,我使用矩形将缩放应用于
The zoom behavior is applied to an invisible rect overlaying the SVG
element; this ensures that it receives input, and that the pointer
coordinates are not affected by the zoom behavior’s transform. Pan & Zoom Example
在中心节点函数中,我使用 d3.zoomTransform(zoomer.node());
获取应用于页面的当前转换。
此函数的目的只是将可折叠树垂直居中而不是水平居中,因此我保持当前 transform.x(此处 t.x
)不变。
我的 svg 中的坐标是翻转的,因此为什么 y= source.x0
,源是在我的可折叠树中单击的节点。 (“查看此线程顶部引用的示例以了解我正在尝试转换为版本 4 的内容)
我将转换应用于我的 G 元素,然后我想将这些更改提交给缩放转换,为此我使用 .on("end", function(){})
否则它在转换时会出现奇怪的行为,通过执行它所做的只是设置转换的当前状态。
zoomer.call(zoom.transform, d3.zoomIdentity.translate(x,y).scale(t.k))
上面的这一行应用了 x 和 y 的平移和一个比例——这等于当前状态——到恒等矩阵必须得到 G 的新变换,然后我将它应用到 zoomer
这是我之前调用 zoom
的元素。
这对我来说就像一个魅力!
我正在尝试重写上面这个示例的一部分以在我的代码中使用,特别是这一段:
function centerNode(source) {
scale = zoomListener.scale();
x = -source.y0;
y = -source.x0;
x = x * scale + viewerWidth / 2;
y = y * scale + viewerHeight / 2;
d3.select('g').transition()
.duration(duration)
.attr("transform", "translate(" + x + "," + y + ")scale(" + scale + ")");
zoomListener.scale(scale);
zoomListener.translate([x, y]);
}
但是我卡住了,因为 v4 包发生了很大变化。我把我的 zoomListener 函数写成
var zoomListener = d3.zoom()
.scaleExtent([0.3,2])
.on("zoom", zoomed);
function zoomed() {
transform = d3.event.transform;
console.log(d3.event);
svg.attr("transform", transform);
}
function centerNode(source){
t = transform;
console.log(t);
x = t.x*t.k; //I only want things to be centered vertically
y = (t.y + -source.x0)*t.k + (viewerHeight)/2 ;
svg.transition()
.duration(duration)
.attr("transform","translate(" + x + "," + y +")scale(" + t.k + ")");
transform.scale(t.k); //DOES NOT WORK
transform.translate([x, y]); //DOES NOT WORK
}
而且我知道根据文档,事情已经发生变化,信息不再存储在我的 zoomListener 上 D3 V4 release note on zoom 我想我只是对如何使用新版本做到这一点感到困惑。我的 centerNode 函数的最后几行不起作用,因为当我将节点居中时缩放和平移重置...
有什么建议吗?
调用 transform.scale
和 transform.translate
returns 一个新的转换,并没有修改任何内容。因此:
transform = transform.translate([x, y]).scale(k)
svg.call(zoomListener.transform, newTransform)
(此时 zoomListener
是一个非常不准确的名称,但无论如何...)
k
、x
和 y
可以从 source
派生出来,也许正如你展示的那样,但我不确定,因为我不知道知道 source
是什么。但对我来说,t.x*t.k
看起来很可疑,因为它将现有变换 x 乘以其比例。似乎这会导致反馈循环。
有关 v4 中缩放的更多信息,请查看
因此,经过大量挖掘和反复试验后,我得出了一个非常适合我的目的的答案。请注意,下面的这段代码只是我代码的相关部分而不是整个代码,某些变量是不言自明的,因此没有包括它们。 这也是 d3.js 的第 4 版。
var zoom = d3.zoom()
.scaleExtent([0.3,2])
.on("zoom", zoomed);
var svg = d3.select("body")
.append("svg")
.attr("width", viewerWidth)
.attr("height", viewerHeight);
var zoomer = svg.append("rect")
.attr("width", viewerWidth)
.attr("height", viewerHeight)
.style("fill", "none")
.style("pointer-events", "all")
.call(zoom);
var g = svg.append("g");
zoomer.call(zoom.transform, d3.zoomIdentity.translate(150,0)); //This is to pad my svg by a 150px on the left hand side
function zoomed() {
g.attr("transform", d3.event.transform);//The zoom and panning is affecting my G element which is a child of SVG
}
function centerNode(source){
t = d3.zoomTransform(zoomer.node());
console.log(t);
x = t.x;
y = source.x0;
y = -y *t.k + viewerHeight / 2;
g.transition()
.duration(duration)
.attr("transform", "translate(" + x + "," + y + ")scale(" + t.k + ")")
.on("end", function(){ zoomer.call(zoom.transform, d3.zoomIdentity.translate(x,y).scale(t.k))});
}
根据 d3.js 页面上 v4 的示例,我使用矩形将缩放应用于
The zoom behavior is applied to an invisible rect overlaying the SVG element; this ensures that it receives input, and that the pointer coordinates are not affected by the zoom behavior’s transform. Pan & Zoom Example
在中心节点函数中,我使用 d3.zoomTransform(zoomer.node());
获取应用于页面的当前转换。
此函数的目的只是将可折叠树垂直居中而不是水平居中,因此我保持当前 transform.x(此处 t.x
)不变。
我的 svg 中的坐标是翻转的,因此为什么 y= source.x0
,源是在我的可折叠树中单击的节点。 (“查看此线程顶部引用的示例以了解我正在尝试转换为版本 4 的内容)
我将转换应用于我的 G 元素,然后我想将这些更改提交给缩放转换,为此我使用 .on("end", function(){})
否则它在转换时会出现奇怪的行为,通过执行它所做的只是设置转换的当前状态。
zoomer.call(zoom.transform, d3.zoomIdentity.translate(x,y).scale(t.k))
上面的这一行应用了 x 和 y 的平移和一个比例——这等于当前状态——到恒等矩阵必须得到 G 的新变换,然后我将它应用到 zoomer
这是我之前调用 zoom
的元素。
这对我来说就像一个魅力!