当X已知时,曲线计算Y



问题

好的,基本上我要做的是,当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"实际上是窗口的宽度,其中立方曲线被渲染。因此在我的代码中它实际上是"width - 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;

再次强调,我要计算的是曲线的Y坐标在已知X坐标的情况下。但我唯一能计算的是X &T给定时曲线上Y的位置

这是我的第一个帖子,所以如果有些东西写得不是100%正确,我道歉!

对于一个'x'值,三次曲线可以有多个'y'值,所以你必须在旋转三次曲线后执行根查找,使其与x/y轴对齐。http://pomax.github.io/bezierinfo/#intersections包含了这个概念,但其思想是这样的:

  1. 取由点{p1,p2,p3,p4}定义的曲线,并取点{p5,p6}在x= x处的直线(其中p5是某个坐标(x,…),p6是另一个坐标(x,…)。重要的是它是一条垂直线,所以两个点有相同的x值)。

  2. 平移和旋转你的三次曲线和你的线,一起,使你的线成为水平的,在新的高度y = 0。

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

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

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

如果你的公式是正确的,理论上可以用三次函数根公式来表示xt的依赖关系。然后从x中找到t,从t中找到y

相关内容

  • 没有找到相关文章

最新更新