0

问题

好的,基本上我想要做的是在给定 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"。

所以下面的代码,可以在给定 T 时计算三次曲线上的 X 和 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 位置。但我唯一能计算出的是在给定 T 时曲线上的 X 和 Y 位置。

这是我的第一篇文章,所以如果有些东西没有 100% 正确地写出来,我深表歉意!

4

2 回答 2

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值)。

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

于 2013-06-10T22:42:36.280 回答
0

如果您的公式是正确的,理论上可以使用三次函数根的公式来表达tx. 然后从x你找t,从t你找y

于 2013-06-10T12:53:08.090 回答