【问题标题】:Length measurement along a B-spline沿 B 样条的长度测量
【发布时间】:2016-04-22 13:39:35
【问题描述】:

我目前正在使用基于唯一 B 样条定义的路径。 B样条由一组控制点和节点值给出。控制点和节点的数量可能会有所不同(并保持一致)。

使用 De Boor 算法,我能够评估曲线上的位置并获得这些位置的切线值。 到目前为止一切顺利。

现在如何测量(/近似)沿 B 样条路径的弧长?

【问题讨论】:

  • 嗨,欢迎来到 Stack Overflow,这只是我发送给新成员的一条消息,以帮助一些事情。新用户的学习曲线并不陡峭,但了解如何使用堆栈并不总是显而易见的。请花几分钟看这里How to Ask,看这里也很重要..minimal reproducible example..此外,如果答案对您有效,请单击答案左侧的勾号,以便该问题被标记为已回答
  • De Boor 使事情变得简单,但除了给出的信息之外,它会省略有关曲线本身的任何信息。如果您确实需要某种分析方法而不是使用 Codor 的答案(这在每个实际应用程序中都可以正常工作),那么您实际上需要计算基函数,然后在每个多项式段上使用解析曲线积分。
  • 是的,您需要计算 |d point(t) / dt| 从 t=t_start 到 t=t_end 的定积分dt
  • 谢谢。实际上,我试图获得比获得参数方程来评估样条信息更容易的东西。这就是我使用 De Boor 算法的原因。我希望找到任何算法的特殊属性以获得良好的近似值。

标签: algorithm spline


【解决方案1】:

在数值上,可以通过沿样条线生成一些等距点,测量它们之间的Euclidean distances 并将这些距离相加来完成。使用的点越多,近似值就越准确。

【讨论】:

  • 我认为它们不需要等距,尽管对于给定的点数,这可能会为您提供最准确的答案。例如。重复挑选欧几里得距离最大的一对相邻点应该足够了,并创建一个参数值在它们之间的新点(TTBOMK这个一般不会放置新点沿曲线与其他两个距离相等)。
  • 确实,我做到了。如果我希望有最小的准确性,那就太重了。 (再次)我希望找到任何算法的特殊属性以获得良好的近似值。
【解决方案2】:

arc-length of a parametric curve

 ⌠₁ ________________
 ⎮ √ dx(t)² + dy(t)² dt
 ⌡₀

或者,它的切线长度在整个曲线上的积分。 对于 t

首先,您需要将 bspline 曲线转换为复合贝塞尔样条曲线。 这是通过插入“结”(Boehm 算法)来完成的 http://www.infogoaround.org/JBook/bstobez.html

对于贝塞尔曲线,我们可以很容易地计算出每个点的切线。 并使用数值积分算法,如Gauss-Legendre quadrature对切线长度进行积分。

这是一个 demo in javasript 使用来自 paper.js 库的代码。

请注意,该算法非常准确(在浮点数学领域,上面的维基百科链接有一个更好的例子)。 由于 N 点 Gauss-Legendre 求积对于 2N-1 次多项式是精确的。 演示中的误差幅度很大程度上是由于圆不能精确地表示为均匀的贝塞尔曲线,所以我们的曲线只是一个近似值。

【讨论】:

  • 非常感谢。听起来不错。我将对此进行消化和测试。我会回来对此作出反应。再次感谢。
  • @hkrish 与问题完全无关:你是如何制作 unicode 公式的?很想在这样的代码 cmets 中呈现方程......
  • @sonovice Python sympy 是一种方法。首先使用from sympy import init_session; init_session() 导入并初始化会话。然后,如果您使用的是 ipython,您只需输入术语 integrate(sqrt(diff(f(t), t)**2 + diff(g(t), t)**2), (t, 0, 1)) 即可在 REPL 中漂亮地打印它。如果没有 ipython,你必须明确地打印它:pretty_print(integrate(sqrt(diff(f(t), t)**2 + diff(g(t), t)**2), (t, 0, 1))) - 我使用了f(t)g(t),因为init_session() 将这些符号预初始化为函数。如有必要,您可以为xy 获取自己的函数符号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
  • 2017-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多