我在试着理解我得到的密码。我想我已经看过细节了。但是,还有一些事情我真的不明白。
我无法理解的是
1) svg.node()
2)等分/平分线部分
3)对于(设i= 0;i< n;++i) {如果(i %1 ==0 x=1)产率svg.node();
1) svg.node()
在生成器'gen()‘中,它生成svg.node()。它实际上是在我的svg上画东西(我检查了它,只是取消了这一行的注释)
什么是svg.node(),为什么我需要使用这个参数来绘制一些东西?因为,通常,当我想画东西时,我只需要d3.选择(‘svg’).append(‘###’).然后我可以在我的'svg‘上画一些东西,但是在这个生成器中,它使用'svg.node()’来绘制一些东西。我想知道为什么和什么是'svg.node()
function* gen() {
var random = d3.randomNormal(); // Try randomUniform?
const n = 2000;
const width = window.innerWidth;
const height = 400;
const radius = 2;
const dodge = dodger(radius * 2 + 1);
const margin = { top: 0, right: 10, bottom: 20, left: 10 };
const values = Float64Array.from({ length: n }, random);
const x = d3.scaleLinear(d3.extent(values), [
margin.left,
width - margin.right
]);
const svg = d3
.select("body")
.append("svg")
.attr("width", width)
.attr("height", height)
.style("overflow", "visible");
// var fillScale = d3.scaleSequentialLog(chroma.interpolateSinebow)
svg
.append("g")
.attr("transform", `translate(0,${height - margin.bottom})`)
.call(d3.axisBottom(x));
function dodger(radius) {
const radius2 = radius ** 2;
const bisect = d3.bisector(d => d.x);
const circles = [];
return function(x) {
const l = bisect.left(circles, x - radius);
const r = bisect.right(circles, x + radius);
let y = 0;
for (let i = l; i < r; ++i) {
const { x: xi, y: yi } = circles[i];
const x2 = (xi - x) ** 2;
const y2 = (yi - y) ** 2;
if (radius2 > x2 + y2) {
y = yi + Math.sqrt(radius2 - x2) + 1e-6;
i = l - 1;
continue;
}
}
circles.splice(bisect.left(circles, x, l, r), 0, { x, y });
return y;
};
}
for (let i = 0; i < n; ++i) {
if (i % 5 === 0) yield svg.node();
const cx = x(values[i]); // x(values[i]);
const cy = height - margin.bottom - dodge(cx) - radius - 1;
svg
.append("circle")
.attr("cx", cx)
.attr("cy", -400)
.attr("r", radius)
.attr("fill", "red")
.attr("fill", "#9e0dd7") //purple
.transition()
.duration(650)
.ease(d3.easeBounce)
.attr("cy", cy);
}
yield svg.node();
}
const genratorAnimation = gen();
let result = genratorAnimation.next();
//genratorAnimation.next();
let interval = setInterval(function(){
if(!result.done) {
genratorAnimation.next();
}
else {
clearInterval(interval)
}
}, 50);2)等分/平分线/splice
我不明白代码使用等分、平分线和拼接来放置球所用的逻辑。据我所知,二分法是将新实体放入数组的索引号。(基于升序) splice正在替换或插入数组中的实体。但是,我不明白代码是如何实现所需的抛球排列的。
( 3) for (设i= 0;i< n;++i) { if (i %1 ==0 {1)产率svg.node();
我通过将1==0改为2==0和10==0来玩这个数字。这个方程似乎定义了每次下降的球数。为什么?
我知道我问的问题太多了,我愿意一个接一个地发问好几次。但如果有人能回答我会很感激的。
提前谢谢你。
发布于 2020-03-23 03:46:26
svg.node()返回svg值。但是,我不知道为什么它通过提出论点来吸引一些东西。
发布于 2020-04-24 05:19:18
如果您使用console.log(svg.node()),您可以在控制台中找到一个包含svg总元素节点的对象。
返回svg.node()通常用于显示或更新svg图。
https://stackoverflow.com/questions/60807503
复制相似问题