【问题标题】:Relative position along path沿路径的相对位置
【发布时间】:2016-12-02 22:30:39
【问题描述】:

我有一个沿开放路径移动的形状,我想知道如何获得它的相对位置,即给定形状的 (x,y) 坐标和路径 (p) 的长度 (L) ,该函数应返回该点所在的比率 (r)。

例如,r = 0 表示该点位于路径的最开始,0.25 位于四分之一,0.5 一半,等等。

我可以做到的一种方法是迭代函数 p.getPointAtLength() 以获得不同的长度增量,直到给定位置在我的原始点 (x, y) 的可接受范围内。然后简单地将这个值除以 p.getTotalLength()。

但是知道在我的情况下路径是 4 点贝塞尔曲线,是否有更有效和更精确的方法?

【问题讨论】:

  • 你是如何定位形状的,你不是已经知道了,因为你必须计算它沿着路径有多远,才能得到 x,y 来定位它?
  • 是的,我将形状的初始位置设置在曲线的一半,但如果它被很好地拖走,问题就来了......

标签: path position raphael bezier


【解决方案1】:

简短回答:不。

为距离而不是时间重新参数化贝塞尔曲线是一个没有通用解决方案的重要问题,因此到目前为止,“沿着计算机屏幕上的路径移动”最有效的方法是 LUT-基于http://pomax.github.io/bezierinfo/#tracing的方法

【讨论】:

    【解决方案2】:

    对于那些可能感兴趣的人,这是我的工作方法:

    getLengthAtPoint = function(x, y, curve){
      var len = curve.getTotalLength(),
        tol = len/100,
        inc = len/100,
        err,
        errMin = 99999, // infinity
        cond = true,
        lengthIter = 0,
        lengthMin = 0;
    
      do {
        err = dist(curve.getPointAtLength(lengthIter), {x, y}); //pythagore
        cond = err>tol;
        if (err < errMin){
          errMin = err;
          lengthMin = lengthIter;
        }
        lengthIter = lengthIter + inc;
        if (lengthIter > len) {cond = false;}
      } while (cond);
    
      return (lengthMin/len);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      • 2011-05-26
      • 2016-07-18
      • 1970-01-01
      • 2012-05-19
      相关资源
      最近更新 更多