在C#中内插基数曲线

时间:2018-12-08 04:39:13

标签: c# math interpolation gdi+ curve

我需要手动插入基本曲线/样条线-System.Drawing的DrawCurve方法创建的曲线类型。我已经找到了DeCastelJau算法的一个出色的C示例,可以使用贝塞尔曲线进行此操作。可悲的是,我为这种类型的曲线找到的所有示例都是纯数学符号,对我来说也可能是楔形的。

任何人都可以指出我的例子,即用编程语言演示这种曲线的内插(并使所有点都交叉)吗?

编辑:

有人问我一个纯数学方法的例子,这对我来说是陌生的。这是我能找到的最冗长的代码,我想它将为您提供最大的帮助:https://www.sciencedirect.com/science/article/pii/0021904569900409

1 个答案:

答案 0 :(得分:0)

Microsoft主要花键是立方Hermite spline

通过端点P0, P1, m0, m1中的端点和切向量来描述Hermite样条。

对于点集基数样条的插值,给出一阶连续性(相邻样条件的值和切线同步)。为此,需要在第k个点处设置切线

 m(k) = (1-c) * (P(k+1) - P(k-1)) / (t(k+1)-t(k-1))

其中c是张力,P(k)是数据集的第k点,t(k)是用于规范化的参数。有时使用索引(例如,更一般的Kochanek-Bartels样条曲线使用分母2作为索引差),有时使用点之间的累积距离-我怀疑MS可能会使用此方法,依此类推。

因此,您可以在数据集的每个点上计算切线m(k)(不包括起点和终点,这里仅基于单个邻居应用切线)并以Hermite形式(基本)构建样条线。

但是对于Bezier曲线有相当简单的de Casteljau方法-因此我们可以用Bezier形式表示相同的曲线(将基础更改为Bernstein多项式)。引用的Wiki页面显示了一种简单的方法:起点和终点保持不变,贝塞尔曲线的控制点保持不变

p0 (Bezier) = p0 (Hermite)
p3 (Bezier) = p1 (Hermite)
p1(Bezier) = p0(Hermite) + m0/3
p2(Bezier) = p1(Hermite) - m1/3
相关问题