在Cubic Bezier曲线上找到Y给定的X?

Cap*_*ome 12 c++ bezier curve cubic

我需要一种方法,允许我在给定x坐标的情况下在Cubic Bezier曲线上找到Y坐标.

我遇到很多地方告诉我把它当作一个立方函数然后试图找到根,我明白了.然而,对于Cubic Bezier曲线的等式是(对于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)还是应该解决这个方程仍然未知?

Mic*_*son 6

表达三次贝塞尔曲线有三种常用方法.

第一个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
Run Code Online (Sandbox Code Playgroud)

其次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
Run Code Online (Sandbox Code Playgroud)

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

根据您的描述判断"在Cubic Bezier曲线上找到Y坐标,给出一个x坐标." 我猜你使用第二个方程得到一个问题是试图重新排列第一个方程以帮助你解决它,你应该使用第二个方程.如果是这种情况,则不需要重新排列或解决 - 只需插入您的x值即可获得解决方案.

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

x(t) = sum( f_i(t) x_i )
y(t) = sum( f_i(t) y_i )
Run Code Online (Sandbox Code Playgroud)

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


use*_*321 2

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

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