我们希望由 定义的二次曲线与 定义y
的二次贝塞尔曲线相匹配B(t)
。
在许多必须匹配的点中,有一个峰值出现在x =
0.5
。当x = 0.5
,
y = (100 * x / 2) * (1 - x)
100 1 25
y = ---- * --- = ---- = 12.5
4 2 2
因此,让我们安排B(0.5) = (0.5, 12.5)
:
B(t) = (1-t)^2*(0,0) + 2*(1-t)*t*(Px, Py) + t^2*(1,0)
(0.5, 12.5) = B(0.5) = (0,0) + 2*(0.5)*(0.5)*(Px, Py) + (0.25)*(1,0)
0.5 = 0.5 * Px + 0.25
12.5 = 0.5 * Py
求解Px
和Py
,我们得到
(Px, Py) = (0.5, 25)
这是我们找到正确点的视觉确认(在 Python 中):
# test.py
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 1, 100)
y = (100*x/2)*(1-x)
t = np.linspace(0, 1, 100)
P0 = np.array([0,0])
P1 = np.array([0.5,25])
P2 = np.array([1,0])
B = ((1-t)**2)[:,np.newaxis]*P0 + 2*((1-t)*t)[:,np.newaxis]*P1 + (t**2)[:,np.newaxis]*P2
plt.plot(x, y)
plt.plot(B[:,0], B[:,1])
plt.show()
运行python test.py
,我们看到两条曲线重叠:
我怎么知道在达到最大高度t = 0.5
时选择作为参数值?B(t)
嗯,它主要是基于直觉,但这里有一种更正式的方式来证明它:
的 y 分量在达到其最大高度B'(t)
时等于 0 。B(t)
所以,取 的导数B(t)
,我们看到
0 = 2*(1-2t)*Py
t = 0.5 or Py = 0
如果 Py = 0,则 B(t) 是从 (0,0) 到 (1,0) 的水平线。拒绝这种退化的情况,我们看到B(t)
在 时达到了它的最大高度t = 0.5
。