我正在使用raphael.js绘制一个简单的SVG线条图,类似于这样:
当用户悬停在图上时,我希望显示一个弹出框,指向鼠标光标所在的X位置处的线条,并在该X位置的线条的Y位置处显示,如下所示:
我需要取出路径并找到给定X坐标的Y坐标。
我正在使用raphael.js绘制一个简单的SVG线条图,类似于这样:
当用户悬停在图上时,我希望显示一个弹出框,指向鼠标光标所在的X位置处的线条,并在该X位置的线条的Y位置处显示,如下所示:
我需要取出路径并找到给定X坐标的Y坐标。
function findY(path, x) {
var pathLength = path.getTotalLength()
var start = 0
var end = pathLength
var target = (start + end) / 2
// Ensure that x is within the range of the path
x = Math.max(x, path.getPointAtLength(0).x)
x = Math.min(x, path.getPointAtLength(pathLength).x)
// Walk along the path using binary search
// to locate the point with the supplied x value
while (target >= start && target <= pathLength) {
var pos = path.getPointAtLength(target)
// use a threshold instead of strict equality
// to handle javascript floating point precision
if (Math.abs(pos.x - x) < 0.001) {
return pos.y
} else if (pos.x > x) {
end = target
} else {
start = target
}
target = (start + end) / 2
}
}
d
属性可能更有效率。const regex = new RegExp(`${x} ((\d*.\d*))`)
const match = regex.exec(d)
如果您想查找路径 d 属性中不存在的任意 x 坐标的 y 值,可以循环遍历路径的所有坐标,并找到最接近您要查找的 x 坐标的那个。不确定这是否比遍历路径并调用 getPointAtLength
更快。