13

我需要一种方法,允许我在给定 x 坐标的情况下在三次贝塞尔曲线上找到 Y 坐标。

我遇到过很多地方告诉我将其视为三次函数,然后尝试找到根,我理解。然而,三次贝塞尔曲线的方程是(对于 x 坐标):

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)当仍然未知时,我应该如何求解方程?

4

5 回答 5

7

三次贝塞尔曲线有三种常用的表达方式。

首先 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

前两个在数学上是相同的,只是对变量使用不同的名称。

根据您的描述“在三次贝塞尔曲线上找到 Y 坐标,并在其上给出 x 坐标。” 我猜你有一个使用第二个方程的问题正在尝试重新排列第一个方程来帮助你解决它,而你应该使用第二个方程。如果是这样,则不需要重新排列或求解 - 只需插入您的 x 值,您就有了解决方案。

您可能有第三种情况的方程,这是丑陋和困难的情况。这是 x 和 y 参数都是第三个变量 t 的三次贝塞尔曲线。

x(t) = sum( f_i(t) x_i )
y(t) = sum( f_i(t) y_i )

如果这是你的情况。让我知道,我可以详细说明您需要做些什么来解决它。

于 2012-07-03T00:35:19.043 回答
2

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

我迭代 t 生成一个 x 和 y 值的数组。为了我的目的,我以相当高的分辨率完成了它。(我希望生成一个 8 位查找表,所以我使用了大约 1000 个点。)我只是将 t 插入贝塞尔方程中,以便将下一个 x 和下一个 y 坐标存储在数组中。一旦我生成了整个东西,我就扫描了数组以找到最接近的 2 个 x 值。(或者如果有一个完全匹配,就使用它。)然后我对那个非常小的线段进行线性插值以获得我需要的 y 值。

于 2012-07-03T00:34:25.300 回答
1

进一步发展表达应该让你摆脱这些(1 - t)因素

如果你运行:

expand(800*t^3 + 3*(1-t)*800*t^2 + 3*(1-t)^2*600*t + (1-t)^3*100 -400 = 0);

wxMaximaMaple中(你必须t在这个中添加参数),你得到:

100*t^3 - 900*t^2 + 1500*t - 300 = 0

求解新的三次方程t(您可以使用三次方程公式),得到 后t,您可以找到x

x = (x4 - x0) * t      (asuming x4 > x0) 
于 2012-07-03T01:06:00.530 回答
0

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

以 t 的三次方形式重新排列

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 的值。t 可能有多个实际值(如果您的曲线两次穿过相同的 x 点)。就我而言,我正在处理一种情况,即任何 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
于 2018-03-21T09:39:09.793 回答
-1

所以我一直在寻找某种方法来让我找到三次贝塞尔曲线上的 Y 坐标,给定一个 x 坐标。

考虑点 (0, 0) 和 (0, 100) 之间的三次贝塞尔曲线,控制点位于 (0, 33) 和 (0, 66)。对于给定的 X,那里有无限数量的 Y。所以没有方程可以解决给定 X 的任意三次贝塞尔曲线的 Y。

对于稳健的解决方案,您可能需要从De Casteljau 算法开始

递归分割曲线,直到各个线段接近一条直线。然后,您可以检测这些不同的线段是否以及在何处与您的 x 相交,或者它们是否是 x 对应于您正在寻找的 x 的垂直线段(我上面的示例)。

于 2013-03-21T10:01:55.267 回答