C# 用C插值基数曲线#

C# 用C插值基数曲线#,c#,math,interpolation,gdi+,curve,C#,Math,Interpolation,Gdi+,Curve,我需要手动插值基数曲线/样条曲线-由System.Drawing的DrawCurve方法创建的曲线类型。我发现了一个很好的用beziers实现的DeCastelJau算法的C示例。不幸的是,我发现的所有关于这种曲线的例子都是纯数学符号,对我来说,这也可能是楔形文字 有人能给我举一个例子,用编程语言演示插值(所有的点都相交)这类曲线,这就是我所知道的阅读方法吗 编辑: 我被要求提供一个纯数学方法的例子,这对我来说是陌生的。这是我能找到的最详细的一个,我想这会给你带来最多的帮助:微软的基数样条曲线是

我需要手动插值基数曲线/样条曲线-由System.Drawing的DrawCurve方法创建的曲线类型。我发现了一个很好的用beziers实现的DeCastelJau算法的C示例。不幸的是,我发现的所有关于这种曲线的例子都是纯数学符号,对我来说,这也可能是楔形文字

有人能给我举一个例子,用编程语言演示插值(所有的点都相交)这类曲线,这就是我所知道的阅读方法吗

编辑:


我被要求提供一个纯数学方法的例子,这对我来说是陌生的。这是我能找到的最详细的一个,我想这会给你带来最多的帮助:

微软的基数样条曲线是一种三次曲线

Hermite样条曲线由端点和这些点的切线向量描述
P0、P1、m0、m1

对于点集的插值,基数样条线提供一阶连续性(相邻样条线的值和切线是同步的)。要实现这一点,需要在
k
-th点设置切线

 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方法——因此我们可以用贝塞尔形式表示相同的曲线(将基变换为Bernstein多项式)。引用的wiki页面显示了一个简单的方法:起点和终点保持不变,贝塞尔的控制点保持不变

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

请包括参考链接,以便我们理解您一直在看的内容。@Aldert-您是指曲线类型的示例,还是我无法理解的数学符号的示例?您无法理解所有交叉点的数学含义是什么?无限,全x,全y,还是只是很多?(对于后者,创建并展平图形。)@TaW-好吧,DeCastelJau总是给你1000个坐标点。我对此很满意,因为从那时起,它们都会产生一个可预测的范围。我曾试图让graphicspath放弃它的观点,但显然现代网络不会这样做?这实际上清除了很多东西。非常感谢你。