我创建了一个JSFiddle,我希望能够沿路径拖动一个圆圈,但是我遇到了问题。这是JSFiddle的链接: http://jsfiddle.net/fHBpC/2/
以下是我遇到的问题:
在dragMove中,参数“d”未定义。
我的路径应该从(0,0)开始到(200,200)并以(150,150)结束,但它只从(0,0)开始并转到(200) ,200)。
如何让圆圈仅沿着直线拖动?
对应代码:
1
function dragMove(d) {
console.log("dragging a circle");
d.x += d3.event.dx;
d.y += d3.event.dy;
d3.select(this)
.attr('x', d.x)
.attr('y', d.y)
.attr("transform", "translate(" + d.x + "," + d.y + ")");
}
2
var path = content.append("path").attr("d", "M 100 100 L 200 200 L 150 150").style("stroke-width", 5).style("stroke", "steelblue");
答案 0 :(得分:1)
this
来引用圈子元素。但是dragMove()
函数还存在一些问题。
x
和y
,它们被称为cx
和cy
。SVGAnimatedLength
类型。这意味着,你不能用它们做算术。 transform
transform
与cx
/ cy
属性/属性无关,即它会将圆圈移动一个额外的数量,以便圆圈可以移动到您想要的两倍。getPointAtLength()
方法。这意味着,您可以使用指针的向下或向右移动将圆圈进一步移动到路径的末端,类似地使用向左或向上移动将其进一步移动到开始(请参阅fixed jsFiddle)。这有一些缺点,即一般来说,即使指针在路径上,圆也会在其他地方(在你的例子中不会是这种情况,因为初始路径段是45°行程),怎么能如果我到达屏幕的边缘并且不能进一步移动,我到达路径的尽头?或者,您可以在getPointAtLength()
处抛出一些值,然后选择最接近指针位置的值。