gpt4 book ai didi

javascript - 缩放后如何应用 d3.js svg 裁剪

转载 作者:行者123 更新时间:2023-11-29 10:43:00 25 4
gpt4 key购买 nike

我正在尝试将 svg-clippath 与 d3.js 和缩放行为一起使用。下面的代码创建一个矩形,然后将被矩形裁剪区域裁剪。

<svg class="chart"></svg>
<script>

var width = 800;
var height = 600;

var svg = d3.select(".chart")
.attr("width", width)
.attr("height", height)
.append("g");

var clip = svg.append("defs")
.append("clipPath")
.attr("id","clip")
.append("rect")
.attr("width",200)
.attr("height",200)
.attr("x",100)
.attr("y",100);


var zoom = d3.behavior.zoom().
on("zoom",zoomed);

function zoomed(){
container.attr("transform", "translate(" + d3.event.translate
+")scale(" + d3.event.scale + ")");
container.attr("clip-path","url(#clip)");
}

svg.call(zoom);

var container = svg.append("g")
.attr("clip-path","url(#clip)");

var rect = container.append("rect")
//.attr("clip-path","url(#clip)")
.attr("class","bar")
.attr("x",150)
.attr("y",150)
.attr("width",350)
.attr("height",350);

</script>

我想要的是在缩放/移动后再次应用剪辑(这样我就不能将矩形移出剪辑区域,现在我可以毫无问题地做到这一点。)我该怎么做?

我假设当前行为是由在转换之前应用裁剪这一事实引起的。

最佳答案

我遇到了同样的问题,并花了最后几个小时试图找出解决方案。显然,剪辑路径在转换之前 对象上运行。所以我尝试在执行缩放转换时反向转换剪辑对象,这成功了!

本着以下精神:

var clip_orig_x = 100, clip_orig_y = 100;
function zoomed() {
var t = d3.event.translate;
var s = d3.event.scale;

// standard zoom transformation:
container.attr("transform", "translate(" + t +")scale(" + s + ")");

// the trick: reverse transform the clip object!
clip.attr("transform", "scale(" + 1/s + ")")
.attr("x", clip_orig_x - t[0])
.attr("y", clip_orig_y - t[1]);
}

其中 clip 是 clipPath 中的矩形。由于缩放和平移之间的相互作用,您需要明确设置“x”和“y”而不是使用变换。

我相信经验丰富的 d3 程序员会想出更好的解决方案,但这是可行的!

关于javascript - 缩放后如何应用 d3.js svg 裁剪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25142240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com