Sto cercando di creare un rilevamento di collisione nel mio layout forzato svg
(d3js). Ho seguito il tutorial this che crea una collisione di forma circolare.rilevamento collisione retta d3js
Per qualche motivo non funziona per la forma rettale. Ho provato a giocare con i parametri in un velo.
Ecco il mio codice:
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);
e questo:
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 + ")";
});
});
e la funzione di collisione:
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;
};
}
Come posso rilevare la collisione per rect?
Grazie !!!
Ho la stessa domanda, anche se forse un po 'più avanti del tuo esempio. Qualcosa non è giusto con le modifiche apportate alla funzione collide, "perché sto diventando troppa repulsione tra i rettangoli: http://bl.ocks.org/dobbs/1d353282475013f5c156 –