【问题标题】:Calculate the length of a segment of a quadratic bezier计算二次贝塞尔曲线段的长度
【发布时间】:2012-08-07 22:16:13
【问题描述】:

我使用这个算法来计算二次贝塞尔曲线的长度: http://www.malczak.linuxpl.com/blog/quadratic-bezier-curve-length/

但是,我想做的是计算从 0 到 t 的贝塞尔曲线的长度,其中 0

有没有什么办法可以修改上面链接中使用的公式来获得贝塞尔曲线第一段的长度?

澄清一下,我不是在寻找 q(0) 和 q(t) 之间的距离,而是在这些点之间的弧的长度。

(我不希望使用自适应细分来近似长度)

【问题讨论】:

    标签: math bezier


    【解决方案1】:

    因为我确信对于该变量 t 的情况会存在类似的表单解决方案 - 我扩展了链接中给出的解决方案。

    从链接中的方程式开始:

    我们可以这样写

    b = B/(2A)c = C/A 的位置。

    然后转换u = t + b我们得到

    在哪里k = c - b^2

    现在我们可以使用链接中的积分标识来获得:

    因此,总而言之,所需的步骤是:

    1. 按照原始方程计算 A、B、C。
    2. 计算b = B/(2A)c = C/A
    3. 计算u = t + bk = c -b^2
    4. 将这些值代入上述等式。

    【讨论】:

    • 哎呀,我刚刚意识到我不知道该怎么做,因为 A、B 和 C 不是数字,它们是 2 元组.. :) 但读起来很有趣
    • 我的意思是因为链接被奇怪而意外地删除了..所以现在我一无所知。哈哈
    • 你有没有机会提醒我 A B 和 C 是什么?以防链接保持关闭。 :)
    • 来自谷歌缓存:A=4(a_x^2+a_y^2) B=4(a_x b_x + a_y b_y) C=b_x^2+b_y^2 其中a = P_0 - 2 P_1 + P_2b = 2P_1 - 2 P_0
    • 是的,打错字了,应该是b = B/(2A)。现在解决这个问题。
    【解决方案2】:

    虽然可能存在封闭式表达式,但我会这样做:

    使用De-Casteljau's algorithm 将贝塞尔曲线拆分为 0 到 t 部分,并使用链接中的算法计算其长度。

    【讨论】:

    • 您不需要使用 De-Casteljau 算法来创建跨越 [0,t] 的新曲线。 This post 给出了新曲线的闭式方程。
    【解决方案3】:

    您只需要评估积分,而不是在 0 和 1 之间,而是在 0 和 t 之间。如果你不喜欢数学,你可以使用你选择的符号工具箱来做到这一点。例如:

    http://integrals.wolfram.com/index.jsp?expr=Sqrt\[a*x*x%2Bb*x%2Bc\]&random=false

    计算 x = t 和 x = 0 的结果并将它们相减。

    【讨论】:

      猜你喜欢
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 2016-06-24
      相关资源
      最近更新 更多