我需要一种方法,让我找到一个三次Bezier曲线Y坐标,给予的x坐标。
我遇到很多的告诉我把它作为地方三次函数,然后试图找到根源,这我明白。 然而,对于三次贝塞尔曲线的方程式是(对于x-coords)使用:
X(t) = (1-t)^3 * X0 + 3*(1-t)^2 * t * X1 + 3*(1-t) * t^2 * X2 + t^3 * X3
是什么让我困惑的是另外的(1-t)
的值。 举例来说,如果我填了一些随机数的X值:
400 = (1-t)^3 * 100 + 3*(1-t)^2 * t * 600 + 3*(1-t) * t^2 * 800 + t^3 * 800
然后重新安排它:
800t^3 + 3*(1-t)*800t^2 + 3*(1-t)^2*600t + (1-t)^3*100 -400 = 0
我还是不知道的值(1-t)
的系数。 我如何我应该求解方程时, (1-t)
仍是未知数?
有表达三次Bezier曲线的三种常用的方法。
第一x作为t的函数
x(t) = sum( f_i(t) a_i )
= (1-t)^3 * x0 + 3*(1-t)^2 * t * x1 + 3*(1-t) * t^2 * x2 + t^3 * x3
其次y为x的函数
y(x) = sum( f_i(x) a_i )
= (1-x)^3 * y0 + 3*(1-x)^2 * x * y1 + 3*(1-x) * x^2 * y2 + x^3 * y3
前两个是数学一样,只是使用的变量不同的名称。
通过你的描述来看“找到一个三次Bezier曲线Y坐标,因为它的x坐标。” 我猜你已经使用第二个公式是试图重新排列第一方程式,以帮助你解决这个问题,在这里,你应该使用第二个公式有一个问题。 如果多数民众赞成的情况下,则不需要清理或解决 - 只需在你的x值,你有解决方案。
它可能是你有第三种情况下,这是丑陋和硬盒的方程。 这是x和y参数是第三变量t的立方贝济耶。
x(t) = sum( f_i(t) x_i )
y(t) = sum( f_i(t) y_i )
如果您遇到这种情况。 让我知道,我可以详细,你需要做些什么来解决这个问题。
我认为这是一个公平的CS的问题,所以我要去尝试,以显示我是如何解决这个。 请注意,一个给定的x可能有与之相关的超过1个y值。 在我需要这样的情况下,这是保证不会是这种情况,那么你就必须弄清楚如何确定你要哪一个。
我遍历吨生成x和y值的阵列。 我这样做是在一个相当高的分辨率为我的目的。 (我一直在寻找,以生成8位的查找表,所以我用〜1000点)。我刚插入到吨用于下一x和下一个y坐标阵列中存储贝塞尔方程。 一次,我所产生的全部内容,我通过阵列扫描以找到最接近的2 x值。 (或者,如果有一个精确匹配,使用了。)然后我做了非常小的线段的线性插值获得的y值,我需要。
开发式还应该让你摆脱(1 - t)
因素
如果你运行:
expand(800*t^3 + 3*(1-t)*800*t^2 + 3*(1-t)^2*600*t + (1-t)^3*100 -400 = 0);
在这两种wxMaxima或枫木 (你必须添加参数t
在这其中虽然),您可以:
100*t^3 - 900*t^2 + 1500*t - 300 = 0
解决新三次方程t
(你可以使用三次方程公式为),你得到后t
,你可以找到x
这样做:
x = (x4 - x0) * t (asuming x4 > x0)
方程贝塞尔曲线(获得x值):
Bx = (-t^3 + 3*t^2 - 3*t + 1) * P0x +
(3*t^3 - 6*t^2 + 3*t) * P1x +
(-3*t^3 + 3*t^2) * P2x +
(t^3) * P3x
重新排列立方吨的形式
0 = (-P0x + 3*P1x - 3*P2x + P3x) * t^3+
(3*P0x - 6*P1x + 3*P2x) * t^2 +
(-3*P0x + 3*P1x) * t +
(P0x) * P3x - Bx
解决这个使用三次公式找到对于t值。 有可能是(如果你的曲线穿过相同的x点两次)的T多个真实值。 在我来说,我正在处理那里有永远只能为x的任何值的单个的y值的情况。 所以,我可以只取唯一真正的根为T的值。
a = -P0x + 3.0 * P1x - 3.0 * P2x + P3x;
b = 3.0 * P0x - 6.0 * P1x + 3.0 * P2x;
c = -3.0 * P0x + 3.0 * P1x;
d = P0x;
t = CubicFormula(a, b, c, d);
接下来把T的值回贝塞尔曲线y的
By = (1-t)^3 * P0x +
3t(1-t)^2 * P1x +
3t^2(1-t) * P2x +
t^3 * P3x
所以,我一直在四处寻找某种方法让我找到一个三次Bezier曲线Y坐标,因为它的x坐标。
考虑在(0,33)和(0,66)的点(0,0)和(0,100)之间的三次Bezier曲线,与控制点。 有个Y有无限多的对于给定的X.所以没有公式,那将解决给出:Y X对于任意三次Bezier。
对于一个强大的解决方案,你可能要开始与德卡斯特里奥算法
分割曲线递归直到单个段近似一条直线。 然后,您可以检测到这些不同的线段是否以及在何处拦截你的X或者他们是否是垂直线段,其x对应于你正在寻找(我上面的例子)在x。