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

时间:2014-11-21 04:01:26

标签: curve bezier

我创建了一个4点贝塞尔曲线。我使用this link知道总的贝塞尔曲线长度。我从起点就知道了这个长度。

我想知道如何从贝塞尔曲线和一个点获得时间值。我发现a similar question并将贝塞尔曲线分成了1000个;但这不是一个好的解决方案。

我怎样才能获得价值?

1 个答案:

答案 0 :(得分:0)

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

如果你想得到一个近似的答案(就像你已经为长度计算所做的那样),只需构建一个坐标为for-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是您曲线的控制点。由于这是近似值,因此您不会寻找&#34; t值作为坐标&#34;但是&#34;最接近t值来协调&#34;。它不会是完美的。

完美的是找到x和y坐标组件的所有可能t值,然后从可能的集合中找到一个或两个t值六种方法生成的x和y解决方案相同。你可以使用Cardano的方法来实现这一点,这在另一个stackoverflow问题中解释:Cubic Bezier reverse GetPoint equation: float for Vector <=> Vector for float