在给定x坐标的情况下,沿SVG路径获得点的y坐标

时间:2013-03-22 19:12:41

标签: javascript svg raphael

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

line graph

当用户悬停图表时,ID会显示指向光标 X 位置的线条的弹出窗口,以及 Y 位置的线条是这样的 X 位置:

cursors with popovers along the line

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

2 个答案:

答案 0 :(得分:4)

基于@ 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
  }
}

答案 1 :(得分:1)

如果您知道路径的所有点,则在路径的d属性中搜索所需的特定x坐标,然后使用regexp检索y坐标可能会更有效。

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

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