如何从给定长度的贝塞尔曲线中获取时间值



我创建了一个4点贝塞尔曲线。我使用此链接知道贝塞尔曲线的总长度。我知道从起点开始的长度。

我想知道如何从贝塞尔曲线和点中获取时间值。我发现了一个类似的问题,并将贝塞尔曲线分成 1000 块;但这不是一个好的解决方案。

如何获得 t 值?

请注意,对于三次贝塞尔曲线,没有"每个坐标有一个t值"。三次贝塞尔可以自相交,因此您可以找到单个坐标的多个t值。有两种方法可以做到这一点:近似或象征。

如果你想要一个近似的答案(就像你已经在为长度计算所做的那样),只需构造一个坐标的查找表:

buildLUT(a,b,c,d) {
  for(t=0; t<=1; t+=0.01) {
    LUTx[t*100] = getCoordinate(t, a.x,b.x,c.x,d.x);
    LUTy[t*100] = getCoordinate(t, a.y,b.y,c.y,d.y);
  }
}

并编写一个额外的函数用于反向查找或构建反向LUT:

findTforCoordinate(x, y) {
  found = []
  for(i=0, len=LUTx.length; i<len; i++) {
    _x = LUTx[i], _y = LUTy[i]
    if(x==_x && y==_y) { found.push(i/len); }
  }
  return found
}

其中abcd是曲线的控制点。由于这是近似值,因此您不是在查找"坐标的 t 值",而是"最接近坐标的 t 值"。它不会是完美的。

完美的是找到 x 和 y 坐标分量的所有可能的t值,然后从该方法生成的六个可能的集合中找到一个或两个t值,这些值在 x 和 y 解决方案之间是相同的。你可以通过使用卡尔达诺的方法来做到这一点,这在另一个堆栈溢出问题中得到了解释: 三次贝塞尔反向 GetPoint 方程:浮点数表示向量 <=> 浮点数的向量

最新更新