好的,基本上我正在尝试做的是,当给出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位置。
这是我的第一篇文章,所以如果没有正确写出一些内容,我道歉!
答案 0 :(得分:1)
三次曲线对于'x'值可以有多个'y'值,因此在旋转三次曲线以使其与x / y轴对齐之后,您将不得不执行根寻找。 http://pomax.github.io/bezierinfo/#intersections涵盖了这个概念,但想法是:
取你的曲线,由点{p1,p2,p3,p4}定义,然后将你的线放在x = X处,由点{p5,p6}定义(其中p5是某个坐标(x,。 ..)和p6是另一个坐标(x,...)。重要的是它是一条垂直线,因此两个点都具有相同的 x 值。
将您的三次曲线和线条一起平移和旋转,以使您的线条在新的高度 y = 0时变为水平。
您现在可以在曲线的 y 函数上执行立方根查找。这可能会生成0,1,2或3个不同的 t 值。
对于这些 t 值中的每一个:在正常的未旋转曲线中,计算给定 t 值的(x,y)坐标。现在,您将获得给定 x 的所有 y 值(所有点也将具有相同的 x 值)。
在链接的文章中,查看三次曲线/线示例的来源,并查看旋转/根寻线的工作原理,请参阅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}}。