我们希望由
y
定义的二次曲线与由
B(t)
定义的二次贝塞尔曲线匹配。
必须匹配的众多点中,其中一个是在x = 0.5
处发生的峰值。当x = 0.5
时,
y = (100 * x / 2) * (1 - x)
100 1 25
y =
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的可视化确认,证明我们已经找到了正确的点:
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
,我们可以看到两条曲线重叠:
当B(t)
达到最大高度时,我如何知道要选择t = 0.5
作为参数值?
这主要是基于直觉,但以下是一种更正式的证明方法:
当B(t)
达到最大高度时,B'(t)
的y分量等于0。因此,对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 时达到最大高度。