7

所以我有一组特殊情况的三次样条曲线,它的二维控制点总是会产生一条永远不会在x轴上交叉的曲线。也就是说,这些曲线看起来像是一个简单的多项式函数,使得y = f ( x )。我想有效地创建一个沿样条线的y坐标数组,这些坐标对应于沿样条线段长度的均匀间隔的 x 坐标。

我想有效地找到沿样条线的 y 坐标,例如,x =0.0、x =0.1、x =0.2 等,或者以另一种方式接近,有效地将f x,y ( t ) 样式函数转换为f ( x ) 函数。

我目前正在使用 4x4 常数矩阵和四个 2d 控制点来描述样条,使用 Hermite 或 Catmull-Rom 样条的矩阵常数,并将它们插入t从 0 到 1 的三次函数。

给定矩阵和控制点,在 x 轴上获得这些 y 值的最佳方法是什么?

编辑:我应该补充一点,足以绘制的近似值就足够了。

4

3 回答 3

3

如果数值近似足够好,人们通常会使用求根技术(如牛顿法)。

于 2012-07-17T21:25:37.600 回答
2

好吧,你可以解决你的f x ( t )= x for t。那将是一个三次方程;丑陋但仍然可以明确解决。如果您的样条曲线如您所描述的那样,那么其中两个解决方案将是共轭复数,因此唯一剩下的就是要采用的解决方案。用它来计算y = f y ( t )。如果您想要确切的解决方案,我怀疑您是否可以更轻松地完成任何事情。

您可以使用Wikipedia 中的通用公式来计算三次方程的解。

于 2012-07-17T08:21:37.360 回答
2

您的问题表明您想要均匀的空间x坐标,并且近似解是可以的。所以我提出以下算法:

  • 确定您想要的网格点,例如每 0.1 x单位一个。
  • l = 0 和r = 1 开始。
  • 计算f x ( l ) 和f x ( r ) 并考虑这些端点表示的区间。
    • 如果间隔足够小并且恰好包含一个网格点,则使用中心参数t =( l + r )/2 作为该网格点的良好近似值,并将其作为单元素列表返回。
    • 如果在该间隔中至少有一个网格点,则使用 ( l + r )/2 作为分割点将其一分为二,并将两个计算的结果列表连接起来。
    • 如果区间内没有网格点,则跳过计算的当前分支,返回一个空列表。

这将放大网格点,将每个步骤中的参数空间一分为二,并为所有网格点提供合适的参数。

于 2012-07-19T08:37:56.233 回答