当X已知时,曲线计算Y.

时间:2013-06-10 12:42:05

标签: location find curve bezier cubic

问题

好的,基本上我正在尝试做的是,当给出X位置时,计算立方曲线/贝塞尔曲线/样条曲线上的Y位置。

我在Stack Overflow和Google的各个地方都搜索过,我可以找到真正有用的东西!

曲线点

x1 = 50d;
y1 = 400d / 2d + 100d;

x2 = 400d;
y2 = 400d / 2d + 100d;

x3 = 600d - 400d;
y3 = 400d / 2d - 100d;

x4 = 600d - 50d;
y4 = 400d / 2d - 100d;

我计算“600 - 400”并且我不只是写“200”的原因是因为在我的代码中“600”实际上是窗口的宽度,即渲染了立方体曲线。因此,它实际上在我的代码中说“宽度 - 400”。

以下代码之后,可以计算X&当给出T时,Y在立方曲线上!

t = 0.5d;

cx = 3d * (x2 - x1);
cy = 3d * (y2 - y1);

bx = 3d * (x3 - x2) - cx;
by = 3d * (y3 - y2) - cy;

ax = x4 - x1 - cx - bx;
ay = y4 - y1 - cy - by;

point_x = ax * (t * t * t) + bx * (t * t) + cx * t + x1;
point_y = ay * (t * t * t) + by * (t * t) + cy * t + y1;

再次,当你知道一个X位置时,我想要计算的是曲线的Y位置。但我唯一可以计算的是X&给出T时曲线上的Y位置。

这是我的第一篇文章,所以如果没有正确写出一些内容,我道歉!

2 个答案:

答案 0 :(得分:1)

三次曲线对于'x'值可以有多个'y'值,因此在旋转三次曲线以使其与x / y轴对齐之后,您将不得不执行根寻找。 http://pomax.github.io/bezierinfo/#intersections涵盖了这个概念,但想法是:

  1. 取你的曲线,由点{p1,p2,p3,p4}定义,然后将你的线放在x = X处,由点{p5,p6}定义(其中p5是某个坐标(x,。 ..)和p6是另一个坐标(x,...)。重要的是它是一条垂直线,因此两个点都具有相同的 x 值。

  2. 将您的三次曲线和线条一起平移和旋转,以使您的线条在新的高度 y = 0时变为水平。

  3. 您现在可以在曲线的 y 函数上执行立方根查找。这可能会生成0,1,2或3个不同的 t 值。

  4. 对于这些 t 值中的每一个:在正常的未旋转曲线中,计算给定 t 值的(x,y)坐标。现在,您将获得给定 x 的所有 y 值(所有点也将具有相同的 x 值)。

  5. 在链接的文章中,查看三次曲线/线示例的来源,并查看旋转/根寻线的工作原理,请参阅BezierCurve align(Point start, Point end) {...float[] findAllRoots(int derivative, float[] values) {...函数。 (特别注意旋转后,我们只找到y函数的根!x函数与我们想做的事情无关)

答案 1 :(得分:0)

如果您的公式正确,理论上可以使用Formula for cubic function roots来表达t x的依赖关系。然后从x t找到t,从y找到{{1}}。