在 C# 中插入基数曲线

Interpolating a cardinal curve in C#

我需要手动插入基数 curve/spline - System.Drawing 的 DrawCurve 方法创建的曲线类型。我找到了 DeCastelJau 算法的一个很棒的 C 示例来使用贝塞尔曲线来执行此操作。可悲的是,我找到的所有此类曲线的示例都是纯数学符号,对我来说也可能是楔形文字。

任何人都可以给我一个插值示例(并且所有点都穿过)这种曲线,用编程语言演示,这是我知道如何阅读的?

编辑:

我被要求举一个纯数学方法的例子,这对我来说是陌生的。这是我能找到的最冗长的一个,我想它会给你最有用的东西:https://www.sciencedirect.com/science/article/pii/0021904569900409

Microsoft 基数样条是一种立方体 Hermite spline

Hermite 样条由端点和这些点中的切向量描述 P0, P1, m0, m1

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

处设置切线
 m(k) = (1-c) * (P(k+1) - P(k-1)) / (t(k+1)-t(k-1))

其中 c 是张力,P(k) 是数据集的第 k 个点,t(k) 是标准化的一些参数。有时会使用索引(c.f。更一般的 Kochanek-Bartels 样条使用分母 2 作为索引差),有时会使用点之间的累积距离 - 我怀疑 MS 可能会使用这种方法等等。

因此您可以计算数据集每个点的切线 m(k)(不包括开始点和结束点 - 这里仅应用基于单个邻居的切线)并以 Hermite 形式(基础)构建样条曲线。

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

p0 (Bezier) = p0 (Hermite)
p3 (Bezier) = p1 (Hermite)
p1(Bezier) = p0(Hermite) + m0/3
p2(Bezier) = p1(Hermite) - m1/3