Math 将二维样条函数f(t)变换为f(x)

Math 将二维样条函数f(t)变换为f(x),math,graphics,geometry,polynomial-math,spline,Math,Graphics,Geometry,Polynomial Math,Spline,所以我有一个三次样条曲线的特例集,它的2d控制点总是会产生一条曲线,它永远不会在x轴上自交。也就是说,曲线看起来像是一个简单的多项式函数,y=f(x)。我想沿着样条线高效地创建一个y坐标数组,该数组对应于沿样条线线段长度均匀分布的x坐标 我想沿着样条线有效地找到y坐标,例如,x=0.0,x=0.1,x=0.2,等等,或者以另一种方式,有效地将fx,y(t)样式函数转换为f(x)函数 我目前正在使用4x4常数矩阵和四个2d控制点来描述样条曲线,使用Hermite或Catmull Rom样条曲线的矩

所以我有一个三次样条曲线的特例集,它的2d控制点总是会产生一条曲线,它永远不会在x轴上自交。也就是说,曲线看起来像是一个简单的多项式函数,y=f(x)。我想沿着样条线高效地创建一个y坐标数组,该数组对应于沿样条线线段长度均匀分布的x坐标

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

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

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


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

好吧,你可以解出你的fx(t)=x代表t。那将是一个三次方程式;丑陋但仍然可以明确地解决。如果样条曲线和你描述的一样,那么其中两个解将是共轭复的,所以剩下的唯一一个就是要取的解。用它来计算y=fy(t)。如果你想要精确的解决方案,我怀疑你能做得更容易些


您可以使用来计算立方方程的解。

如果数值近似足够好,人们通常会使用一种技术(例如)。

您的问题说明您需要均匀的空间x坐标,近似解是可以的。因此,我提出以下算法:

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

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

谢谢,这很有帮助。事实上,我看了t的解决方案,它们非常难看。当然比我想大量计算的任何东西都要难看。我补充说,近似值(适用于将曲线绘制为f(x)函数)就足够了。@vercellop,我发布了一个链接,它为您提供了一个求解三次方程的公式。到目前为止,我发现的最简单的方法就是以t的规则间隔从曲线上采样点,然后沿x轴在这些值之间插值以收集f(x)值。大多数时候这看起来还可以,但偶尔会忽略细节,因为很难知道尖角在哪里;增加采样频率会有所帮助,但并不完全有效,也不令人满意。我相信有一种聪明的方法既能提高计算效率,又不会丢失细节。@vervellop,对于经过编辑的问题,您当前的方法可能是最好的答案,因此我建议您将其作为答案发布,这样,如果没有更好的结果,您最终可以接受它。如果用户认为它是解决这个问题的一个好的/合适的解决方案,你可以投票赞成。在你的问题中可能存在一个矛盾:原始问题要求均匀间隔的X坐标,而编辑需要一个适合绘图的解决方案。如果存在明显的尖点,则均匀间隔的采样可能无法捕获这些尖点。所以我建议你把问题保持原样,因为这就是答案所指的。您可能想问一个关于绘图问题的新问题,最好详细说明您试图实现的目标,即为什么仅仅绘制2D样条线是不够的。啊,是的,澄清一下:此模块的输出是等距x坐标的y位置列表(很像连续信号的振幅采样)。这里的目标是生成这些f(x)点,因为我们不绘制。显然,使用这种方法,任何比“采样频率”更精细的细节都会丢失-这没关系。它们的质量只需“足以绘制”,但不应遗漏曲线的任何重要特征。理想情况下,只需对曲线求值不超过N次即可生成N个点(但越少越好)。这是一种二分法(),是许多寻根方法之一。查看维基百科,了解算法的优缺点,这些算法对类似问题的效果可能更好(或更差)。