【问题标题】:How to measure the length of a subpath of an SVG path?如何测量 SVG 路径的子路径的长度?
【发布时间】:2014-07-12 00:18:46
【问题描述】:

假设我有一个任意的 SVG 路径,并且用户在该路径上选择了两个点。如何计算这两点之间子路径的确切长度?

我对@9​​87654321@ 有点熟悉,但不知道如何使用任何调用来计算路径的部分长度。

我正在使用 D3,因此 D3 API 调用会非常好。

【问题讨论】:

  • 两个选定的点 - 关于它们的已知数据是什么? x, y 坐标是不够的,因为一条路径可以多次通过点 (x, y)。
  • 这是一个开放的非重叠路径。但即便如此,这无关紧要:这些点保证在路径空间中,而不是用户空间中。我本质上是在寻找 SVGPathElement#getPointAtLength 的倒数。
  • 不幸的是,您必须遍历路径才能找到您的x 坐标与getPointAtLength 坐标匹配的确切长度,这是类似bl.ocks.org/duopixel/3824661 的实现
  • 如果可以使用 Snap.svg,Snap.path.intersection 方法很有用。 jsdo.it/defghi1977/cNvB 这是通过光标获取子路径长度的示例。

标签: javascript svg


【解决方案1】:

根据 Duopixel 的有用评论和 demo,这里有一个小函数,用于计算两个 x 坐标之间的路径距离:

function pathDistanceBetweenTwoPoints(path, x1, x2) {
    var pathLength = path.getTotalLength();
    var distance = 0, distance1;
    while (distance < pathLength && x1 > path.getPointAtLength(distance))
        distance1 = distance++;
    while (distance < pathLength && x2 > path.getPointAtLength(distance))
        distance++;
    return distance - distance1;
}

函数在O(n)中运行,这还不错。二进制搜索 (O(log n)) 也是可能的,但对我来说这太过分了。

【讨论】:

  • 很高兴看到一个使用这个的简单演示。顺便说一句,只要distance1null,它可能会导致NaN。 ;)
猜你喜欢
  • 2017-06-24
  • 2021-06-18
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 2014-09-06
相关资源
最近更新 更多