[英]Derivative of a Bezier curve in matrix form
我正在处理一些贝塞尔曲线。 我直接使用矩阵在参数处得到我的 position,不涉及 decasteljau,我觉得它更优雅:
v_t = np.array([1, t, t**2, t**3])
cubic = np.array([
[ 1., 0., 0., 0.],
[-3., 3., 0., 0.],
[ 3., -6., 3., 0.],
[-1., 3., -3., 1.]
])
pos_at_param = np.dot(np.dot(v_t, cubic), control_points)
工作得很好。 但我想使用相同的逻辑计算我的切线
无论我从
(1-t)**3 +
3(1-t)**2t +
3(1-t)t**2 +
t**3
获取所有这些导数,并从中重新创建一个矩阵,
或者从我在网上找到的导数开始
3(1-t)(1-t) * (p1 - p0) +
6t(1-t) * (p2 - p1) +
3tt * (p3 - p2)
给我
[ 3., 0., 0.]
[-6., 6., 0.]
[ 3., -5., 3.]
这些似乎都没有给我在给定参数的曲线上的实际导数/切线向量。 难道我做错了什么? 是否根本不可能使用与 position 相同的逻辑来计算曲线的正切?
谢谢你。
编辑:回答@MBo:是的,虽然不确定我是否正确应用它。 一旦我推导,我就失去了 1 个点,所以我不确定如何处理 4 个点。 我试过这个:
LUT = np.array([
[3., 0., 0.],
[-6.,6., 0.],
[3.,-5., 3.],
])
t = 0.5
v_params = np.array([1, t, t**2])
P0 = np.array([0., 40., 0.])
P1 = np.array([0., 80., 0.])
P2 = np.array([100., 80., 0.])
P3 = np.array([100., 40., 0.])
points = np.array([
P1-P0,
P2-P1,
P3-P2
])
out = np.dot(np.dot(v_params, LUT), points)
out /= np.linalg.norm(out)
但在 0.5 之后不起作用
也尝试过 4d
LUT = np.array([
[3., 0., 0., 0.],
[-6.,6., 0., 0.],
[3.,-5., 3., 0.],
[0., 0., 0., 0.]
])
v_params = np.array([1, t, t**2, t**3])
假设 t^3 将被我的最后 0. 行取消,但也不起作用
所以MBo你是对的,我的LUT错了,我想通了,我现在正在使用
3 0 0
-6 6 0
3 -6 3
它运行良好! 感谢您指出问题所在!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.