查找Ÿ在三次Bezier曲线给出X?(Finding Y given X on a Cubic Be

2019-07-30 04:57发布

我需要一种方法,让我找到一个三次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)仍是未知数?

Answer 1:

有表达三次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 )

如果您遇到这种情况。 让我知道,我可以详细,你需要做些什么来解决这个问题。



Answer 2:

我认为这是一个公平的CS的问题,所以我要去尝试,以显示我是如何解决这个。 请注意,一个给定的x可能有与之相关的超过1个y值。 在我需要这样的情况下,这是保证不会是这种情况,那么你就必须弄清楚如何确定你要哪一个。

我遍历吨生成x和y值的阵列。 我这样做是在一个相当高的分辨率为我的目的。 (我一直在寻找,以生成8位的查找表,所以我用〜1000点)。我刚插入到吨用于下一x和下一个y坐标阵列中存储贝塞尔方程。 一次,我所产生的全部内容,我通过阵列扫描以找到最接近的2 x值。 (或者,如果有一个精确匹配,使用了。)然后我做了非常小的线段的线性插值获得的y值,我需要。



Answer 3:

开发式还应该让你摆脱(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) 


Answer 4:

方程贝塞尔曲线(获得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


Answer 5:

所以,我一直在四处寻找某种方法让我找到一个三次Bezier曲线Y坐标,因为它的x坐标。

考虑在(0,33)和(0,66)的点(0,0)和(0,100)之间的三次Bezier曲线,与控制点。 有个Y有无限多的对于给定的X.所以没有公式,那将解决给出:Y X对于任意三次Bezier。

对于一个强大的解决方案,你可能要开始与德卡斯特里奥算法

分割曲线递归直到单个段近似一条直线。 然后,您可以检测到这些不同的线段是否以及在何处拦截你的X或者他们是否是垂直线段,其x对应于你正在寻找(我上面的例子)在x。



文章来源: Finding Y given X on a Cubic Bezier Curve?