10

我正在使用 raphael.js 绘制一个简单的 SVG 折线图,如下所示:

线形图

当用户悬停图表时,id 喜欢显示一个弹出框,指向光标X位置处的线,以及该线对应X位置的Y位置,如下所示:

沿线带有弹出框的光标

我需要走路径并找到给定X坐标的Y坐标。

4

2 回答 2

13

基于@Duopixel的D3解决方案,我使用DOM API在纯javascript中编写了以下函数供自己使用:

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
  }
}
于 2017-12-22T02:59:19.257 回答
0

如果您知道路径的所有点,则在路径d属性中搜索您要查找的特定 x 坐标并使用正则表达式检索 y 坐标可能会更高效:

const regex = new RegExp(`${x} ((\d*.\d*))`)
const match = regex.exec(d)

如果您想找到不在您的路径 d 属性中的 y 和任意 x 坐标,您可以遍历路径的所有坐标并找到最接近您要查找的 x 坐标。不知道这是否会比通过路径和调用更快getPointAtLength

于 2019-11-12T10:10:15.720 回答