gpt4 book ai didi

javascript - 矩形碰撞检测d3js

转载 作者:数据小太阳 更新时间:2023-10-29 04:09:09 27 4
gpt4 key购买 nike

我正在尝试在我的 svg 强制布局 (d3js) 中创建碰撞检测。我关注了this制作圆形碰撞的教程。

出于某种原因,它不适用于矩形。我试图在面纱中使用参数。

这是我的代码:

var node = svg.selectAll(".node")
.data(json.nodes)
.enter().append("g")
.attr("class", "node")
.call(force.drag);

node
.append("rect")
.attr("class", "tagHolder")
.attr("width", 60)
.attr("height", 60)
.attr("rx", 5)
.attr("ry", 5)
.attr("x", -10)
.attr("y", -10);

还有这个:

 svg.selectAll(".node")
.attr("x", function(d) { return d.x; })
.attr("y", function(d) { return d.y; });

link.attr("x1", function(d)
{
return d.source.x;
})
.attr("y1", function(d) { return d.source.y; })
.attr("x2", function(d) { return d.target.x; })
.attr("y2", function(d) { return d.target.y; });

node.attr("transform", function(d)
{
return "translate(" + d.x + "," + d.y + ")";
});
});

和碰撞函数:

function collide(node) {
var r = 30,
nx1 = node.x - r,
nx2 = node.x + r,
ny1 = node.y - r,
ny2 = node.y + r;

return function(quad, x1, y1, x2, y2)
{
if (quad.point && (quad.point !== node))
{
var x = node.x - quad.point.x,
y = node.y - quad.point.y,
l = Math.sqrt(x * x + y * y),
r = 30 + quad.point.radius;
if (l < r)
{
l = (l - r) / l * .5;
node.x -= x *= l;
node.y -= y *= l;
quad.point.x += x;
quad.point.y += y;
}
}

return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1;
};
}

如何检测矩形的碰撞?

谢谢!!!

最佳答案

d3 示例中的碰撞函数通过比较圆心之间的距离来计算圆的重叠 l = Math.sqrt(x * x + y * y)加上它们的半径之和 r = node.radius + quad.point.radius .当l < r圆圈重叠,两个圆圈相互远离以纠正重叠。

矩形的类似碰撞函数以相同的方式工作,通过计算矩形的重叠并使每个矩形远离另一个:

function collide(node) {
var nx1, nx2, ny1, ny2, padding;
padding = 32;
nx1 = node.x - padding;
nx2 = node.x2 + padding;
ny1 = node.y - padding;
ny2 = node.y2 + padding;
return function(quad, x1, y1, x2, y2) {
var dx, dy;
if (quad.point && (quad.point !== node)) {
if (overlap(node, quad.point)) {
dx = Math.min(node.x2 - quad.point.x, quad.point.x2 - node.x) / 2;
node.x -= dx;
quad.point.x += dx;
dy = Math.min(node.y2 - quad.point.y, quad.point.y2 - node.y) / 2;
node.y -= dy;
quad.point.y += dy;
}
}
return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1;
};
};

宽度重叠为dx = Math.min(node.x2 - quad.point.x, quad.point.x2 - node.x) / 2;其中高度重叠为 dy = Math.min(node.y2 - quad.point.y, quad.point.y2 - node.y) / 2;这表明您的节点必须知道矩形的两个 Angular :左上角 (x, y)和右下角 (x2, y2) .

请在此处查看完整示例:http://bl.ocks.org/dobbs/1d353282475013f5c156 .该示例使用 coffeescript,并且仅沿 y 轴将 rects 彼此远离,因为这更符合我自己的情况。

关于javascript - 矩形碰撞检测d3js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19202161/

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