检测到屏幕外的曲线
贝塞尔曲线实际上只是多项式方程。有multiple types of Bezier curves,对应曲线的不同度数。
所以,只取生成的方程(一个代表x,一个代表y),然后找到根(它们通过0的点)时间>。如果根存在,则曲线通过轴。
例如,对于二次(度数=2)贝塞尔曲线,给定我们的三个点(x0, y0),(x1, y1), (x2, y2) equations 是
x(t) = (x
0 - 2x
1 + x
2)t
2 - 2(x0 + x
1)t + x
0
y(t) = (y
0 - 2y
1 + y
2)t
2 - 2(y0 + y
1)t + y
0
0
此时,我们可以使用quadratic formula 来解决t,并检查解决方案是否不存在或者在[0,1] 的域之外以解决t。但是,还有另一种方法可以推广三次贝塞尔曲线,而无需触及复杂的 cubic formula - 只需检查极值点即可。这些是导数 = 0 的点。因为导数是
x'(t) = 2(x
0 - 2x
1 + x
2)t - 2(x
0 + x
1)
y'(t) = 2(y
0 - 2y
1 + y
2)t - 2(y
0 + y
1)
这意味着极值在
t
extrema-x = (x
0 + x
1) / (x
0 - 2x
1 + x
2)
t
extrema-y = (y
0 + y
1) / (y
0 - 2y
1 + y
2)
因此,只需检查 x(textrema-x) > 0 和 y(textrema-y) > 0 (我们假设端点x0 和 x2 已知在屏幕上,即 > 0)。对于三次贝塞尔曲线,做同样的事情,但使用二次公式求解极值(在这种情况下,x 和 y 各有两个极值)。 p>
防止曲线离开屏幕
如果我们通过将上面的方程用于 textrema-x 并将其代入 x(t) 来求解 x(textrema-x) > 0,我们经过一些代数后发现,为了防止越过 x 轴,我们需要
-4x
0x
1 + x
0x
2 - x
12 > 0 if (x
0 + x
2) > 2x
1
-4x
0x
1 + x
0x
2 - x
120 + x
2) 1
(if (x0 + x2) = 2x1,我们从 x0 线性移动 到 x2 所以,假设两者都是正数,我们不能穿过 x 轴)
稍微看一下这些方程应该会让你相信如果 (x0 + x2) > 2x1,我们可以简单地减小 x1 直到满足左侧条件;如果 (x0 + x2) 1,我们可以简单地增加 x1 直到满足条件满足。 y 的等式是类似的。
这告诉我们如何防止曲线偏离屏幕的左侧 (x=0) 和顶部 (y=0) 部分 - 那么右边(x=screen_width)和底部(y=screen_height)?
我们可以通过想象我们将屏幕翻转到它的镜像来轻松做到这一点,这样右侧是x=0,左侧是x=screen_width。这可以通过在上述所有等式中将x 的每个实例替换为(screen_width-x) 并检查我们的条件来完成。然后,例如,之前在第一种情况下,我们要减小 x1,在这种情况下,我们想要减小 (screen_width-x1),即与增加 x1 相同。用(screen_height-y) 替换y 也是同样的逻辑。