【问题标题】:Derivative of a Bezier curve in matrix form矩阵形式的贝塞尔曲线的导数
【发布时间】:2021-03-11 10:43:12
【问题描述】:

我正在处理一些贝塞尔曲线。我直接使用矩阵获得参数位置,不涉及 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.]

这些似乎都没有给我曲线上给定参数的实际导数/切线向量。难道我做错了什么?用与位置相同的逻辑来计算曲线的切线是不可能的吗?

谢谢。

编辑:回复@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. 行取消,但也不起作用

【问题讨论】:

  • 您是否将最后一个基本的二次贝塞尔矩阵应用于差异((p1 - p0) 等)?
  • 我已经在下面的评论中回答了,我不能在这里添加格式。谢谢
  • 最好编辑你的问题而不是回答。
  • 另外 - 系数 5 正确吗? (我没有计算,只是怀疑)
  • 对于您来说,t=0.5 处的数据导数向量是 (150, 0)。您计算中的价值是什么?

标签: python numpy math


【解决方案1】:

所以 MBo 你是对的,我的 LUT 是错的!我想通了,我现在正在使用

 3 0 0
-6 6 0
 3 -6 3

它运行良好!感谢您指出问题所在!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 2012-03-28
    • 1970-01-01
    相关资源
    最近更新 更多