【问题标题】:Nurbs curve (2D) Length & Linear SamplingNurbs 曲线 (2D) 长度和线性采样
【发布时间】:2018-08-22 20:31:20
【问题描述】:

我有一条 Nurbs 曲线(Ctrl Points、Knot Vector、Weights & 3rd or 4th degree)。我可以通过使用参数 t [0, 1] 沿曲线采样来计算长度。计算沿曲线的距离之和可得出曲线的近似长度。

  1. 有没有更好的方法来计算曲线的长度?
  2. 线性采样:我想对曲线进行线性采样,使得第一个样本 t = t0 = 0 到 t = t1 之间的距离是 S1,而 t n-1 到 tn = 1 之间的最后一个样本是 S2 和所有介于两者之间的样本具有从 S1 到 S2 线性插值的长度。

S1 和 S2 是固定的。

【问题讨论】:

    标签: c++ math geometry


    【解决方案1】:

    曲线长度遵循方程

    ds / dt = √(x'²(t) + y'²(t))
    

    其中s 是曲线横坐标,t 是曲线参数,导数取自t

    你愿意做的就是构造函数t(s) 并强加你的s 值。这可以通过编写微分方程来方便地完成

    dt / ds = 1 / √(x'²(t) + y'²(t))
    

    并以数字方式将其集成,例如使用 Runge-Kutta。

    【讨论】:

      【解决方案2】:

      是的。像你一样进行采样,而不是对,通过点的三元组工作,将它们解释为弧通过这三个点。

      在采样点间距相同的情况下,与直线段相比,您将获得更小的近似误差。

      【讨论】:

        【解决方案3】:

        要计算参数化曲线的长度 c(u)=(x(u), y(u)),您可以使用通用公式。

        curvilinear abscissa from wikipedia

        你明确知道 x(u) 和 y(u) 因为

        NURBS from wikipedia

        我相信你有有理基函数的导数公式。因此你有 x'(u) 和 y'(u)。然后,您可以使用辛普森规则进行积分,也可以使用高斯点专门对有理多项式进行积分,或者更好地使用您最喜欢的符号微积分工具(maple、wolfram 等)来精确计算积分。

        【讨论】:

        • 使用 maple / Wolfram 的唯一问题是你得到了结果,但在 C++ 中没有:)
        • 我的意思是使用 maple 或 wolfram 通过符号演算得到具有特定 C(u) 的长度 L 的精确公式,然后重新编码或使用代码转换生成 c++ 代码。
        • 从基函数计算 C(u), C'(u) 在数值上不稳定。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-31
        相关资源
        最近更新 更多