【发布时间】:2019-08-25 07:07:26
【问题描述】:
我需要在 mousedown 事件中创建一个圆圈并将其移动到 SVG 路径中的最近点
代码:
var points = [[180,300],[234,335],[288,310],[350,290],[405,300],[430,305],[475,310],[513,300],[550,280]];
var width = 1000, height = 600;
var line = d3.svg.line().interpolate("cardinal");
var svg = d3.select("#Con").append("svg").attr("width", width).attr("height", height);
var path = svg.append("path").datum(points).attr("d", line);
var line = svg.append("line");
var circle = svg.append(" circle").attr("cx", -10).attr("cy", -10).attr("r", 3.5);
svg.append("rect").attr("width", width).attr("height", height).on("mousedown", mouseclick);
function mouseclick() {
var m = d3.mouse(this),p = closestPoint(path.node(), m);
circle.attr("cx", p[0]).attr("cy", p[1]);
}
function closestPoint(pathNode, point) {
var pathLength = pathNode.getTotalLength(),precision = 8,best,bestLength,bestDistance = Infinity;
for (var scan, scanLength = 0, scanDistance; scanLength <= pathLength; scanLength += precision) {
if ((scanDistance = distance2(scan = pathNode.getPointAtLength(scanLength))) < bestDistance) {
best = scan, bestLength = scanLength, bestDistance = scanDistance;
}
}
precision /= 2;
while (precision > 0.5) {
var before,after,beforeLength,afterLength,beforeDistance,afterDistance;
if ((beforeLength = bestLength - precision) >= 0 && (beforeDistance = distance2(before = pathNode.getPointAtLength(beforeLength))) < bestDistance) {
best = before, bestLength = beforeLength, bestDistance = beforeDistance;
} else if ((afterLength = bestLength + precision) <= pathLength && (afterDistance = distance2(after = pathNode.getPointAtLength(afterLength))) < bestDistance) {
best = after, bestLength = afterLength, bestDistance = afterDistance;
} else {
precision /= 2;
}
}
best = [best.x, best.y];
best.distance = Math.sqrt(bestDistance);
return best;
function distance2(p) {
var dx = p.x - point[0],dy = p.y - point[1];
return dx * dx + dy * dy;
}
}
当我在 SVG 空间中单击时,我需要将圆圈移动到路径中的最近点
在我的代码中,圆圈在没有动画的情况下移动,我需要对其进行动画处理,以便它在路径上从一个点移动到另一个点
无论是大距离还是小距离,我都需要它始终以一种速度移动
像这样:
【问题讨论】:
-
这似乎与stackoverflow.com/q/54523405/1978785 的重复很接近 这个问题是否涵盖了您的问题?如果不是,您可以将您的问题编辑得更具体吗?
-
从你的 jsfiddle 看来你没有遇到鼠标按下事件的问题。您需要帮助的只是动画吗?这个中风动画问题似乎也非常接近您的要求。这个问题有帮助吗:stackoverflow.com/questions/53738351/…
-
在这两个问题中路径都在改变(动画),我不想改变路径,我想要动画圆圈运动。
-
感谢您的解释。你现在有几个很好的答案。对所有有帮助的答案进行投票,并最终接受您认为最能回答您的问题的答案。如果没有一个答案足以回答您的问题,您可以编辑您的问题以更清楚地说明您在问什么。
标签: javascript html d3.js svg