En utilisant d3 et React, j'ai tracé un chemin. Sur ce chemin, j'ai plusieurs cercles qui ne peuvent être déplacés que le long de ce chemin. Cependant, mon implémentation actuelle (sorte de) fonctionne quand il y a un cercle sur ce chemin.Traîner le long de la trajectoire en d3
(Sur dragStart, il se déplace à la longueur 0 sur le chemin quelle que soit sa position, et chaque fois que je fais glisser un second cercle, il commence à la position du cercle précédent).
Ma question est: Comment puis-je faire glisser plusieurs cercles (ou w.e) le long d'un chemin dans d3? Est-il possible d'obtenir la position currentLength sur le chemin en fonction de cx et cy du cercle actuel?
var currentLength = 0;
class MyComponent extends Component {
constructor(props) {
super(props)
currentLength = 0;
}
componentDidMount() {
var drag = d3.behavior.drag()
.on('drag', this.move);
var g = d3.select(this._base);
var circle = g.selectAll('circle').data(this.props.data);
var onEnter = circle.enter();
onEnter.append('circle')
.attr({
r: 10,
cx: (d) => d.x,
cy: (d) => d.y
})
.style('fill', 'blue')
.call(drag);
}
move(d) {
currentLength += d3.event.dx + d3.event.dy
if (currentLength < 0) {
currentLength = 0
}
var pointAtCurrentLength = d3.select('#path').node().getPointAtLength(currentLength)
this.cx.baseVal.value = pointAtCurrentLength.x;
this.cy.baseVal.value = pointAtCurrentLength.y;
}
render() {
return <g ref={(c)=>this._base=c}></g>
}
}
Quelque chose de semblable à cela, seuls les cercles draggable et multiples: http://bl.ocks.org/mbostock/1705868
Pouvez-vous créer un violon JS avec cet extrait? Il est difficile de déboguer ce code sans le voir en action. Un problème que je vois est que vous ne liez pas 'move' à votre classe, alors assigner this.cy/this.cx ne fonctionnera probablement pas –