胡说叔叔
这是一个使用 vanilla javascript 而不是 d3 的演示,但我希望你会发现它很有用。该函数getLengthForPoint(p,thePath)正在计算给定点 p 在路径上的距离。我正在设置一个变量let precision = 100;。根据路径的长度,您可能希望将此值更改为其他值。还要记住,一条路径可以多次通过同一个点。这可能很棘手,并且可能会给您带来错误。同样如您所知,您将获得到某个点的近似距离。在这个例子中,点p1 = {x:93.5,y:60}. 计算长度处的点具有以下坐标:{x:93.94386291503906,y: 59.063079833984375}// some points on the pathlet p1 = {x:93.5,y:60}let p2 = {x:165,y:106}//the total length of the pathlet pathLength = thePath.getTotalLength();let precision = 100;let division = pathLength / precision;function getLengthForPoint(p,thePath){ let theRecord = pathLength; let theSegment; for (let i = 0; i < precision; i++) { // get a point on the path for thia distance let _p = thePath.getPointAtLength(i * division); // get the distance between the new point _p and the point p let theDistance = dist(_p, p); if (theDistance < theRecord) { // if the distance is smaller than the record set the new record theRecord = theDistance; theSegment = i; } } return(theSegment * division); }let theDistanceOnThePath = getLengthForPoint(p1,thePath);//if you calculate the coords of a point at the calculated distance you'll see that is very near the point console.log(thePath.getPointAtLength(theDistanceOnThePath));let theDistanceBetween2PointsOnThePath = getLengthForPoint(p2,thePath) - getLengthForPoint(p1,thePath);// a helper function to measure the distance between 2 pointsfunction dist(p1, p2) { let dx = p2.x - p1.x; let dy = p2.y - p1.y; return Math.sqrt(dx * dx + dy * dy);}svg{border:solid}<svg viewBox="0 10 340 120"><path id="thePath" fill="none" stroke="black" d="M10, 24Q10,24,40,67Q70,110,93.5,60Q117,10,123.5,76Q130,142,165,106Q200,70,235,106.5Q270,143, 320,24"></path> <circle cx="93.5" cy="60" r="2" fill="red"/> <circle cx="165" cy="106" r="2" fill="red"/></svg>要获得路径上两点之间的距离,您可以执行以下操作:let theDistanceBetween2PointsOnThePath = getLengthForPoint(p2,thePath) - getLengthForPoint(p1,thePath);