我创建了一个4点贝塞尔曲线。我使用this link知道总的贝塞尔曲线长度。我从起点就知道了这个长度。
我想知道如何从贝塞尔曲线和一个点获得时间值。我发现a similar question并将贝塞尔曲线分成了1000个;但这不是一个好的解决方案。
我怎样才能获得价值?
答案 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
}
其中a
,b
,c
,d
是您曲线的控制点。由于这是近似值,因此您不会寻找&#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