animateSearchView = (duration) => {
const svg = getSvg();
const clustersG = svg.append("g").attr("id", "clusters-g");
const clusters = clustersG
.selectAll("g")
.data(forceSearchClusters)
.join("g")
.attr("id", (d) => d.clusterId)
.attr("transform", (d) => `translate(${d.overviewPos})`)
.attr("opacity", 1);
const areas = clusters
.append("circle")
.attr("r", (d) => d.r)
.attr("fill", (d) =>
d.containTarget ? "red" : d.inNprobe ? "blue" : "#666"
)
.attr("opacity", (d) => (d.containTarget ? 0.2 : 0.1));
const nodes = clusters
.append("circle")
.attr("r", (d) => (d.inNprobe ? 3 : 0))
.attr("fill", "#333")
.attr("opacity", 0.3);
const voronoiG = svg.append("g").attr("id", "voronoi-g");
const voronois = voronoiG
.selectAll("path")
.data(forceSearchClusters)
.join("path")
.attr("d", (d) => `M${d.searchViewVoronoiPoints.join("L")}Z`)
.attr("fill", (d, i) =>
d.containTarget ? "red" : d.inNprobe ? "blue" : "#666"
)
.attr("stroke", "#fff")
.attr("stroke-width", 1)
.attr("opacity", 0);
new Promise(async () => {
await new Promise((resolve) => {
clusters
.filter((d) => d.containTarget)
.transition()
.duration(2000)
.attr("transform", (d) => `translate(${d.searchViewPos[0]})`)
.on("end", () => resolve());
});
await new Promise((resolve) => {
clusters
.filter((d) => d.inNprobe && !d.containTarget)
.transition()
.delay(1000)
.duration(2000)
.attr("transform", (d) => `translate(${d.searchViewPos[0]})`)
.on("end", () => resolve());
});
await sleep(1000);
await new Promise((resolve) => {
let t = 0;
let len = forceSearchClusters[0].searchViewPos.length;
const timer = setInterval(() => {
clusters
.transition()
.duration(duration)
.ease(d3.easeLinear)
.attr("transform", (d) => `translate(${d.searchViewPos[t]})`);
t += 1;
if (t >= len) {
clearInterval(timer);
resolve();
}
}, duration);
});
await sleep(1000);
await new Promise((resolve) => {
voronois
.transition()
.duration(2000)
.attr("opacity", 1)
.on("end", () => resolve());
});
await sleep(1000);
await new Promise((resolve) => {
clusters
.transition()
.duration(2000)
.ease(d3.easeLinear)
.attr("opacity", 0)
.on("end", () => resolve());
});
});
return svg.node();
}