给定一个具有固定端点的三次贝塞尔曲线,当给定一个要检查的 y 位置时,如何找到沿它的点的 x 位置?
Given a cubic Bezier curve with fixed endpoints, how can I find the x position of a point along it when given a y position to check?
假设我有一条贝塞尔曲线,有两个固定端点,一个在 x(0), y(1)
,一个在 x(1), y(0)
(左下角和右上角)
现在假设我有两个控制点,它们可以位于 x(0)、x(1)、y(0) 和 y(1) 之间的任何位置。对于这个问题,我只说控制点 #1 位于 x(0.1) y(0.6),控制点 #2 位于 x(0.9) 和 y(0.4)。 (这假设一个“从左上角”的坐标系)
这是我们曲线的一个小例子:
现在假设我的 y 位置为 0.7。算出对应的 x 位置与 y(0.7) 处的点对应的数学是什么样子的?我该怎么做?
抱歉,如果这个问题不属于这里,但我认为这是编码中面临的一个常见问题,很可能你们中的许多人都有我正在寻找的答案。
您有函数 X(t)
和 Y(t)
的三次方程,其中 t
是曲线参数(曲线上的点的范围 0..1
)。在 Bernstein 多项式基础中(曲线定义的常用形式):
X(t) = P0.X*(1-t)^3+3*P1.X*(1-t)^2*t+3*P2.X*(1-t)*t^2+P3.X*t^3
Y(t) = P0.Y*(1-t)^3+3*P1.Y*(1-t)^2*t+3*P2.Y*(1-t)*t^2+P3.Y*t^3
具有 Y
值,我们可以找到对应的 t
参数 - 注意 0..1
范围内可能有 0 到 3 个可能的根。 Y 分量在功率基础上的表示:
Y(t) = P0.Y*(1-t)^3+3*P1.Y*(1-t)^2*t+3*P2.Y*(1-t)*t^2+P3.Y*t^3 =
t^3*(P3Y-3P2Y+3P1Y-P0Y) + t^2*(3P2Y-6P1Y+3P0Y) + t^2*(3P1Y-3P0Y) + (P0Y) =
t^3*a + t^2*b + t^2*c + d' = y_position
最后三次方程为:
t^3*a + t^2*b + t^2*c + d = 0
where
a = P3.Y-3*P2.Y+3*P1.Y-P0.Y
b = 3*P2.Y-6*P1.Y+3*P0.Y
c = 3*P1.Y-3*P0.Y
d = P0.Y - y_position
求解cubic equation计算t
(可能是波浪曲线的一些值)
然后对于给定的t
计算相应的X
值:
X(t) = P0.X*(1-t)^3+3*P1.X*(1-t)^2*t+3*P2.X*(1-t)*t^2+P3.X*t^3
假设我有一条贝塞尔曲线,有两个固定端点,一个在 x(0), y(1)
,一个在 x(1), y(0)
(左下角和右上角)
现在假设我有两个控制点,它们可以位于 x(0)、x(1)、y(0) 和 y(1) 之间的任何位置。对于这个问题,我只说控制点 #1 位于 x(0.1) y(0.6),控制点 #2 位于 x(0.9) 和 y(0.4)。 (这假设一个“从左上角”的坐标系)
这是我们曲线的一个小例子:
现在假设我的 y 位置为 0.7。算出对应的 x 位置与 y(0.7) 处的点对应的数学是什么样子的?我该怎么做?
抱歉,如果这个问题不属于这里,但我认为这是编码中面临的一个常见问题,很可能你们中的许多人都有我正在寻找的答案。
您有函数 X(t)
和 Y(t)
的三次方程,其中 t
是曲线参数(曲线上的点的范围 0..1
)。在 Bernstein 多项式基础中(曲线定义的常用形式):
X(t) = P0.X*(1-t)^3+3*P1.X*(1-t)^2*t+3*P2.X*(1-t)*t^2+P3.X*t^3
Y(t) = P0.Y*(1-t)^3+3*P1.Y*(1-t)^2*t+3*P2.Y*(1-t)*t^2+P3.Y*t^3
具有 Y
值,我们可以找到对应的 t
参数 - 注意 0..1
范围内可能有 0 到 3 个可能的根。 Y 分量在功率基础上的表示:
Y(t) = P0.Y*(1-t)^3+3*P1.Y*(1-t)^2*t+3*P2.Y*(1-t)*t^2+P3.Y*t^3 =
t^3*(P3Y-3P2Y+3P1Y-P0Y) + t^2*(3P2Y-6P1Y+3P0Y) + t^2*(3P1Y-3P0Y) + (P0Y) =
t^3*a + t^2*b + t^2*c + d' = y_position
最后三次方程为:
t^3*a + t^2*b + t^2*c + d = 0
where
a = P3.Y-3*P2.Y+3*P1.Y-P0.Y
b = 3*P2.Y-6*P1.Y+3*P0.Y
c = 3*P1.Y-3*P0.Y
d = P0.Y - y_position
求解cubic equation计算t
(可能是波浪曲线的一些值)
然后对于给定的t
计算相应的X
值:
X(t) = P0.X*(1-t)^3+3*P1.X*(1-t)^2*t+3*P2.X*(1-t)*t^2+P3.X*t^3