我有三次贝塞尔以2个控制点。 起点和控制点是已知的。 需要得到曲线,给出控制,起点和终点的所有点。 我想,以实现从1 ..given的值i到曲线的长度..获得在该位置的各点的X和Y和α(角度)。 我不能找到一个很好的参考或工作代码为。 我使用的JavaScript。
Answer 1:
如果我理解正确,你正在试图确定每个点的位置和斜率贝塞尔的(相切的曲线)。
让我们假设你的起点是(AX,AY),终点为(DX,DY)和你的控制点(BX,BY)和(CX,CY)。
位置很容易。 首先,计算混合功能。 这些控制曲线上的控制点的“效果”。
B0_t = (1-t)^3
B1_t = 3 * t * (1-t)^2
B2_t = 3 * t^2 * (1-t)
B3_t = t^3
注意B0_t如何为1时,t为0(和其他一切是零)。 此外,B3_T是1时t是1(和其他一切是零)。 因此,曲线开始于(AX,AY),并在(DX,DY)结束。
任何中间点(px_t,py_t)将通过以下(变化吨从0到1,在一个循环内小的增量)给出:
px_t = (B0_t * ax) + (B1_t * bx) + (B2_t * cx) + (B3_t * dx)
py_t = (B0_t * ay) + (B1_t * by) + (B2_t * cy) + (B3_t * dy)
斜率也很容易做到。 使用中给出的方法https://stackoverflow.com/a/4091430/1384030
B0_dt = -3(1-t)^2
B1_dt = 3(1-t)^2 -6t(1-t)
B2_dt = - 3t^2 + 6t(1-t)
B3_dt = 3t^2
因此,X和Y的变化率分别为:
px_dt = (B0_dt * ax) + (B1_dt * bx) + (B2_dt * cx) + (B3_dt * dx)
py_dt = (B0_dt * ay) + (B1_dt * by) + (B2_dt * cy) + (B3_dt * dy)
然后使用Math.atan2(py_dt,px_dt)
得到(弧度)的角度。
Answer 2:
德卡斯特里奥算法是比较数值稳定。 这具有附加的优点,即它计算切线(并且因此,切线角度)作为步骤之前立即计算点。
但是,它根据参数值,而不是长篇作品。 优选的是通过参数来计算点,而不是值,如绘制曲线的一部分。 参数的范围将是[0 ... 1]
0
对应于起动,和1
曲线的结束点。
Answer 3:
这个库可以帮助了。
https://code.google.com/p/jsbezier/
文章来源: Find all the points of a cubic bezier curve in javascript