在 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
我需要手动插入基数 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